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

AVR USATR ili interapti problem

[es] :: Elektronika :: Mikrokontroleri :: AVR USATR ili interapti problem

[ Pregleda: 3071 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon AVR USATR ili interapti problem28.04.2011. u 15:42 - pre 157 meseci
Pozdrav svima!

Imam jedan veliki problem koji me vec danima muci! Pravimo nekog robota za takmicenje i ima par sklopova koji medjusobno komuniciraju preko USART-a...

Imam dva drajvera (za sada) i jednu da tako kazem maticnu plocu sa ATMEGA128 kontrolerom... Posto koristim CodeVisionAVR, a ATMEGA128 ima 2 USARTA, jedan sam
iskoristio za komunikaciju sa jednim drajverom i to radi super, a drugi nisam iskoristio jer mi je i on u startu pravio probleme, pa sam ga zamenio sa "vestackim" USART-om
koji provereno znam da radi i testiran je mnogo puta (prosle godine smo ga koristili na isti nacin i radio je)... Evo koda :

Code:

interrupt [TIM0_COMP] void timer0_comp_isr(void)    //interapt se poziva onoliko brzo koliko je potrebno za baud rate od 9600
{
    switch(status_kineski)
    {
        case CEKA_BAJT_KINESKO:
            if(brojBajtovaKinesko!=0)      //ako ima bajtova za slanje
            {
                //smesta bitove tog bajta u buffer
                for(poslaoBitovaKinesko=0;poslaoBitovaKinesko<8;poslaoBitovaKinesko++)
                {
                    kineski_tx_buffer[poslaoBitovaKinesko]=kineski_buffer[kineskiBrojac] & 0x01;
                    kineski_buffer[kineskiBrojac]>>=1;    
                }
                
                if(kineskiBrojac==1024)  kineskiBrojac=0;
                else                    kineskiBrojac++;
                
                status_kineski=SLANJE_START_KINESKO; //menjam stanje softverskog uarta
            }
            break;
        case SLANJE_START_KINESKO:
            TX_PIN_KINESKI=1;    //start bit
            poslaoBitovaKinesko=0;
            status_kineski=SALJE_BAJT_KINESKO; //pocinjem sa slanjem bajta
            break;
        case SALJE_BAJT_KINESKO:
            if(poslaoBitovaKinesko==8)     //ako je poslao svih osam bitova
            {
                TX_PIN_KINESKI=0;      //stop bit
                //poslaoBitovaKinesko=0;
                status_kineski=SLANJE_STOP_KINESKO; //zavrsavam slanje
               // break;    
            }else    //ako jos uvek saljem bajt
            {
                //invertujem bitove zbog optokaplera na drajveru
                if(kineski_tx_buffer[poslaoBitovaKinesko]==1) TX_PIN_KINESKI=0;           
                else                                          TX_PIN_KINESKI=1;
            
                //povecavam broj poslatih bitova
                poslaoBitovaKinesko++;
            
            }
              
            break;
        case SLANJE_STOP_KINESKO:
            brojBajtovaKinesko--;   //smanjujem broj bajtova za slanje
            //vracam se na proveru dali ima nesto za slanje
            status_kineski=CEKA_BAJT_KINESKO;
            break;
                
    }    
}    //OVO SE SVE ZOVE KINESKO ZATO STO TAKO ZOVEMO MOTORE KOJIMA UPRAVLJAMO POMOCU DRAJVERA :)


Primeticete da koristim invertovano slanje (jos jedan razlog zasto sam presao sa onog koda koji mi generise CodeVision) jer imam optokapler na drajveru sa kojim komuniciram...

E sad, snifovanjem te "magistrale" kojom su povezani drajver i glavna ploca dosao sam do zakljucka da prosto glavna ploca ne posalje komandu kada bi trebala!

E drugi problem je sto ja bafer ovog USART-a punim i interaptu nekom drugom koji se javlja svake milisekunde. I funkcija u kojoj to radim izgleda ovako :

Code:

void salji_motorima(volatile char motor,volatile unsigned char parametri)
{
    #asm("cli")

    kineski_buffer[kineskiWrIndex]=motor;   //ubacujem bajt u transmit buffer
    kineskiWrIndex++;                       //povecavam index
    
    if(kineskiWrIndex==1024)  kineskiWrIndex=0;
    kineski_buffer[kineskiWrIndex]=parametri;    //ubacujem bajt(brzina motora) u transmit buffer
    
    kineskiWrIndex++;                            //povecavam index
    if(kineskiWrIndex==1024)  kineskiWrIndex=0;
    
    brojBajtovaKinesko+=2;                       //povecavam broj bajtova za slanje - videti interapt timera0
    #asm("sei")
}


E sad, ja u interaptu pozivam ovu funkciju kada treba da posaljem nesto (a sve to radim u interaptu da bi bilo protocno i da bih dok robot radi nesto drugo, radio nesto trece). Dugo mi je ovo pravilo probleme i stavljanjem ovog #asm("cli") i #asm("sei") bio sam "resio" problem (tacnije nedelju dana svaki dan je radio bez greske ), medjutim opet se javio isti problem i sada jos cesce nego ranije! Postalo je toliko iritantno i sve sam pokusao da uradim kako bih to resio, ali ne ide.

Takodje da napomenem da imam dva tajmerska interapta i jos interapte za USART (TX i RX) koji se jako cesto koriste! Pozivaju se bas cesto… A i sada sam dosao sa testiranja i primetio sam da kontroler posalje nesto sto ne treba, pa sumnjam na bafere koje sam stavio da budu preveliki, ali i kada su bili manji opet ke gresio…

Zato sam resio da pitam vas ljudi, mozda je neko imao slican problem ili zna kako da resim ovaj moj problem?

Ako treba jos neka informacija, recite iznecu vam je :) Verovatno sam nesto od vaznosti zaboravio :)
Ako treba stavicu i ceo kod…

