Kreator Posted October 17, 2012 Share Posted October 17, 2012 Hi all!Cum se pot executa instructiunile dintr-un program in ritmul intreruperilor date de TMR0?Spre exemplu urmatoarele instructiuni vreau sa se execute pe rand doar cand apare intreruperea.PORTB = %0000PORTB = %0001PORTB = %0010PORTB = %0100PORTB = %1000 Link to comment Share on other sites More sharing options...
rus_dorin Posted October 17, 2012 Share Posted October 17, 2012 Cum se pot executa instructiunile dintr-un program in ritmul intreruperilor date de TMR0?Foarte simplu scrii instructiunile respective in rutina de tratare a intreruperii. Link to comment Share on other sites More sharing options...
Kreator Posted October 17, 2012 Author Share Posted October 17, 2012 cred ca nu m-am facut inteles...apare o intrerupere - se executa: PORTB = %0000mai apare o intrerupere - se executa: PORTB = %0001mai apare o intrerupere - se executa: PORTB = %0010s.a.m.d Link to comment Share on other sites More sharing options...
costi002 Posted October 17, 2012 Share Posted October 17, 2012 la fiecare intrerupere deplasezi registrul in stanga o pozitie Link to comment Share on other sites More sharing options...
Stefan Posted October 18, 2012 Share Posted October 18, 2012 de ce simplu cand se poate complicat contorizezi intreruperile cu variabila "d_c_s_c_s_p_c" si il pui pe procesor sa se intrebe ce face daca contorul e 1,2,3,4.... ... sau mai bine faci cum a zis costi ca e mut mai economic. Link to comment Share on other sites More sharing options...
Kreator Posted October 18, 2012 Author Share Posted October 18, 2012 Multumesc. Pana la urma asa am procedat. Am contorizat intreruperile si in funtie de nr alocat sa execute o subrutina. Link to comment Share on other sites More sharing options...
MatyC Posted October 18, 2012 Share Posted October 18, 2012 Ce vrei sa faci este un fel real-time esalonat in timp. Eu am facut un ceas cu afisare pe 4 digiti 7 segmente si gestionarea timpului in felul acesta. Roman Black a prezentat teoretic si practic cateva variante de real time pe uC. Ideea principala este utilizarea unui contor in cadrul intreruperilor si in programul principal executia conditionata a ceva in functie de valoarea contorului. Insa pentru ce vrei sa faci ma gandesc ca se poate rezolva doar cu rutina de intrerupere cu anumite restrictii. Link to comment Share on other sites More sharing options...
Kreator Posted November 15, 2012 Author Share Posted November 15, 2012 Revin cu o noua intrebare:Se cunosc 8 variabile x0...x7 de tip biteCum pot seta un port la valoarea acestor variabile? De ex PORTB = %x0,x1,...x7 intr-o singura linie de comanda (sau ai multe chiar dar nu atribuind PORTB0= x0, PORTB1 = x1 samnd.)Merci! Link to comment Share on other sites More sharing options...
Guest flopir Posted November 15, 2012 Share Posted November 15, 2012 Daca inteleg bine, cred ca vrei sa faci ceea ce se cheama in programare citire dintr-un vector. Pentru PIC, cel mai simplu, se poate folosi adresarea indirecta. In doua vorbe... declari variabilele una dupa alta, scri in registrul FSR adresa primei variabile, citesti/scri continutul acesteia din/in INDF, incrementezi FSR, etc... ,cand ajungi la ultima reinitializezi FSR. Pentru mai multe detalii iti recomand cu caldura datasheet-ul. Sper ca asta vrei sa faci.... Link to comment Share on other sites More sharing options...
bbogdanmircea Posted November 21, 2012 Share Posted November 21, 2012 Salutare.Aveti idee cate linii de cod pot fi scrise maxim in rutina de tratare a unei intreruperi.Am avut o problema de care mi-am dat seama cu mare greutate si stiu ca e din acesta cauza si de asta as vrea sa stiu pe viitor.Mai pe scurt in tratarea intreruperii de la T0 am pus:-sa incrementeze un contorMs-in functie de contorMs sa incrementeze un contorScontor10S=contorS%8Apoi tot in intrerupere afisam pe PORTB 2^contor10S si obtineam frumos pe PORTB un led care se misca frumos...Dupa asta am modificat si am pus pe PORTB un led cu 7 segmenteAm facut o functie led7seg care convertea dintr-un nr de la 0 la 9 in numarul care trebuie trimis pe PORTB ca sa afiseze pe segment...Ei bine din acest moment nu mai mergea nimic.Cu mare greutate dupa multe ore de masurat si chinuiala am luat-o de la capat si mi-am dat seama ca apelarea acestei ultime functii sarea cumva din spatiul alocat intreruperii si bloca tot PIC-ul.Asa ca am lasat in rutina de intreruperea doar calculul ptr ContorMs si ContorS si acum afisarea o fac in main si merge perfect!Asadar aveti idee care sunt limitarile legate de CE si CAT DE MULT COD se poate scrie in rutina de tratare a unei intreruperi?Merci! Link to comment Share on other sites More sharing options...
bbogdanmircea Posted November 21, 2012 Share Posted November 21, 2012 Scuze n-am vazut ca s-a postat deja Link to comment Share on other sites More sharing options...
Guest flopir Posted November 21, 2012 Share Posted November 21, 2012 O conditie "de baza" este ca durata de executie a codului de tratare a intreruperii sa nu depaseasca timpul pana survine alta intrerupere.... Nu exista limitari (in afara de spatiul de memorie) de genul numarului de linii de cod. Cel mai probabil la tine problema este faptul ca functia de convertire (probabil de genul PC+x) este in alta pagina de memorie fata de instructiunea care o apeleaza. Recomand sa citesti in datasheet mai multe destpre modul de organizare a memoriei la PIC-uri...sau, metoda rapida, sa aduci efectiv functia de conversie mai aproape de apelarea ei. Link to comment Share on other sites More sharing options...
Liviu M Posted November 21, 2012 Share Posted November 21, 2012 durata de executie a codului de tratare a intreruperii sa nu depaseasca timpul pana survine alta intrerupere....Din cate stiu eu, intreruperile sunt dezactivate automat la intrarea in rutina de tratare a intreruperilor. Caz in care nu mai vine alta. Cel putin asa e la 16F627: When an interrupt is responded to, the GIE is cleared to disable any further interrupt, the return address is pushed into the stack and the PC is loaded with 0004h. Link to comment Share on other sites More sharing options...
Guest flopir Posted November 21, 2012 Share Posted November 21, 2012 Absolut adevarat. Problema e ca se pierde intreruperea respectiva... Link to comment Share on other sites More sharing options...
Liviu M Posted November 22, 2012 Share Posted November 22, 2012 Pai da, da' daca am inteles eu ceva din problema, nu numai ca "rateaza" din intreruperi, da' o ia prin balarii si nu se mai intoarce. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.