pisalem posta ju¿, ale mo¿e siê przypomne, bo siedze nad tym ju¿ kilka dni i nie mam ¿adnego pomys³u jak to zrobiæ, ¿eby dzia³a³ który kolwiek z liczników i przerwañ (1 lub/i 3) w wyniku przepe³nienia jednego z licznika. Niech mnie mo¿e kto¶ u¶wiadomi jak powinien wygl±daæ dzia³aj±cy kod, który dzia³a z przerwaniami. Chyba, ¿e to dzia³a a mam walnietego procka. Pisa³em program który sprawdza³ stan przepe³nienia licznika, tj sprawdza³em warto¶æ TF0 i ustawia³em jak±¶ liczbê na którym¶ wy¶wietlaczu i wychodzi³o na to, ¿e siê zapala³a, czyli znaczy ¿e siê przepe³nia i powinno zadzia³aæ przeranie a nie dzia³a. Mo¿e o czym¶ zapominam co trzeba ustawiæ?
Prosze pomó¿cie bo naprawde nie mam pomys³a na cokolwiek :( Pod spodem wklei³em kod zmodyfikowany ju¿ chyba milion razy.
#include "8051.h"
//adresy pod ktorymi jest wyswietlacz LED xdata at 0x4000 unsigned char liczba; xdata at 0x4001 unsigned char wyswietlacz;
//definicje liczb #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
char tab[11]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,kr}; unsigned char zn,cnt;
void obsluga(void) interrupt 1; //obsluga int T0 void obslug2(void) interrupt 3; //obsluga int T1
void main(void) { cnt = 0; //ustawiam wstepnie wyswietlacz zn = 0; //ustawiam liczbe TMOD = 17; //T0 i T1 16bit
//ustwaiam liczniki T1 i T0 TH1 = 0x80; TL1 = 0; TH0 = 0; TL0 = 0; //***
ET1 = ET0 = EA = 1; //ustawiam ogolne oraz T1 i T0 zezwolenie na przerwanie TR1 = 1; // 1 startuje licznik T1 - 0 zatrzymuje TR0 = 0; // 1 startuje licznik T0 - 0 zatrzymuje
while(1) //zapetlam dzialanie programu w nieskonczonosc { wyswietlacz = cnt; //ktory wyswietlacz LED aktywny liczba = tab[zn]; //jaka cyfre wyswietlic liczba = 0; //zgas liczbe
} }
void obsluga(void) interrupt 1 {
TR0 = 0; //zatrzymaj licznik T0 TH0 = 0; //ustawiam licznik starsze bity TL0 = 0; //ustawiam licznik mlodsze bity zn++; //zmien wskazanie na nastepna liczbe if (zn>9) zn=0; //jesli ma przekroczyc tab to zn 0 TR0 = 1; //wystartuj licznik
}
void obslug2(void) interrupt 3 { TR1 = 0; //zatrzymuje licznik T1 cnt++; //zmieniam nr wyswietlazca na ktorym bedzie //wyswietlona liczba TH1 = 0x80; //ustawiam licznik TL1 = 0; //ustawiam licznik TR1 = 1; //wlaczam licznik }