Unapred hvala,
Lestrigonac :)
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: AVR USATR ili interapti problem28.04.2011. u 19:22 - pre 157 meseci
Daj kod gde pozivas funkciju:

void salji_motorima(volatile char motor,volatile unsigned char parametri)



Za svaki slucaj probaj bez ovog volatile.



gorankg
 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: AVR USATR ili interapti problem28.04.2011. u 19:58 - pre 157 meseci
To pozivam u interaptu tajmerskom...

Probao sam i bez volatile, ovo sam stavio kao pokusaj resenja tog problema, ali naravno to nije pomoglo...

Evo samo deo koda gde pozivam tu funkciju (to je prilicno dugacak switch) i kao sto sam rekao to pozivam u interaptu :

Code:

......
        //dajemo mu komadnu da otvori kuku
        case OTVARA_KUKU:
                TurnOnSablja(IZVLACI,3);    //9
                ceka_zbog=OTVARA_KUKU;
                stanje_pakovsko = CEKAJ_ZBOG_DRAJVERA;
                break;

        //ovde ce uleteti u slucaju da kupi ne prvi pak iz zelenog polja
        case IZVLACI_PAK:
                if(!poslaoKuki)
                {
       
                    TurnOnSablja(UVLACI,3);  //3
                    poslaoKuki=~poslaoKuki;
 
                }
            
                break;        

        //kada pritisne taster da je kuka izasla da zaustavi maxonce
        case ZAUSTAVI_KUKU:
                if(TAS_KUKA_VANI_provera())
                {
                    sabljaStop();  
                    stanje_pakovsko=CEKA_PAK;
                   
                }
                
                break;
.........



I ja u mainu samo menjam stanja ovog switcha i on protocno radi ovo sto meni treba...

Evo i funkcija :

Code:

void TurnOnSablja(volatile char smer,volatile unsigned char value)    //  IZVLACI   UVLACI  // value  1-19 
{
      volatile char a = 'B';
      if(smer==IZVLACI)      value=value+20;
      salji_motorima(a ,value);    
}


Primeticete da sam svuda dodavao volatile :D Samo neki bedan pokusaj, ali ajde :D

