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

Problem sa RB0 prekidom

[es] :: Elektronika :: Mikrokontroleri :: Problem sa RB0 prekidom

[ Pregleda: 2666 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Seme
Miroslav Bozic
Nis
Elektronski fakultet
Nis, Zajecar

Član broj: 43158
Poruke: 390
79.101.26.*

Sajt: www.ebuyelektronika.co.cc


+5 Profil

icon Problem sa RB0 prekidom30.05.2008. u 18:10 - pre 193 meseci
Postovane kolege napravio sam ir prijemnik i predajnik. Takodje sam razvio protokol za komunikaciju, nesto slicno kao rc5, 2 s bita 1 toggle bit i za razliku od rc5 protokola imam jos samo 5 bitova komande. Trajanje periode jednog bita je 1,6ms. Dekodiranje se vrsi isto kao i kod rc5 protokola ako je rastuca ivica onda je jedan a ako je opadajuca onda je 0. Kada se dekodiranje vrsi bez prekida odnosno program se stalno vrti u petlji dok god ne dodje do pada signala na pinu rb0 kada se poziva funkcija za dekodiranje ir signala i dobija ok vrednost komande za svaki pritisnut taster na predajniku. Problem nastaje kada u sve to ukljucim rb0 prekid. Naime u tom slucaju opadajuca ivica na RB0 izaziva prekid i ista funkcija se poziva za dekodiranje signala stom razlikom sto u ovom slucaju ne dobijam nikakvu komandu. Kada krenem da obradjujem prekidnu rutinu disejblujem sve prekide tako da to nije problem i sad mi nije jasno sta je problem. Ukoliko je neko imao slican problem molio bih za pomoc.
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3871
91.191.7.125



+334 Profil

icon Re: Problem sa RB0 prekidom30.05.2008. u 21:48 - pre 193 meseci
Interapt se desava na promjenu stanja pina?
 
Odgovor na temu

Stojan Trifunovic

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



+8 Profil

icon Re: Problem sa RB0 prekidom31.05.2008. u 06:40 - pre 193 meseci
Ne! Ne na promenu stanja, vec na promenu ivice (sa +5V na 0V) za pin
RB0. Za promenu stanja (sa +5V na 0V ali istovremeno i sa 0V na +5V)
koriste se pinovi RB4 do RB7.

Pretpostavljam da za detekciju infracrvenog koda koristite poolovanje,
odnosno povremeno testiranje odgovarajuceg pina za detekciju
odgovarajuce promene (kako kazete "Kada se dekodiranje vrsi bez
prekida") ili pak interapte po promeni stanja na RB4 do RB7 pinovima.

U slucaju da je u pitanju detekcija interaptima na RB4 do RB7 pinova,
normalno je da ne mozete dobiti nikakve komande, jer su u interapt
rutini vec zabranjeni novi interapti (automatskim resetovanjem
GIE) sve do retfie instrukcije koja ce opet automatski setovati GIE.
U vezi toga nije mi najjasniji Vas opis "Kada krenem da obradjujem
prekidnu rutinu disejblujem sve prekide".

Samim tim, interapti iz interapt rutine nisu moguci (tacnije jesu uz
nasilno resetovanje GIE unutar interapt rutine, ali onda se mora uzeti
u obzir i nivo steka).


Ukoliko pak za detekciju koristite poolovanje, ne vidim razloga zbog
kojih bi uopste vrsili isto to poolovanje iz interapt rutine. Sama
interapt rutina uglavnom se pravi tako da traje sto krace i da njeno
izvrsavanje ne ometa (u vecoj meri) glavni program. Ukoliko je ovo
situacija, moguce da imate problema sa registrima za detekciju IC
koda, a koji se koriste i u glavnom programu i u interapt rutini. Da
ne bi dolazilo do njihove kolizije, potrebno ih je snimiti (kao
snimanje W i STATUS registra na pocetku interapta). Drugi problem
mogao bi biti preveliki broj potprograma, sto moze prepuniti stek
(niste naveli sa kojom familijom PIC radite).

Na primer, ukoliko imate PIC16 seriju (sa 8 nivoa steka), i u glavnom
programu ste pozvali jedan potprogram, iz njega drugi, pa iz njega
treci, pa cetvrti i peti, i onda odete u interapt rutinu (to je vec
sesti nivo) i iz nje pozovete jedan potprogram (sedmi nivo) pa jos
jedan (osmi) i jos jedan (prvi - prebrisana adresa povratka),
ocigledno je da se nikada necete moci izvuci iz interapta. Da bi ovo
proverili mozete simulirati program u MPLAB SIM-u i koristiti View
- Hardvare Stack opciju.

Da bi najbezbolnije detektovali do cega se u stvari radi, najbolje
kopirajte kompletnu dekodersku rutinu u interapt rutinu preko Copy
Paste ali sa sopstvenim posebnim registrima.
 
Odgovor na temu

Seme
Miroslav Bozic
Nis
Elektronski fakultet
Nis, Zajecar

Član broj: 43158
Poruke: 390
*.elfak.ni.ac.yu.

Sajt: www.ebuyelektronika.co.cc


+5 Profil

icon Re: Problem sa RB0 prekidom31.05.2008. u 12:22 - pre 193 meseci
Da bas to sam i odradeo cela dekoderska rutina se nalazi u prekidu. Meni je rb0 prekid potreban za detekciju opadajuce ivice na istom pinu. Kada se detektuje opadajuca ivica znaci da je doslo do slanja prvog startnog bita. Nakon udetekcije bita i ulaska u obradu prekida ja blokiram sve prekide i nastavljam sa detekcijom narednih bitova. Koristim prekid na rb0 i to na opadajucu ivicu. Pazi sad ako je cekanje na startni bit izvedeno bez koriscenja prekida odnosno:

while (!input(PIN_RB0)); // vrti se u petlji dok napon na rb0 ne padne na nulu
.
. // ovde ide poziv funkcije za dekodiranje
.
printf(lcd_putc(),"\fkomanda:%d",command); //odstampaj dobijenu komandu sa ir dekodera

sve funkcionise ok odnosno na svaki pritisak tastera na predajniku dobijam kod dataog tastera.

e sad ako se detektovanje opadajuce ivice odradi pomocu rb0 prekida:

#INT_EXT
void irDecode()
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
.
. // ovde se vrsi dekodiranje ir signala istom funkcijom kao i malopre. Kod funkcije je kopiran u prekidnu rutinu tako da nema skokova
.
enable_interupts(GLOBAL);
enable_interupts(INT_EXT);
}

ne uspevam da dobijem dekodiranu komandu.

Ono sto hocu da kazem je da funkcija za dekodiranje radi ispravno ukoliko se ne zove u prekidu. Da li je moguce da nisam zabranio prekid kako treba pa da mi na svaku opadajucu ivicu ir signala program ulazi iznova u prekid?
 
Odgovor na temu

ADRENALIN

Član broj: 17952
Poruke: 278
*.dynamic.sbb.rs.



Profil

icon Re: Problem sa RB0 prekidom31.05.2008. u 15:05 - pre 193 meseci
Teskon da neko moze ovako da ti pomogne, to sto pricas je u redu, ali je pitanje da li si zaista napisao kako si zamislio. Ja sam radio RC5 dekodiranje pod interaptom na 16 i 18F seriji u asembleru. To radis na sledeci nacin: Trebaju ti eksterni interapt na ivicu to je RB0 i jedan tajmer. Na ivicu detektujes da se promenilo nesto, tj da je pocela transmislija i tada se sinhronises na start bite, posle toga aktiviras tajmer na pola perioda i posle toga u interptu po tajmeru ocitas prvi bit, sada promenis period na ceo period i ocits sve biti do kraja, ti rece da ih ima jos 4. Dakle eksterni interapt namestis da se aktivira kada pocne prenos, i sinhronizujes se na ta dva start bita, a zatim pomocu tajmera primas ostale bite. Kada detektujes pocetak prenosa, treba da disejblujes eksterni interapt i enejblujes int po tajmeru, a kada primis sve bite da disejblujes int po tajmeru i enejblujes eksterni int da bi mogao da primis sledecu poruku.

P.S. Ne treba da u interapt rutini disejblujes interapte, posto se samim ulaskom u interapt, na hardverskom nivou, disejbluje GIE, a instrukcija refie (to ti odradi tvoj c kompajler) automatski enejbluje gie.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: Problem sa RB0 prekidom31.05.2008. u 15:38 - pre 193 meseci
A da li si u main funkciji postavio:

ext_int_edge(hi_to_lo);

pre omogucavanja interapta?
 
Odgovor na temu

Seme
Miroslav Bozic
Nis
Elektronski fakultet
Nis, Zajecar

Član broj: 43158
Poruke: 390
*.elfak.ni.ac.yu.

Sajt: www.ebuyelektronika.co.cc


+5 Profil

icon Re: Problem sa RB0 prekidom31.05.2008. u 16:05 - pre 193 meseci
sander:

ext_int_edge(hi_to_lo); postavio sam

adrenalin:

ja koristim interupt da samo detektujem opadajucu ivicu. Dalje radim sa delay_us(time_in_us) funkcijom. na taj nacin cekam sledecu polovinu bita.
 
Odgovor na temu

Stojan Trifunovic

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



+8 Profil

icon Re: Problem sa RB0 prekidom02.06.2008. u 10:01 - pre 193 meseci
Aha, sada mi je jasnije. Zelite da PIC radi druge stvari sve dok se ne
pojavi signal sa daljinskog, a onda da ga dekodira iz interapt rutine,
kako ne bi neprestano poolovao pin RB0. Pametno.

Ne govorim C, ali ovde ocigledno nedostaje:

printf(lcd_putc(),"fkomanda:%d",command);
//odstampaj dobijenu komandu sa ir dekodera

komanda. Znaci, trebalo bi (valjda) da izgleda ovako:


#INT_EXT
void irDecode()
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
.
. // ovde se vrsi dekodiranje ir signala istom
funkcijom kao i malopre. Kod funkcije je kopiran u prekidnu
rutinu tako da nema skokova
.

printf(lcd_putc(),"fkomanda:%d",command);
//odstampaj dobijenu komandu sa ir dekodera


enable_interupts(GLOBAL);
enable_interupts(INT_EXT);
}


