Jump to content
ELFORUM - Forumul electronistilor

Intrebare despre intreruperi


Mar

Recommended Posts

Nu am folosit intreruperi decit toif pentru TMR0 deaceea vreau sa va intreb inainte sa fac vreo prostie. Din cite am inteles din sursele de la Microchip pentru un 16F877 pot lucra cu intreruperi externe numai cu bitii 4,5,6,7.Este adevarat?????? :?:Eu cred ca intreruperile trebuie initializate astfel:bsf INTCON,GIEbsf INTCON,INTEbcf INTCON,TNTFdupa aceea cind se realizeaza o intrerupere eu trebuie sa pun bcf INTCON, INTFCe ziceti e bine? -Pot folosii intreruperi externe pe alte porturi?Si inca o intrebare-Care e diferenta intre INTCON din bank0 si INTCON dinbank1 in sensul ca se pot accesa aceiasi registri?

Link to comment
  • Replies 19
  • Created
  • Last Reply

Top Posters In This Topic

  • Mar

    10

  • bogdanm

    5

  • cirip

    5

intreruperi externe numai cu bitii 4,5,6,7.Este adevarat??????

Daca scriai "bitii 4,5,6,7 ai portului B", era partial adevarat. Si RB0 poate fi configurat ca sa accepte intreruperi externe.

 

Eu cred ca intreruperile trebuie initializate astfel:

bsf INTCON,GIE

bsf INTCON,INTE

bcf INTCON,TNTF

Eu prefer sa activez GIE ultimul, nu primul.

"TNTF" nu exista. Cred ca ai vrut sa scrii INTF. Nu vreau sa fac exces de zel, nu-mi pasa de greseli de tipar sau chiar grmaticale, dar asamblorul nu te iarta daca ii scrii un simbol nedefinit. :)

 

bcf INTCON, INTF

Ce ziceti e bine?

Corect.

 

-Pot folosii intreruperi externe pe alte porturi?

Eu inteleg ca nu. B este singurul prin care i se pot da intreruperi externe.

 

Care e diferenta intre INTCON din bank0 si INTCON din

bank1 in sensul ca se pot accesa aceiasi registri?

Ideea e ca accesul lui INTCON se face fara sa fie necesara comutarea adresei de bank. La operarea celorlalte registre, nu uita sa faci selectia corecta a bankului inainte de a le adresa. Eu m-am fript de multe ori cu chestia asta.

 

Ti-am mai raspuns la doua posturi si m-ai lasat cu ochii in soare. Ai inteles, n-ai inteles? Ti-a folosit la ceva ce-am scris acolo sau am latrat la luna?

 

Dom' Vasile, cred ca ar trebui facuta o lista cu cei care arunca o piatra in balta (posteaza), lumea sare sa scoata piatra, iar respectivii nu mai zic nimic, in asa fel incat nu stii daca ai vorbit ca televizorul sau nu... De banalul "multumesc", ce sa mai zic?! Nu de alta, dar pe mine ma irita sa ma strofoc sa ii explic cuiva ceva, dupa care ala sa ma lase in mijlocul drumului. Adica eu pentru ce mi-am pierdut timpul?

 

Cirip

Link to comment

Iti multumesc pentru raspunsurile pe care mi le-ai dat, 70% din ele le-am aplicat si 30% nu e de nasul meu. Nu ti-am raspuns pentru ca mi-am prins urechile intr-un program si de o saptamina tot incerc sa vad ce nu merge.Cu simulatorul MPLAB nu pot sa vad pentru ca folosesc intrari analogice si digitale si nu pot simula.Cred ca ar fi de folos un emulator dar cer cam mult.Ai dreptate, bitul TINTF nu exista, a fost o greseala de scriere.

Link to comment

Dom' Vasile, cred ca ar trebui facuta o lista cu cei care arunca o piatra in balta (posteaza), lumea sare sa scoata piatra, iar respectivii nu mai zic nimic, in asa fel incat nu stii daca ai vorbit ca televizorul sau nu... De banalul "multumesc", ce sa mai zic?! Nu de alta, dar pe mine ma irita sa ma strofoc sa ii explic cuiva ceva, dupa care ala sa ma lase in mijlocul drumului. Adica eu pentru ce mi-am pierdut timpul?

Cirip