Pozdrav :)
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: AVR USATR ili interapti problem29.04.2011. u 07:37 - pre 157 meseci
Bio je negde na netu jedan lep tekst o upotrebi volatile i greškama koje pri tom mogu nastati ali ne mogu se setiti gde sam čitao. Što se tiče koda pitanje:
- Da li si siguran da se sve što pozivaš u tom TMR0 prekidu obavi pre nego se generiše novi?
Switch-case strukture, pogotovo dugačke, često mogu da budu problematične. Ne znam kako CodeVision izlazi na kraj sa tim. Neke ranije verzije Microchip kompajlera su meni pravile problem.
Pokušaj da skratiš funkcije tako da ti ostane samo deo koji smatraš za problematičan pa onda testiraj. Recimo, ostavi samo case OTVARA_KUKU i probaj to. Prekidne rutine bi trebalo da budu što kraće. U njima se postavljaju kontrolni bitovi na osnovu kojih u main preduzimaš neke akcije ili se menjaju stanja brojača npr. Ja izbegavam da bilo kakvu funkciju pozivam iz prekidnih rutina. Sve to ide iz main.

gorankg
 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: AVR USATR ili interapti problem29.04.2011. u 07:51 - pre 157 meseci
Znam da bi sve trebalo da bude sto krace, ali meni je bilo kao bitno da imam neku protocnost, a na kraju je ispalo da je gotovo ni nemam, a kako je rastao kod, tako se slozenost tih nekih case-ova povecavao! Mada ja mislim da on negde izgubi IRQ-ove, tipa kada ulazi u taj interapt za serijsku koji se bas jako cesto poziva, mora da radi disable svih interaptova da bi lepo punio bafer i tu izgubi IRQ ili nesto slicno...

Nocas sam pokusavao da resim ponesto, pa cu sada da idem da probam, ako resim problem, javljam :)

Hvala na pomoci :)
 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: AVR USATR ili interapti problem29.04.2011. u 18:57 - pre 157 meseci
Napisao sam potpuno novi kod, u kome imam 4 interapta, 3 za dve serijske komunikacije i jedan obican tajmerski u kome ne radim nista osim sto brojim vreme i opet pravi problem...

Snifovanjem sam zakljucio da glavni kontroler nekada ne posalje nista, nekada posalje nesto sto ne treba, a nekada posalje sta treba, ali drajver ne odradi posao...

Sada sam potpuno zbunjen, nemam pojma sta se desava i odakle da pocnem da resavam problem :/
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: AVR USATR ili interapti problem30.04.2011. u 18:29 - pre 157 meseci
Napravi poseban test program kojim ćeš testirati samo tu problematičnu rutinu za softversku serijsku komunikaciju.
gorankg
 
Odgovor na temu

ac1bd4
Stara Pazova

Član broj: 76735
Poruke: 437
*.dynamic.isp.telekom.rs.



+35 Profil

icon Re: AVR USATR ili interapti problem22.05.2011. u 00:04 - pre 156 meseci
Možda malo kasno odgovaram ali zar je baš potrebna takva skalamerija? Možda bi lakše bilo otkloniti problem sa drugim USART-om nego praviti softversku verziju koja nikada neće raditi kako treba. Deo problema je i u tome što prekid od tajmera nije savršeno precizan, a može da se desi i da mora da čeka jer je neki deo koda isključio prekide. Pored toga potrebno je da izvrši i par instrukcija koje nisu uvek iste pa je i trajanje različito pa je greška prilikom slanja velika i tada drajver ni ne odradi to što mu je poslato jer nije ispravno primio.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.rs.



+7 Profil

icon Re: AVR USATR ili interapti problem04.06.2011. u 22:23 - pre 156 meseci
Možda ću ti pomoći, a možda i ne. U svakom slučaju ne škodi.

I ja sam imao takvu gužvu na mikrokontroleru, dve serijske, IIC, jedan tajmerski interrupt na 1ms, jedan na 20ms, ne sećam se možda i joč nešto. Akoimaš problem sa serijskom, anda je najbolje da obratiš pažnju na nju.

Ja sam to ovako rečio:

Za svaki kanal serijske imam:
- jedan prijemni kružni bafer od 100 bajtova ( po proceni toliko mi je trebalo)
- dva pointera, jedan ukazuje na praznu lokaciju bafera i preko njega se upisuje u bafer, drugi pointer ukazuje na punu
lokaciju i to na bajt koji najduže stoji u baferu.

Kada se upisuje u bafer, ili kada se čita, odgovarajući pointeri se inkremeniraju. Kada neki od pointera dođe do kraja bafera, inkrementom pointera, on se vraća na početak bafera. Kada su baferi istih vrednosti, bafer je prazan. Na svaki interrupt od RxT se prenosi bajt u prijemni bafer i pointer inkrementira. Negde u glavnoj petlji proveravaš da li je bafer prazan, i ako nije skidaš bajtove iz njega i prebacuješ ih u neki string. Dok skidaš bajtove iz prijemnog bafera, ne smetaju interrupt-i od RxD jer oni samo pomeraju pointer za upis, a ti skidanjem bajtova činiš da pointer za čitanje juri pointer za upis. Kako je program brži od komunikacije sigurno ćeš u jednom trenutku isprazniti bafer.

Takođe i za slanje postoji kružni bafer i dva pointera koja imaju istu ulogu. Kada šalješ znak, njega upisuješ preko pointera za upis i inkrementiraš pointer. Takođe moraš enejblovati interrupt od TxD. Ako nema bajta u registru za slanje, generisaće se interrupt od TxD, a tada se uzima bajt iz bafera preko pointera za čitanje i prenosu u registar za slanje. Kada interrupt procedura pokrenuta sa TxD interrupt-om ustanovi da su oba pointera istih vrednosti, dakle da je bafer prazan, onda se disejbluju interrupt-i od TxD.

Na ovajnačin, bilo gde u programu, i bilo kada možeš preko neke procedure (funkcije) vršiti upis u bafer za slanje, i ne moraš voditi računa ni o čemu, sve se izvršava pod kontrolom interrupt-a TxD. Još ti manje brige treba oko prijema.

Ono što ti treba je nekoliko funkcija
1. inicijalizacija komunikacije i pointera, ima ih 4 po kanalu.
2. funkcija koja ispituje da li ima nešto u prijemnim baferima.
3. funkcija kojom upisuješ znak ili string u bafer za slanje
4. funkcija kojom ćitaš znak po znak iz bafera (dok ga ne isprazniš) ili pročitaš sve odjednom kao string.

E sada, ostalo zavisi od tvog protokola. Sve što pročitaš dodaješ na neki string, i kada u njemu prepoznaš celu poruku uradiš sa njom što želiš, pa ga obrišeš pa sve iz početka.

Veličine bafera proceni sobzirom na vreme obrade primljenih poruka, što ih duže obrađuješ treba da imaš veći bafer.

Neznam da li ti ovo neštokoristi, ali ovu tehniku koristim godinama i nemam nikakvih problema.

Pozdrav.

 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: AVR USATR ili interapti problem06.06.2011. u 14:49 - pre 156 meseci
Hvala svima na odgovorima :)

@ac1bd4

Tacno je da je ovaj softverski serijski problematicniji i da radi losije od ugradjenog, ali je on na samom pocetku i ubacen jer se problem javio sa ugradjenim USART-om i funkcijama koje koristi CodeVision...

@korak

Jasno mi je sta si hteo da kazes i naravno da cu probati da uradim tako... Do sada nisam uspeo da resim problem, ali sam napravio takvu serijsku da se nista ne desava u interaptu i to radi, ali sa velikim gubitkom vremena... Mada mislim da uopste nije problem u serijskoj komunikaciji nego da se u nekom trenutku kontroler nekako izgubi oko svih tih interaptova i nesto preskoci <--- pitanje je zasto? I dalje nisam utvrdio razlog, jer nisam imao vremena, ali pozabavicu se i ovim problemom malo vise... Mada ova situacija je jako frustrirajuca i zato sam i bio odustao od toga...

Jos jednom hvala svima na odgovorima! Pokusacu i ovo kada nadjem vremena...

Veliki pozdrav!
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.rs.



+7 Profil

icon Re: AVR USATR ili interapti problem06.06.2011. u 19:17 - pre 155 meseci
Po pravilu, kada proradi interrupt i pokrene neku funkciju, on sam disejbluje sve interrupt-e, tako da oni ne mogu, ako se jave, da pokrenu svoje funkcije. Moraš da proceniš da u nekoj interrupt funkciji koja dugo traje da dozvoliš sve interrupt-e kako bi bili uhvaćeni svi događaji.

Pozdrav.
 
Odgovor na temu

ac1bd4
Stara Pazova

Član broj: 76735
Poruke: 437
*.dynamic.isp.telekom.rs.



+35 Profil

