- posted
18 years ago
8051 i interrupt 1
- Vote on answer
- posted
18 years ago
Lukas snipped-for-privacy@spam.com napisał(a): .. Jakiego kompilatora używasz ???
> int obsluga(void) interrupt 3 using 1Nie 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 = ;)
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago
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 ;)
- Vote on answer
- posted
18 years ago
Zapomniałem wstawić pustej pętli na końcu "main" ;-)
Piotrek
- Vote on answer
- posted
18 years ago
Piotrek Sz. snipped-for-privacy@gazeta.pl napisał(a):
I zamiast TCON ma być TMOD. Mea culpa ;) P
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago
- Vote on answer
- posted
18 years ago