8051 i interrupt 1

Jul 22, 2005 10 Replies

#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



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



void petla(int op) { unsigned int i; for (i=0;i<op;i++){} }



int obsluga(void) interrupt 3 using 1 {



zn++; wyswietlacz = 1; liczba = c1; liczba = 0; TR0 = 0; TH0 = 0; TL0 = 0x80; TR0 = 1; return 0; }


void main(void) {



SCON = 80; TH1 = TL1 = 253; //19200 TR0 = 0; //wy³±czam timer TH0 = 0; TL0 = 0x80; //ustawiam warto¶æ od której liczy TI = 0; RI = 0; PCON = 128; ET0 = 0x01; IE = 130; TMOD = 32; ES = 1; EA = 0x01; TR0 = 1;


//szeregowe z³±cze SCON = 0x40;



zn=49; for (;;) { petla(100); SBUF=zn; TI=0; if (zn==55)zn=49; }



}


dlaczego to niedziala, a kokretnie przerwanie wygenerowane przez przepe³nienie timera T0? no juz probowalem wielu kombinacji, ale moze gdzies robie glupi blad :/



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

&gt; int obsluga(void) interrupt 3 using 1

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

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

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

Tryb "0" T0 i tryb 2 T1

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

Pozdrawiam Piotrek

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

U¿ytkownik "Piotrek Sz." snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:dbqt81$nql$ snipped-for-privacy@inews.gazeta.pl...

:) no bo pisze na 51ke niedlugo i nie bardzo wiem ze tak mzona no i jak tego uzywac a uzywam sdcc, czy moze byc cos z nim nie tak?

U¿ytkownik "Lukas" snipped-for-privacy@spam.com napisa³ w wiadomo¶ci news:dbr26f$khu$ snipped-for-privacy@nemesis.news.tpi.pl...

zanczy dokladnie tu jest interrupt 1 sprawdzalem czy bedzie dzialac przy przesylaniu przez seriala

tak tak zgadzam sie jak wyzej napsialem

pod adres 4000 i 4001 mam podpiety wyswietlacz iw wybieram tu ktory i jaka cyfra

tak wiem dokladnie 13 bitow w trybie 1 16 bit

hm....

ok przerobilem to tak jak nizej ale wciaz to nie dziala :/ wrrr

#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

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

void petla(int op) { unsigned int i; for (i=0;i<op;i++){} }

int obsluga(void) interrupt 1 {

ET0 & 0;

zn++;

//timer TH0 & 0; TL0 & 0; ET0 | 1; TR0 | 1;

//--- return 0; }

void main(void) { TCON & 0;

SCON = 80; TH1 = TL1 = 253; //19200 TR0 & 0; //wy³±czam timer TI & 0; RI & 0; PCON = 128; //szeregowe z³±cze SCON = 0x40;

TMOD = 32; //tryb pracy licznika TH0 & 0; TL0 & 0; IE = 132; //zezwolenie na przerwania TR0 | 1;

zn=49; for (;;) { petla(100); SBUF=zn; TI=0; if (zn==55)zn=49; wyswietlacz=zn-48; liczba=c3; liczba=0; }

}

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 ;)

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

Piotrek

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

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

U¿ytkownik "Piotrek Sz." snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:dbrfp1$b0q$ snipped-for-privacy@inews.gazeta.pl...

oki dzieki zobacze, ale chyab cos tak kombinowalem i kabelki sie tak dyndaly ze chyab zalatwilem maxa 232 :/

U¿ytkownik "Piotrek Sz." snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:dbrft2$bde$ snipped-for-privacy@inews.gazeta.pl...

heh.... albo ja jestem az tak zielony, albo tak pisze ze niewidze bledow swoich albo ten uklad z avt 2250 jest do dupy :[ nie dziala - oczywiscie nic sie na wyswietlaczu nie pojawia. nie wiem, nie mam pomyslu. albo ten 80C31 jest wybrakowany :[ no juz mnei to na nerwy dziala bo nie ma mi kto autorytatywnie nawet powiedziec: S³uchaj to napewno dzia³a, popatrz wrzucam swoj program z rpzerwaniem i dzia³a, gdzies robisz blad, czytaj, szukaj. :[ no kurna nie wiem, no juz mnie co niedlugo trafi :/

A to jest uklad z monitorem i 8kb zewnetrzenej pamieci pod adresem 0x8000 kompiluje poleceniem sdcc --model-small --code-loc 0x8000 --data-loc 0x08 --xram-loc 0x0000 main.rel wrzucam przez seriala zbior hex potem robie jump 0x8000 i dupa :[

U¿ytkownik "Lukas" snipped-for-privacy@spam.com napisa³ w wiadomo¶ci news:dbrh6c$6l3$ snipped-for-privacy@atlantis.news.tpi.pl...

nie dziala, nic nie dziala i nie wiem czemu nawet przerwnie serialowe :/ musze zoabczyc jeszcze czy zadziala jak podam 1 na wejscie int0 znakiem tego ze jest ten uklad do dupy albo ten kompilator :[

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required