icon Re: AVR USATR ili interapti problem06.06.2011. u 20:45 - pre 155 meseci
@korak Zar se ne postavlja odgovarajući flag kada se nešto izvrši pa se prekid dešava tek kada budu dozvoljeni ukoliko je flag i dalje setovan? To znači da će se prekidna rutina ipak izvršiti samo sa zakašnjenjem. Greška na koju ciljaš koja tu može da se desi je da se taj flag postavi više puta dok su prekidi zabranjeni pa se izvrši samo jedan prekid posle dozvole prekida.

Ako budeš dozvolio ugnježđavanje prekida obrati pažnju, može da bude jako veselo. Zato je hardverska podrška mama, rasterećuje mnogo. Razmisli ipak da li bi ti bilo lakše da osposobiš drugi USART (baš sam zapeo za njega).
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.rs.



+7 Profil

icon Re: AVR USATR ili interapti problem07.06.2011. u 11:45 - pre 155 meseci
Kada se desi prekid, MCU stavi na stek ono sto treba, a tu su obavezno i flegovi, disejbluje sve prekide preko globalne dozvole prekida i pozove funkciju prekida. Na kraju funkcije prekida obnavlja se ono sto je sačuvano, a time i flegove među kojima je i generalni interrupt fleg.

U funkciji prekida odmah, na početku, poništiš fleg koji je izazvao taj prekid, i ako u njoj negde gde ti je zgodno dozvolis generalno sve prekide, može da se desi novi prekid pre nego što se ova prekidna funkcija završi. Taj prekid će pokrenuti svoju prekidnu funkciju, i kada se ona završi predhodna će se normalno izvršavati.

E sad, ako predpostavimo da se u svim prekidnim funkcijama koje postoje uvek dozvoljava prekid, kako ti kažeš prekidi budu ugnježdeni, neće se desiti ništa loše. Naravno, da se ne bi desilo ništa loše potrebno je prvo da se poništi fleg koji je izazvao poziv prekidne funkcije, pa tek onda da se dozvole generalno ostali prekidi.

Čak može da se desi da je prekid x pozvao prekidnu funkciji px, pa da se posle nekoliko prekida u nekoj prekidnoj funkciji ponovo desi prekid x i pozove prekidna funkcija px. Ovo je slučaj kada u sistemu nalete skoro istovremeno više događaja koji izazivaju prekide.

Kada kažem da se neće desiti ništa loše, podrazumevam da je sistem prekida dobro kreiran. Naime, obrada u jednom prekidu mora biti kraća od periode pojave prekida. Ako ovo nije zadovoljeno onda neće biti ispravnog rada kada se ima i samo jedan prekid u sistemu. Dakle ako je ovaj uslov zadovoljen, uzimajući u obzir i trajanje prekidnih funkcija koje se mogu pokrenuti u prekidnoj funkciji koja dozvoljava generalno druge prekide onda je sve OK.

Priznajem da stvar nije jednostavna, ali ako se pažljivo radi onda je lako izvodljiva.

Pozdrav.

 
Odgovor na temu

ac1bd4
Stara Pazova

Član broj: 76735
Poruke: 437
*.dynamic.isp.telekom.rs.



+35 Profil

icon Re: AVR USATR ili interapti problem08.06.2011. u 12:30 - pre 155 meseci
Na stek stavlja samo flegove koji čine kontekst procesora, flegove koji upravljaju radom periferija ili signaliziraju radnje ne idu na stek, a na osnovu njih se generišu prekidi (ako su dozvoljeni) i kažem jedina greška koja može da se desi je da se neki od njih postavi više puta, a kada se dozvole prekidi izvrši samo jedan prekid odnosno propuste se neki prekidi. Ako je stigao samo jedan prekid na toj periferiji (npr. USART) taj prekid neće biti propušten, samo će sačekati da se završi onaj koji je stigao pre njega. Neće biti sve tako bajno ako dozvoli prekide u prekidnim rutinama. Svi će se izvršiti ako je ukupno trajanje dobro sračunato ali se neće sačuvati redosled izvršavanja. To možda neće da dovede do dobrih rezultata u sistemu koji je upravljan događajima kao što je taj robot. No možemo mi da razglabamo mesec dana, čoveka nema i možda je već rešio problem.
 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: AVR USATR ili interapti problem08.06.2011. u 15:03 - pre 155 meseci