Eu propun si altceva, in afara de asta, dar probabil se va oftica lumea. Propun ca singurul raspuns la intrebarile care se pot lamuri fara probleme doar citind manualul sa aiba ca singur reply "RTFM", urmat de blocarea subiectului si de stergerea lui peste cateva zile :evil: Zau, si mie imi place sa ajut oamenii, dar nici asa. Mar, tot ce trebuia sa faci era sa citesti manualul microcontroller-ului cu atentie. Sau macar sa-l citesti. Scrie acolo tot ce trebuie.
Link to comment

mar

folosesc intrari analogice si digitale si nu pot simula

Se pot simula si intrarile analogice, foarte usor si prin cel putin 2 metode.1)imediat dupa citirea convertorului A/D inserezi o instructiune care scrie w-ul peste valoarea citita. Asta e numai la test. w-ul va fi scris prin citirea unui registru din spatiul de memorie. de ex faci ceva gen "movf temp,w", iar in temp pui valoare analogica de test. Practic, la simulare vei introduce tu marimile analogice in secventa dorita.Sau, daca vrei sa fii mai rafinat, faci asamblare conditionata cu un #ifdef si cu care inlocuiesti citirea ADului cu o incarcare chioara a lui w cu un esantion extern.2)Creezi un tabel cu esantioanele semnalului analogic. La testare, citesti elementele tabelului unul cate unul si le scrii in w, peste citirea A/Dului.Simularea digitala e LMC. Iti faci fisiere stimul si te joci cum vrei.Daca ai intrebari suplimentare, cred e preferabil sa spui ce n-ai inteles. Nu e exclus ca nici "explicatorul" sa nu fie foarte clar. Esential este dialogul.bogdanm,N-as fi asa de dur. Uneori manualele sunt destul de babane si oamenii vor rezultate ... ieri. Poate ca o explicatie sumara si o sugestie de genul "citeste capitolul x.x sau pagina y din manual" ar fi acceptabile de cateva ori. Cu recidivistii e altceva :) Dar, nu contest ca intrebarile pe forum isi au rostul dupa ce omul "si-a facut lectiile". Adica, arata ce ai incercat si n-a mers, nu cere sa munceasca altcineva in locul tau (exprimare la modul impersonal; nu vizeaza pe nimeni in particular). Si as mai ruga pe cei care pun intrebari sa nu posteze n ecrane de cod, cand de fapt problema se poate descrie in 10 linii. La surse de peste 1 ecran jumate io nici nu ma mai uit.Cirip
Link to comment

am tot incercat sa acesez intreruperea de pe RB0 si nu merge de loc cu acesta secventa , nu e buna secventa? bsf INTCON,GIE bsf INTCON,INTE bcf INTCON,INTF call delay a btfsc INTCON,INTF call int goto a int bsf PORTA,2 bcf INTCON,INTF returncind apas butonul RB0 trebuie sa cheme int si sa aprinda ledul de pe RA2merg pe logica negativa la PORTBDaca simulez cu MPLAB si introduc eu o valoare luata din temp nu schimba nimic pe intrari la PORTBTe rog sa ma ajuti si pe mine cu aceasta problema.

Link to comment

Salut,Cred ca e o neintelegere fundamentala a operarii intreruperilor. Intreruperea nu "o chemi" cu call int. La intrerupere te trimite hardware-ul. 1)Citeste in manual ce se intampla la aparitia oricarei cereri de intrerupere... 2)Citeste in manual cum se iese din intrerupere. "return" nu este corect.3)Care este scopul lui call delay?

nu merge de loc

Exprimarea este vaga. Ce te astepti sa faca si nu face? De unde stii ca nu face?Pana la simulare si creearea unui stimul, cred ca trebuie sa citesti si sa intelegi capitolul despre intreruperi. Daca as fi in locul tau, as incepe cu simularea intreruperilor de la timer, ca sa nu ma complic cu stimuli externi, asta asa pentru inceput. Dupa ce te lamuresti care e mecanismul intreruperilor interne, poti sa treci pe externe.EDIT: Site-ul Microchip contine sute de note de aplicatie. Cea de la adresa: http://ww1.microchip.com/downloads/en/A ... 00566b.pdf trateaza intreruperile externe aplicate la portul B4...7Cirip
Link to comment
Mar, fara nici o rautate acum: ce trebuie sa faci tu e sa iei manualul PIC-ului si sa-l citesti. Nu neaparat din scoarta in scoarta (poti de exemplu sa sari peste partea care explica in detaliu fiecare instructiune in parte), important e sa intelegi lucrurile de baza. Printre astea se numara si comportarea in intreruperi. O sa vezi acolo ca atunci cand apare o intrerupere PIC-ul iti cheama automat rutina corespunzatoare de tratare a intreruperii. Si poate atunci o sa ti se para putin mai clar. Serios, manualul ala nu e nici pe departe atat de greu cat pare. In general sunt scrise in stilul "idiot proof" (nu glumesc, chiar asa se cheama), astfel incat sa le poata intelege oricine care are un pic de rabdare. Bafta!
Link to comment