Ukoliko vec program radi dobro bez problema sa istom rutinom ali bez
interapta, moguce je sledece:

1. Niste na isti nacin inicijalizovali registre koje koristite u
rutini za dekodiranje.

2. Program nije u istoj banci (npr. BANK0 u glavnom programu a BANK 1
u interaptima). Nisam siguran da li C automatski vrsi prebacivanje.

3. Ukoliko koristite tabele ili skok upotrebom PCL registra niste
podesili vrednost PCLATH (ogranicenje programske memorije na skokove
od samo 256 bajtova).

4. C kompajler ne izvrsava pravilno skok preko granica stranica (npr.
2KB PAGE ogranicenje kod PIC16 serije).

5. Rutina printf (ili neke druge pre nje) koristi vise pozivanja
potprograma pa ipak dolazi do prekoracenja steka. Ovo mozete
najjednostavnije ispitati tako sto odmah nakon ispravne detekcije
ukljucite npr. jednu LED. Za to Vam nije potreban nikakav potprogram.

6. Nisu isto inicijalizovani U/I pinovi (preko TRIS registara).

7. Nisu ukljuceni PULL-UP otpornici, pa signal na pinu "seta" kada
nema signala, a samim tim izazove interapt mnogo pre nego sto primi
ikakav signal. Ovo najvise zavisi od hardvera za prijem signala.