Tu sam ja i naravno problem jos nije resen :D Ali nisam stigao da se pozabavim time, posto imam neki ispit u petak, ali za vikend cu definitivno probati :)

Ocigledno je da nisam bas dovoljno bio upoznat sa nekim stvarima, jer sada kada je korak to rekao detaljnije sam procitao datasheet i uvideo mozda neke greske... Naravno sve to moram da probam, a ne stizem ovih dana...

@ac1bd4 : I sumnjao sam na tako nesto, desi se neki prekid, medjutim ne moze odmah da se izvrsi jer neki drugi radi i ako se desi jos jednom, izgubi se prosto jedan prekid i to moze dosta da naskodi... I bila mi je ideja da neki prekidi mogu da prekidaju druge, ali ocigledno da nisam bas to najbolje uradio... Ima li neke veze prioritet prekida? Na primer: ako se dese dva prekida (Tajmer i serijska) dok je neki treci aktivan (drugi tajmer) i da se onda ne izvrse redosledno, nego onaj viseg prioriteta od ta dva? Moguce je da i tako nesto napravi problem..?

Hvala na trudu, mnogo mi pomazete u pokusaju da resim ovaj problem jer me nervira vec duze vreme!

Veliki pozdrav :)
 
Odgovor na temu

ac1bd4
Stara Pazova

Član broj: 76735
Poruke: 437
*.dynamic.isp.telekom.rs.



+35 Profil

icon Re: AVR USATR ili interapti problem08.06.2011. u 16:02 - pre 155 meseci
Ustvari sada vidim da atmega128 ne stavlja na stek ni flegove koji čine kontekst procesora, mora softverski. Prioritet prekida je određen brojem ulaza u IVT, manji broj ulaza ima veći prioritet i on će biti prvi izvršen. Da li će ti to napraviti probleme zavisi od tvog koda. Prioritete ne možeš da menjaš nego moraš da se organizuješ prema njima.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.rs.



+7 Profil

icon Re: AVR USATR ili interapti problem09.06.2011. u 19:06 - pre 155 meseci
Govorimo o serijskoj komunikaciji. Ako je ona, na primer, 9600 boda, od nje dolaze prekidi na približno 1ms. Obrada u prekidnoj funkciji, barem onako kako sam ti ja prezentirao, ne bi trebaki da traje duže od par desetina us, ne verujem da bi bilo više od 20us (verujem i manje). U tom slučaju bi kominikacija zauzimala 2% procesorskog vremena. Tih 20us ne može da ti smeta za rad sistema. Sa druge strane nesmeš da imaš ni jedan drugi prekid čija funkcija traji duže od 1ms jer možeš izgubizi neki bajt sa komunikacije.

Statusni registar koji stavljaš na stek sadrži generalnu dozvolu prekida, bit I. Kada se uđe u prekidnu funkciju, automatski se ovaj bit postavi da disejbluje prekide, ti ga dozvoli, ali ako se plašiš nekih drugih prekida, ti ih zabrani njihovim lokalnim maskama, pa onda dozvoli generalnu masku za prekide.

Kada bi zanao koje prekide imaš i koliko dugo se obrađuju bilo bi mi lakše da pomognem.

Pozdrav.

 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.dynamic.isp.telekom.rs.



+2 Profil

icon Re: AVR USATR ili interapti problem11.06.2011. u 14:58 - pre 155 meseci
Pozdrav svima :) Zavrsih sa ispitom, ostalo jos par :D

Ovo su prekidi :

USART1 - dva prekida za R i T... Baud rate = 57600
USART0 - samo za T... Baud rate = 9600 (bio je i 1200, ali nisam primetio ni poboljsanje ni pogorsanje ovom promenom baud rate-a)
Timer1 COMPA - na 1ms...

Mislim da je to sve, ali ne znam koliko mi traje funkcija unutar tajmerskog prekida, nisam nikada izmerio, ali ne bi trebalo puno, posto je to obican switch... Unutar tog tajmerskog interapta punim bafer i onda "ocekujem" da serijska to posalje...
Nadam se da cu uspeti sada malo da se pozabavim ovim i da pokusam da resim ovaj problem...

Hvala puno i veliki pozdrav!
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: AVR USATR ili interapti problem

[ Pregleda: 3071 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

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