Multumesc pentru documentatia ta, cu intreruperile interne (TMR0) am lucrat si functioneaza.In loc de return folosesc retfie pentru ca seteaza automat GIE. cu call int nu chem intreruperea, eu chem o secventa care contine diferite instructiuni printre care sterge si INTF, int este o eticheta.Intreruperea o testez cu btfsc INTCON,INTF cind INTF e 1 logic cheama subrutina int.Am dreptate???

Link to comment

Multumesc pentru documentatia ta, cu intreruperile interne (TMR0) am lucrat si functioneaza.In loc de return folosesc retfie pentru ca seteaza automat GIE. cu call int nu chem intreruperea, eu chem o secventa care contine diferite instructiuni printre care sterge si INTF, int este o eticheta.

Intreruperea o testez cu btfsc INTCON,INTF cind INTF e 1 logic cheama subrutina int.Am dreptate???

Mar, recunosc ca nu am inteles, poate ma ajuti si pe mine nitel. Chiar tu spui ca ai lucrat cu intreruperile interne. Deci cand INTF ala devine 1 PIC-u iti cheama oricum subrutina de tratare a intreruperii. Eu nu inteleg de ce in conditiile astea mai faci si tu o verificare de INTF ... nu poti sa muti tot ce ai de facut atunci cand apare un INTF in subrutina de tratare a intreruperii? Sau se intampla ceva mai complex si imi scapa mie?
Link to comment

Da, INTF se modifica automat cind apare o intrerupere adica va trece pe 1 logic, dar de unde stie pic-ul ca a fost o intrerupere daca nu testeaza si daca a fost sa cheme o subrutina???

Link to comment

Da, INTF se modifica automat cind apare o intrerupere adica va trece pe 1 logic, dar de unde stie pic-ul ca a fost o intrerupere daca nu testeaza si daca a fost sa cheme o subrutina???

Cu riscul de a a deveni (prea) pisalog, revin cu aceeasi recomandare: citeste manualul. Pana atunci, uite cum se intampla treaba in cateva cuvinte. In momentul in care ai activat din program INTE si GIE, PIC-ul va sti AUTOMAT sa-ti cheme vectorul de intrerupere cant INTF trece in 1! NU trebuie sa testezi tu explicit INTF. Asta e tot sensul intreruperii: e asincrona, poate intrerupe programul, pentru ca e generata de HARDWARE! Tu NU trebuie sa faci nimic pentru a genera intreruperea.
Link to comment

dar de unde stie pic-ul ca a fost o intrerupere

Mar, intrebarea asta arata inca o data ca este necesar sa citesti manualul.Daca "intreruperea" de la TMR0 ai detectat-o prin inspectia lui T0IF, asta inseamna ca de fapt nu ai lucrat pe intreruperi. Intreruperea are menirea sa degreveze procesorul de uitatul la un bit, in bucla de asteptare, timp in care nu mai poate sa faca mai nimic altceva. Ideea intreruperii este ca procul sa isi vada de treaba sau chiar sa doarma si sa il trezeasca intreruperea cand ii e lumea mai draga. Tehnica pe care ai aplicat-o, desi este in principiu functionala, nu este optima dpdv a eficientei codului. Metoda se numeste poling.Imagineaza-ti ca ai de citit esantioane la fiecare 100us si trebuie sa le faci ceva, o procesare pana cand vine esantionul urmator. De exemplu rulezi un filtru digital. Ai foarte mult de calculat ptr asta. Daca procul pierde timpul uitandu-se la un flag, nu mai apuci sa faci calculele necesare pana cand vine peste tine esantionul urmator. Ce zici? Are sens?Cirip
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines