Kreator Postat Octombrie 17, 2012 Partajează Postat Octombrie 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 spre comentariu
rus_dorin Postat Octombrie 17, 2012 Partajează Postat Octombrie 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 spre comentariu
Kreator Postat Octombrie 17, 2012 Autor Partajează Postat Octombrie 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 spre comentariu
costi002 Postat Octombrie 17, 2012 Partajează Postat Octombrie 17, 2012 la fiecare intrerupere deplasezi registrul in stanga o pozitie Link spre comentariu
Stefan Postat Octombrie 18, 2012 Partajează Postat Octombrie 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 spre comentariu
Kreator Postat Octombrie 18, 2012 Autor Partajează Postat Octombrie 18, 2012 Multumesc. Pana la urma asa am procedat. Am contorizat intreruperile si in funtie de nr alocat sa execute o subrutina. Link spre comentariu
MatyC Postat Octombrie 18, 2012 Partajează Postat Octombrie 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 spre comentariu
Kreator Postat Noiembrie 15, 2012 Autor Partajează Postat Noiembrie 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 spre comentariu
Vizitator flopir Postat Noiembrie 15, 2012 Partajează Postat Noiembrie 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 spre comentariu
bbogdanmircea Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 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 spre comentariu
bbogdanmircea Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Scuze n-am vazut ca s-a postat deja Link spre comentariu
Vizitator flopir Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 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 spre comentariu
Liviu M Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 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 spre comentariu
Vizitator flopir Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Absolut adevarat. Problema e ca se pierde intreruperea respectiva... Link spre comentariu
Liviu M Postat Noiembrie 22, 2012 Partajează Postat Noiembrie 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 spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum