Sari la conținut
ELFORUM - Forumul electronistilor

Executie linii program in ritmul intreruperilor


Kreator

Postări Recomandate

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
  • Răspunsuri 16
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Kreator

    4

  • Liviu M

    2

  • costi002

    2

  • bbogdanmircea

    2

Top autori în acest subiect

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

de ce simplu cand se poate complicat :rade: 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

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
  • 4 săptămâni mai târziu...

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

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

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
Vizitator flopir

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări