8051 i interrupt 1

Loading thread data ...

Lukas snipped-for-privacy@spam.com napisał(a): .. Jakiego kompilatora używasz ???

> int obsluga(void) interrupt 3 using 1

Nie wiem co to dokładnie znaczy ale wektor przerwania dla T0 to interrupt 1 (SDCC)

> liczba = c1; > liczba = 0; A co ma znaczyć powyższe ??? > TR0 = 0; > TH0 = 0; > TL0 = 0x80;

W trybie "0" T0 pracuje tylko 5 bitów. .. > TL0 = 0x80; //ustawiam wartość od której liczy j/w .. > TMOD = 32;

Tryb "0" T0 i tryb 2 T1

> ES = 1; > EA = 0x01; > TR0 = 1; > dlaczego to niedziala, a kokretnie przerwanie wygenerowane przez > przepełnienie timera T0? > no juz probowalem wielu kombinacji, ale moze gdzies robie glupi blad :/ > > Sprawdź powyższe komentarze.

Pozdrawiam Piotrek

Dlaczego nie używasz OR i AND tylko wkółko = ;)

Reply to
Piotrek Sz.

Lukas snipped-for-privacy@spam.com napisał(a):

Źle mnie zrozumiałeś ;) Nie masz używać bezkrytycznie OR i AND tylko tam gdzie powinieneś.

Gdy chcesz ustawić jakiś bit w rejestrze , a jest on adresowany bitowo to używasz przypisania(EA=0) , natomiast gdy chcesz ustawić/skasować jakiś bit w rejestrze , w którym bitów nie można zaadresować bitowo to używasz OR lub AND TCON |=T0_M0(ustaw bit M0) TCON &=~T0_M0(skasuj bit M0) Spróbuj tego: #include "8051.h"

xdata at 0x4000 unsigned char liczba; xdata at 0x4001 unsigned char wyswietlacz;

#define c0 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 #define c1 0x02 | 0x04 #define c2 0x01 | 0x02 | 0x40 | 0x10 | 0x08 #define c3 0x01 | 0x02 | 0x40 | 0x04 | 0x08 #define c4 0x20 | 0x40 | 0x02 | 0x04 #define c5 0x01 | 0x20 | 0x40 | 0x04 | 0x08 #define c6 0x01 | 0x20 | 0x40 | 0x04 | 0x08 | 0x10 #define c7 0x01 | 0x02 | 0x04 #define c8 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 #define c9 0x01 | 0x20 | 0x40 | 0x02 | 0x04 | 0x08 | 0x047 #define kr 0x80

volatile char tab[11]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,kr}; volatile unsigned char zn,cnt; char z[2]={48,50};

void obsluga(void) interrupt 1 { cnt++; if(cnt==10) //co dziesiate przerwanie wyswietl kolejny znak { liczba = tab[zn++]; //zaladuj dane ro rejestru segmentow zn &= 0x07; //w kolko "przewijane" od 0 do 7 cnt = 0; } }

void main(void) { zn = 0; //niekoniecznie bo procedura startowa zeruje wewnetrzny RAM TMOD |= T0_M0 ;//ustaw bit M0 nie ruszajac pozostalych ET0 = EA = TR0 = 1; //zezwol na przerwanie od T0 , zezwol na przerwania globalnie i uruchom T0 wyswietlacz = 0; //wlacz wyswietlacz nr.0 czy jak tam masz ;)

} Pozdrawiam Piotrek

PS Architekturę procka powinieneś znać na TipTop ;)

Reply to
Piotrek Sz.

Zapomniałem wstawić pustej pętli na końcu "main" ;-)

Piotrek

Reply to
Piotrek Sz.

Piotrek Sz. snipped-for-privacy@gazeta.pl napisał(a):

I zamiast TCON ma być TMOD. Mea culpa ;) P

Reply to
Piotrek Sz.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.