www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

16F877 in UART
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Čet Maj 19, 2011 8:13 pm    Naslov sporočila:   Odgovori s citatom

ljudsko je napisal/a:
Lahko bi dal v getche() to, kar je v getch() in bi prihranil čas.

Točno zaradi tega sem napisal, da je getche() nepotreben.

drVrh: tole kaj sem napisal je nek principielni kvazi C, ki ga moraš prilagodit svojemu prevajalniku....
Prekinitve so ena od stvari, ki jih C v bistvu ne definira, zato je to v vsakem prevajalniku malo po svoje narejeno. Tule ti ne preostane drgugega, kot RTFM.

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
ljudsko
Član
Član



Pridružen-a: Pon 31 Mar 2008 8:19
Prispevkov: 1184
Aktiv.: 5.39
Kraj: Koroška-Mežica

PrispevekObjavljeno: Čet Maj 19, 2011 10:37 pm    Naslov sporočila:   Odgovori s citatom

gumby je napisal/a:
Točno zaradi tega sem napisal, da je getche() nepotreben.


Še vedno narobe. Če uporabljaš gets(), je obvezna getche(), katero gets() kliče. Nepotrebna je potemtakem getch(), katere vsebina se lahko prepiše v getche() Wink

_________________
return;
brake;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.15
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Pet Maj 20, 2011 7:57 am    Naslov sporočila:   Odgovori s citatom

Ok, torej je tisto, samo psevdokod. Very Happy Confused
_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.15
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Ned Maj 22, 2011 12:23 pm    Naslov sporočila:   Odgovori s citatom

Sedaj sem kodo sestavil tako:


Koda:


unsigned char buffer[64];
int index = 0;

void interrupt rx(void)
{
   if((RCIE)&&(RCIF))
   {
      if(OERR){             // If overun-error has occured                 
         CREN=0;        // Re-enable receiving           
         CREN=1;     
           } 
      
      char r = RCREG;
      buffer[index] = r;     //Place received byte in buffer
      index++;       //Increment index
   
   }
}

....

unsigned char getch ()
{
   for(int i; i <= index-1; i++)
   {
      return(buffer[i]);
   }   
}


Zgleda da mu nič ne prileti v buffer?! Ker se mi na LCD nič ne izpiše, to je pa ta del:

Koda:
   while(1)
   {   
      s=getch();
      //s=0;
      if(s != 0)
      {            
         lcd_puts(s);      
      }
   }

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Ned Maj 22, 2011 12:53 pm    Naslov sporočila:   Odgovori s citatom

1. "if((RCIE)&&(RCIF))" nekako nima smisla preverjat, ker tole mora bit izpoljeno, da se prekinitev sploh izvede.
2. index definiraj kot volatile
3. i (kazalec na zadnji prebran znak v bufferju) definiraj kot globalno spremenljivko ali kot static znotraj funkcije, kjer jo uporabljaš. Pa ne pozabi na inicializacijo.
4. getch() popravi... for zanka tam nima kaj iskat. Preverjaš samo, če sta oba indeksa enaka ali ne. Če nista, pomani da je prejet znak (ali več njih) v bufferju.

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.15
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Ned Maj 22, 2011 1:23 pm    Naslov sporočila:   Odgovori s citatom

Kateri i misliš? Tisti ki ga imam v for zanki?

Torej for zanko prestavim v main program? In v for zanki kličem getch funkcijo?

Samo ni mi pa jasno kaj naj napišem v getch funkcijo?

Koda:
unsigned char getch ()
{
  // wait until data available
  while (!RCIF);
  return(RCREG);   
}

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.01
Kraj: Yogyakarta

PrispevekObjavljeno: Ned Maj 22, 2011 2:48 pm    Naslov sporočila:   Odgovori s citatom

getch spoh ne rabiš v interruptu
zakompiciral si pa tudi

Koda:

#define MAXBUF 64
unsigned char buffer[MAXBUF];
int head = 0;
int tail = 0;

void interrupt rx(void)
{
   if((RCIF))
   {

      RCIF = 0;   //! to moraš obvezno programsko resetirat!!!!!

      if(OERR){             // If overun-error has occured                 
         CREN=0;        // Re-enable receiving           
         CREN=1;     
           } 
       
      buffer[head++] = RCREG;     //Place received byte in buffer
      if (head >= MAXBUF)
          head = 0;
   
   }
}

unsigned char charAvail()
{
    return(head != tail);
}

unsigned char getch ()
{
 
   unsigned char buf;

    buf = buffer[ tail++ ];

    if( tail >= MAXBUF)   
            tail = 0;

    return( buf );
}


while(1)
   {   
     
     while (charAvail())
     {
         s = getch();
         lcd_puts(s);       
      }
   }

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.15
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Ned Maj 22, 2011 3:19 pm    Naslov sporočila:   Odgovori s citatom

LP

Hvala, toda ne razumem te funkcije:

Koda:
unsigned char charAvail()
{
    return(head != tail);
}


Ob tej mi vrže ven error:

Koda:
conflicting declarations for variable "_charAvail"

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.01
Kraj: Yogyakarta

PrispevekObjavljeno: Ned Maj 22, 2011 7:55 pm    Naslov sporočila:   Odgovori s citatom

a ok, verjetno bi moral dati int funkciji namesto unsigned char

drugače pa lahko tudi

Koda:

if head!=tail
 return 1;
return 0;


p.s. Funkcija vrne true če imaš znake v buferju; kadar se head in tail razlikujeta.
drugače vrne 0 in "zanka" čaka na sprejete znake v interruptu.

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.15
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Ned Maj 22, 2011 9:32 pm    Naslov sporočila:   Odgovori s citatom

Nima učinka, debugger mi javi brez napak, toda na zaslonu ni nič.
_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Ned Maj 22, 2011 10:05 pm    Naslov sporočila:   Odgovori s citatom

Prekinitve si vklopil?
RCIE, PEIE, GIE?

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.01
Kraj: Yogyakarta

PrispevekObjavljeno: Ned Maj 22, 2011 10:22 pm    Naslov sporočila:   Odgovori s citatom

gumby je napisal/a:
Prekinitve si vklopil?
RCIE, PEIE, GIE?


jaz ni rekel da ne,

pa ne vem ali ima interupt prioritete tvoj uC. Da ti ne skače v low priority interupt obravnavaš pa kot high priority v kodi (ali obratno)


če uporabljaš MPLAB in ICD2 lahko to elo lepo hardwearsko po debugiraš. Nastavi breake point v interuptu in poženi program pa boš videl ali je problem kot je gumby rekel da se int. sploh ne sproži ali je problem kje drugje.

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Pon Maj 23, 2011 8:20 am    Naslov sporočila:   Odgovori s citatom

V prekinitvi postavi kak pin na 1 in nanj veži ledico... boš hitro ugotovil, če se aktivira...
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.15
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Pon Maj 23, 2011 12:31 pm    Naslov sporočila:   Odgovori s citatom

drVrh je napisal/a:
Nima učinka, compiler mi javi brez napak, toda na zaslonu ni nič.


Jaz uporabljam ICD2Clone ki je sprogramiran tako da ga ne morem uporabljati kot debugger. Zaradi tistih fuse bitov da se lahko izvleče usb kabel iz računalnika pa ne pobere programa na 18F4550.

Za moje vezje uporabljam PIC16F877, zdaj pa ne vem kakšni so tile interrupti o katerih si govoril? O teh prioritetah.

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.01
Kraj: Yogyakarta

PrispevekObjavljeno: Pon Maj 23, 2011 2:05 pm    Naslov sporočila:   Odgovori s citatom

Kot kaže Imaš low in high ja

http://www.microcontrollerboard.com/pic_interrupt.html


drugače pa poglej tudi v datasheet

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
Stran 2 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 232 dni


Powered by phpBB © 2001, 2005 phpBB Group