| Poglej prejšnjo temo :: Poglej naslednjo temo |
| Avtor |
Sporočilo |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Čet Maj 19, 2011 8:13 pm Naslov sporočila: |
|
|
| 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 |
|
 |
ljudsko Član


Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 5.39 Kraj: Koroška-Mežica
|
Objavljeno: Čet Maj 19, 2011 10:37 pm Naslov sporočila: |
|
|
| 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()  _________________ return;
brake; |
|
| Nazaj na vrh |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.15 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Pet Maj 20, 2011 7:57 am Naslov sporočila: |
|
|
Ok, torej je tisto, samo psevdokod.  _________________ 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 |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.15 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Ned Maj 22, 2011 12:23 pm Naslov sporočila: |
|
|
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 |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Ned Maj 22, 2011 12:53 pm Naslov sporočila: |
|
|
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 |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.15 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Ned Maj 22, 2011 1:23 pm Naslov sporočila: |
|
|
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 |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.01 Kraj: Yogyakarta
|
Objavljeno: Ned Maj 22, 2011 2:48 pm Naslov sporočila: |
|
|
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 |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.15 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Ned Maj 22, 2011 3:19 pm Naslov sporočila: |
|
|
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 |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.01 Kraj: Yogyakarta
|
Objavljeno: Ned Maj 22, 2011 7:55 pm Naslov sporočila: |
|
|
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 |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.15 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Ned Maj 22, 2011 9:32 pm Naslov sporočila: |
|
|
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 |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Ned Maj 22, 2011 10:05 pm Naslov sporočila: |
|
|
Prekinitve si vklopil?
RCIE, PEIE, GIE? _________________ Tule nisem več aktiven. |
|
| Nazaj na vrh |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.01 Kraj: Yogyakarta
|
Objavljeno: Ned Maj 22, 2011 10:22 pm Naslov sporočila: |
|
|
| 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 |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Pon Maj 23, 2011 8:20 am Naslov sporočila: |
|
|
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 |
|
 |
drVrh Član



Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.15 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Pon Maj 23, 2011 12:31 pm Naslov sporočila: |
|
|
| 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 |
|
 |
red_mamba Član


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