Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa Interaptom na Rb0/int 16F84

[es] :: Elektronika :: Mikrokontroleri :: Problem sa Interaptom na Rb0/int 16F84

[ Pregleda: 2128 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stevandza
NFK
Sremski Karlovci

Član broj: 194271
Poruke: 16
*.beogrid.net.



Profil

icon Problem sa Interaptom na Rb0/int 16F8418.09.2008. u 07:59 - pre 189 meseci
Molim za pomoc !

Pocetnik sam u radu sa mikrkontrolerima i imam problem sa interaptom na RB0/INT pic-a 16f84a.
Svu teoriju oko ovog interapta sam savladao ali mi i dalje nije jasno zasto deo programa (dole) nikako nece da
udje u interapt rutinu i obradi eksterne impulse na pinu RB0/INT, tj. na pojavu povorke impulsa na ulazu RB0/INT nikako nece
da se setuje bit INTCON.INTF ???

Program je radjen u mikroC-u!

Program je deo programa brojaca, ali je ovo tek pocetak.

Unapred zahvalan !


//BROJAC IMPULSA NA ulazu Rb0/INT (INTERAPTI)

//INTCON.INTF - Setuje se bit ukoliko se desio interapt (Bit 1)
//INTCON.INTE - Sa "1" Omogucavamo interapt na RB0/INT pinu (Bit 4)
//OPTION_REG.INTEDG - "1" - rastuca ili "0" - opadajuca ivica ul. signala (Bit 6)
//INTCON.GIE - Dozvoljavamo sve interapte (Bit 7)


unsigned int Count, tmp; //Counter

void parametri();

void interrupt(void) {

if (INTCON.INTF) {

INTCON.INTF = 0;
Count=Count++; //Increment Count

}
}
void parametri() {

TRISA = 0x00; //PORTA is output
TRISB = 0xff; //PORTB je input
PORTA = 0b00000000;
PORTB = 0x00;

Count = 0; //Initialize Count

OPTION_REG = 0b01000000; //Interapt na opadajucoj ili rastucoj ivici 0x40
//INTEDG - 1,na rastucu ivicu ul. signala - bit 6

INTCON =0b10010000; //Omogucavamo interapt RB0/INT 0x90
//INTE - bit 4
//GIE - bit 7

INTCON.INTF = 0; //Obrisi ovaj fleg,nikad neveruj mikrokontroleru
}

void main() {

parametri();

do { //Main loop
//*************************************************************************
// INTCON.INTF = 1; Cak i ovo kada mu dodam (prisilno setujem), onako bezveze nece da udje u interapt rutinu
//*************************************************************************
tmp = Count;

} while (1); // endless loop
}

 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8418.09.2008. u 10:09 - pre 189 meseci
Ne bi bilo lose da napises kako to detektujes da nece da ulazi u interupt rutinu.
Jeli u pitanju simulator ili imas konkretan hardver, pa vidis da se promjenjiva Count ne povecava ili sta?

Nisam detaljno gledao kako si setovao konfiguracione registre (mrzi me da vadim datasheet) ali mi je zapala za oko naredba

Code:

Count=Count++ ;


Mislim da bi u standardnom C-u to moglo da prodje, ali moze biti da je u tom tvom to ipak implementirano drugacije, probaj za svaki slucaj da stavis samo
Code:

Count++;


Edit:
Evo nesto razmisljam poslednjih nekoliko minuta o ovome i nisam siguran ni da bi to u standardnom C-u garantovano proslo. Ima vise aspekata u tom izrazu za koje bi trebalo detaljno prouciti sintaksu i gramatiku, ali bolje samo stavi Count++, jednostavnije je.



[Ovu poruku je menjao Odin D. dana 18.09.2008. u 11:22 GMT+1]
 
Odgovor na temu

stevandza
NFK
Sremski Karlovci

Član broj: 194271
Poruke: 16
*.beogrid.net.



Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8418.09.2008. u 10:30 - pre 189 meseci
Gledao sam vrednosti registara u "Watch" prozoru mikroCeovog debagera.
Cak i ako bi postavio onako bezveze Count= 23; u interapt rutini ispred Count=Count++;
i dalje bi vrednost Count-a bila nula u Watch prozoru debagera!

Ili cak Delay_ms(2000); ispred INTCON.INTF = 0; u interapt rutini cisto da vidim da
li se vrednost INTF-a posle promene stanja na ulazu RB0/INT promenula na 1, ali nista !

Problem je sto mi se nikada nemenja stanje INTF bita, sta god simulacijom doveo na ulaz RB0 pina !

A i ako bi ga prisilno promenio, ne ulazi u interapt rutinu ===>>>

void main() {

parametri();

do {

INTCON.INTF = 1;
tmp = Count;

} while (1);
}

Probao sam nesto..., ali nije radilo pa sam pomislio ako simulacija neradi, nece ni ovo !

Zahvaljujem vam se na trudu da mi pomognete
Stevan !
 
Odgovor na temu

Stojan Trifunovic

Član broj: 15156
Poruke: 366
*.yu
Via: [es] mailing liste



+8 Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8418.09.2008. u 11:19 - pre 189 meseci
Ovim:
Code:

    OPTION_REG = 0b01000000;  //Interapt na opadajucoj ili rastucoj ivici  0x40
                              //INTEDG - 1,na rastucu ivicu ul. signala  - bit 6

ste ukljucili pull-up otpornike na portu B, pa ce na pinu RB0 neprestano biti prisutna logicka 1. Samim tim ni ne mozete detektovati promenu od logicke 1 ka logickoj 1. Ukoliko koristite tastere za testiranje kola, normalno da nece raditi, ali dodatna integrisana kola sa normalnim naponskim nivoima trebala bi lako pregaziti pull-up.

Znaci, ukoliko koristite taster izmenite OPTION_REG = 0b01000000; u OPTION_REG = 0b00000000; i povezite taster od pina prema masi (umesto od +5V prema pinu). Naravno, interapt ce se onda javljati prilikom opadajuce ivice signala.

Ukoliko zelite bas rastucu ivicu, iskljucite pull-up (OPTION_REG = 0b11000000;) i eksterno povezite pull-down otpornik (od pina prema masi), sa tasterom povezanim od +5V ka pinu.

Sa tasterima i bez pull-down (ili pull-up - internih ili povezanih spolja) otpornika, RB0 ulaz ce biti u stanju visoke impedanse sa nedefinisanim stanjem (na njemi nije ni 0 ni 1) sto bas i nije pozeljno za PIC.

Ukoliko ne koristite tastere vec eksterna integrisana kola, mozete, ali realno nema potrebe za ukljucenjem internih pull-up otpornika.

Moguce da mikroC ne podrzava menjanje sadrzaja flaga iz programa!
 
Odgovor na temu

stevandza
NFK
Sremski Karlovci

Član broj: 194271
Poruke: 16
77.46.196.*



Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8418.09.2008. u 19:45 - pre 189 meseci
Pokusao sam da izmenim program prema vasim savetima, ali na zalost i dalje nista , cak ni u debageru neradi , probao sam
i "hardver" da napravim ali nista, jednostavno u debageru INTF nece da se setuje nipodkakvim uslovima!

Inace program u ovom slucaju treba da da setuje izlaz (500ms) na portu A na svaki peti impuls doveden na port B (RB0/INT) .

Inace, pravio sam ja neke sitne programcice koji su radili ok, kako softver tako i hardver (korektno hex spusten u pic) i nije bilo problema,
ali ovo mi nije jasno, nece pa nece !


Evo izmene programa:
//"BROJAC" IMPULSA NA ulazu Rb0/INT (INTERAPTI)

//INTCON.INTF - Setuje se bit ukoliko se desio interapt (Bit 1)
//INTCON.INTE - Sa "1" Omogucavamo interapt na RB0/INT pinu (Bit 4)
//OPTION_REG.INTEDG - "1" - rastuca ili "0" - opadajuca ivica ul. signala (Bit 6)
//INTCON.GIE - Dozvoljavamo sve interapte (Bit 7)


unsigned int Count, tmp; //Counter

void parametri();

void interrupt(void) {

if (INTCON.INTF) {
INTCON.INTF = 0;
Count++;
}
}
void parametri() {

TRISA = 0x00; //PORTA is output
TRISB = 0xff; //PORTB je input
PORTA = 0b00000000;
PORTB = 0x00;

Count = 0; //Initialize Count

OPTION_REG = 0b00000000; //Interapt na opadajucoj ili rastucoj ivici
//INTEDG - 0,na opadajucu ivicu ul. signala - bit 6
//RBPU-0, pull-upovi su ukljuceni sa nulom bit 7

INTCON =0b10010000; //Omogucavamo interapt RB0/INT 0x90
//INTE - bit 4
//GIE - bit 7

INTCON.INTF = 0; //Obrisi ovaj fleg, nikad neveruj mikrokontroleru
}

void main() {

parametri();

do { //Main loop
tmp = Count;

if (tmp == 5) {

Count = Count - 5 ;
PORTA = 1;
Delay_ms(500);
PORTA = 0;
}

} while (1); // endless loop
}


 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8419.09.2008. u 00:32 - pre 189 meseci
Ajde nam opisi kako ti u toku izvrsavanja tog programa na simulatoru/debugeru postignes da ti se promjeni vrednost (softverski) na pinu INT/RB0. Mozda tu nesto nije onako kako ti se cini?

Ne bi bilo lose ni da opises tacno kako spajas taj hardver koji ti pravi tu povorku impulsa na pinu RB0. Ako se taj generator impulsa napaja sa nekog drugog izvora, razlicitog od onog kojim se napaja mikrokontroler, a doveo si samo JEDNU zicu od tog generatora na taj pin (tj. ta dva dijela nemaju zajednicku masu) nece ti tako raditi.
 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
*.static-fiber.styrion.net.



+9 Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8419.09.2008. u 07:31 - pre 189 meseci
Samo bih dao komentar za sam KOD:

Kod postavljanja pojedinih bitova u nekom registru je bolje umesto:
Code:

INTCON =0b10010000; //Omogucavamo interapt RB0/INT 0x90
//INTE - bit 4
//GIE - bit 7

koristiti operatore za manipilisanje bitovima:
Code:

INTCON =(1<<INTE) | (1<<GEI); //Omogucavamo interapt RB0/INT 0x90

Značenje je: "1" pomeriti za INTE pozicija na levo, ILI(binarno), "1" pomeriti za GEI pozicija na levo.
Samim time je KOD samoobjašnjavajući i ne treba da SAM izračunavaš poziciju u 0bxxxxxxxx.

 
Odgovor na temu

stevandza
NFK
Sremski Karlovci

Član broj: 194271
Poruke: 16
*.beogrid.net.



Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8419.09.2008. u 07:33 - pre 189 meseci
Nisam ja hardver bas skroz odradio do kraja, onako kako treba da bude, cisto sam probao na proto bordu, tasterom spajam RB0/INT pin sa masom (pull-up R su ukljuceni).

Izlazi Porta A su stalno na nuli!

Ukoliko dodam u programu bezveze (cisto da probam) " INTCON.INTF = 1;" Fleg u registru se setuje ali u interpt rutinu ne ulazi,
to sam skontao posto vrednost Count-a ostaje 0 !

Cak sam i dilej ubacio u interapt rutinu odmah posle if-a da bih mogao da usporim proces i uocim prvo setovanje a potom i postavljanje
flega INTF na 0, ali nista. Ali video bih i po Count-u, ako bi usao u interapt rutinu, Count bi morao da se inkrementira !

Inace zavrsio sam FTN u Novom Sadu i sada sam inzenjer odrzavanja u jednoj firmi.
Nisam neki programer ali sam za hardver vrlo dobar !

A ovaj problem mi vec ide na k****! Imam drugara koji je odlican programer,
jest da neradi sa pic-evima, i sa njim sam se zaje****o oko ovoga ali nista !




do { //Main loop

// INTCON.INTF = 1; Cak i ovo kada mu dodam (prisilno setujem), onako bezveze nece da udje u interapt rutinu

tmp = Count;

if (tmp == 5) {

Count = Count - 5 ;
PORTA = 1;
Delay_ms(500);
PORTA = 0;
}

} while (1); // endless loop


Zahvaljuem se brank(u)_g na sugestijama, ali mislim da mi i te "prepravke" nece puno pomoci :( .



[Ovu poruku je menjao stevandza dana 19.09.2008. u 08:46 GMT+1]
 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
*.static-fiber.styrion.net.



+9 Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8419.09.2008. u 09:35 - pre 189 meseci
Nisam nikad radio sa MikroC i PIC-om ali sam našao neki primer koji bi odgovarao tvojem:
http://www.micro-examples.com/.../doc/110-p16f84-freqmeter.html

Pogledaj pažljivo i uporedi sa tvojim programom.

Što se tiče hardvera:
"tasterom spajam RB0/INT pin sa masom (pull-up R su ukljuceni). "
Jesi li i merio napon na RB0, da li je zaista RB0 na +5V i da li kada pritisneš taster napon opada na 0V?


[Ovu poruku je menjao branko_g dana 19.09.2008. u 10:46 GMT+1]
 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8419.09.2008. u 15:55 - pre 189 meseci
Ajde napisi da se nesto desava i u glavnoj petlji, stavi nek se mijenja neka promjenjiva, pa da vidimo da li se program uopste izvrsava, ili samo taj interupt zapinje.
 
Odgovor na temu

stevandza
NFK
Sremski Karlovci

Član broj: 194271
Poruke: 16
77.46.196.*



Profil

icon Re: Problem sa Interaptom na Rb0/int 16F8419.09.2008. u 21:35 - pre 189 meseci
Uspeo sam da nabudzim da radi!

Hardver radi odlicno ! Ali u debageru i dalje nista INTF se nemenja , stalno je 0 !

U sustini , ovo treba da bude "delitelj" impulsa sa nekim brojem, npr.20 , i posle
tih 20 impulsa pic treba da da na izlazu impuls odredjenog trajanja npr.300ms !

HVALA VAM SVIMA NA POMOCI !
Veliki pozdrav od Stevana !
Dopisivacemo se mi jos ( nadam se), kada mi zapne... :)))

#define Out PORTA.F0

unsigned int Count, tmp;

void parametri();

void interrupt(void) {

if (INTCON.INTF) {

Delay_ms(20);
INTCON.INTF = 0;
Count++;
}
}
void parametri() {

TRISA = 0x00; //PORTA is output
TRISB = 0xff; //PORTB je input
PORTA = 0b00;
PORTB = 0x00;

OPTION_REG = 0x00;
INTCON =0b10010000;

Count = 0;
INTCON.INTF = 0; //Obrisi ovaj fleg, nikad neveruj mikrokontroleru
}

void main() {

parametri();

do { //Main loop

tmp = Count;

if (tmp > 20) {

Count = Count - 20;
Out= 1;
Delay_ms(300);
Out= 0;

}

} while (1);
}
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Problem sa Interaptom na Rb0/int 16F84

[ Pregleda: 2128 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.