Moguce da postoji jos nesto, ali za sada mi jedino ovo deluje
najverovatnije.
 
Odgovor na temu

Seme
Miroslav Bozic
Nis
Elektronski fakultet
Nis, Zajecar

Član broj: 43158
Poruke: 390
77.46.174.*

Sajt: www.ebuyelektronika.co.cc


+5 Profil

icon Re: Problem sa RB0 prekidom02.06.2008. u 18:45 - pre 193 meseci
Ovako stampanje primeljene komande se vrsi u glavnom programu. A sad da razjasnim malo. Predajnik i prijemnik se koristi za upravljanje robotskom rukom rengena odnosno njenim kretanjem. E sad o predajniku nema sta da se pise najobicniji daljinski sa 12 tastera. Kod prijemnika je drugacije. Posto imam potrebu da pored daljinskog postoji i upravljanje preko tastature koja se nalazi na samoj ruci, ja sam problem resio (tj jos pokusavam da ga resim) tako sto ce pic stalno skenira tastaturu i ukoliko je neki taster pritisnut obradjuje datu komandu. E sad da bi kontroler moga da primi ir signal potreban je prekid sto radim sa pinom rb0. Odnosno pic stalno skenira tastaturu dok god ga startni bit ir predajnika ne uvede u prekid gde se vrsi dekodiranje signala. Nakon dekodiranja se u glavnom programu obradjuje dobijena komanda i nastavlja se skeniranje tastature. Ukoliko ne uspem da odradim ovo sa jednim PIC - om bicu primoran da imam jos jedan kontroler koji ce skenirati tastaturu. Upravljanje rukom se vrsi pomocu ABB - ovog plc - a tako da se komanda salje preko rs485 magistrale plc-u.To je to ukratko. probacu da odradim sve u asembleru i da obratim paznju na sve registre moguce je da se u toku izvrsavanja programa negde nesto setuje ili resetuje sto pravi problem. Javljam se sa rezultatima
 
Odgovor na temu

Stojan Trifunovic

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



+8 Profil

icon Re: Problem sa RB0 prekidom02.06.2008. u 21:47 - pre 193 meseci
Ako se stampanje vec vrsi u glavnom programu, morate iz interapta
predati informaciju glavnom programu (obicno se to izvodi setovanjem
odgovarajuceg namenskog flaga) da je primljena IC komanda. Glavni
program bi onda morao pored skeniranja tastature skenirati i taj fleg,
i ukoliko je setovan stampati IC kod.


Ovakav pristup (skeniranje tastature i prijem IC komande interaptima)
imao bi manu sto nije moguce istovremeno primati IC komandu i
skenirati tastaturu (mada to mozda nije ni potrebno - zavisi od
namene). Mozda bi lakse bilo skenirati tastaturu (zajedno sa
debouncingom) unutar algoritma za dekodiranje IC komande.
Pretpostavljam da se dekodiranje IC komande obavlja semplovanjem na
36KkHz ili vise, tako da bi se tastatura skenira na tom (36kHz) taktu.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Problem sa RB0 prekidom

[ Pregleda: 2666 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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