XName Postat Aprilie 17, 2007 Partajează Postat Aprilie 17, 2007 Sunt incepator in microcontrolere. Am facut un programator care functioneaza, si acuma vreau sa fac ca un led pus pe RA1 sa lumineze si sa se stinga, la o apasare pe un buton conectat pe RB7. Am incercat cu intreruperi si asta este codul, nu pot sa inteleg de ce nu merge , ma poate ajuta cineva, pls: ;LED_CU_BUTON;acest fisier scoate pe pinul RA1 1 si 0 logic;in functie de butonul de pe RB7 ;14.04.2007 versiune 1.0#include p16F84a.incLIST p=PIC16F84A ;modelul de microcontroler__CONFIG _XT_OSC & _WDT_OFF;************** Structurarea memoriei program ***********************ORG 0x0000 ;Vectorul RESETgoto MainORG 0x0004 ;Vectorul INTRERUPEREgoto Mainorg 0x0010 ;Programul continua de la adresa 0010H;************** Programul principal *********************************RA1 EQU H'0001'Option_Temp EQU B'00000000'Stat_Temp EQU B'00000000'W_Temp EQU B'00000000'test EQU B'00000000'BANK0 macrobcf STATUS,RP0endmBANK1 macrobsf STATUS,RP0endmPUSH macromovwf W_Tempswapf W_Temp,fBANK1swapf OPTION_REG,Wmovwf Option_TempBANK0swapf STATUS,Wmovwf Stat_TempendmPOP macroswapf Stat_Temp,Wmovwf STATUSBANK1swapf Option_Temp,Wmovwf OPTION_REGBANK0swapf W_Temp,WendmISR_PORTBBANK0movfw PORTAmovwf testif test==0x2movlw b'00001111'movwf PORTAelsemovlw b'00000000'movwf PORTAendifPOPretfieMainBANK0clrf PORTBBANK1movlw B'10000000'movwf TRISBBANK0clrf PORTABANK1movlw B'00000000'movwf TRISABANK0clrf INTCONmovlw B'00001000'movwf INTCONbsf INTCON,GIELoopbtfsc INTCON, GIEPUSHbtfsc INTCON, RBIFgoto ISR_PORTBbsf INTCON, GIEgoto Loopend am mai incercat fara sa permit intreruperile dar tot nu inteleg de ce la conditia if nu se implineste si nu face ce trebuie LoopBANK0if PORTB==B'10000000'clrf PORTAelsemovlw b'00001111'movwf PORTAgoto Loopaici in ultima parte ar trebui cat timp este 1 pe RB7 sa lumineze ledurile pe portul a Multumesc, sper sa aflu enigma Link spre comentariu
CristianC Postat Aprilie 17, 2007 Partajează Postat Aprilie 17, 2007 1. Daca vrei sa faci un program simplu nu folosi intreruperi. 2. Instructiunile de genul if-else NU SE POT FOLOSI IN ASAMBLARE ex: ;LED_CU_BUTON ;acest fisier scoate pe pinul RA1 1 si 0 logic ;in functie de butonul de pe RB7 #include p16F84a.inc LIST p=PIC16F84A ;modelul de microcontroler __CONFIG _XT_OSC & _WDT_OFF BANK0 macro bcf STATUS,RP0 endm BANK1 macro bsf STATUS,RP0 endm *********************** ORG 0x0000 ;Vectorul RESET goto Main ;************** Programul principal ********************************* Main BANK0 clrf PORTB BANK1 movlw B'10000000' movwf TRISB BANK0 clrf PORTA BANK1 movlw B'00000000' movwf TRISA BANK0 Loop btfsc PORTB, 7 ;verific daca butonul este apasat, sar o instructiune daca nu bsf PORTA,1 ;aprind LED btfss PORTB, 7 ;verific daca butonul este apasat, sar o instructiune daca da bcf PORTA,1 ;sting LED goto Loop end Link spre comentariu
XName Postat Aprilie 17, 2007 Autor Partajează Postat Aprilie 17, 2007 Da este bun codul pe care lai facut, nus de ce eu credeam ca o sa il stinga si aprinda tot timpul cat ramane butonul apasatMersi de cod, o sa incerc asa , si tot va trebui sa invat si intreruperileIn legatura cu if si else de ce nu sunt acceptate in asamblare?mai ales ca cel putin in helpul de asamblare din MPLAB sunt trecute :)Si la compilare nu am primit nici macar o eroare cu toate ca este if in cod Link spre comentariu
TECH_FUN Postat Aprilie 17, 2007 Partajează Postat Aprilie 17, 2007 Cu mici modificari, prgm exemplu al lui CristianC nu va mai da erori la compilare... daca ne da voie, modificam codul a.i. matlab-ul sa creeze hex-ul. :yawinkle: asta daca crezi ca te ajuta. :smt005 am impresia ca am fost cu 15 min mai incet Link spre comentariu
XName Postat Aprilie 17, 2007 Autor Partajează Postat Aprilie 17, 2007 TECH care ar fi acele mici modificari? Link spre comentariu
TECH_FUN Postat Aprilie 17, 2007 Partajează Postat Aprilie 17, 2007 Am vrut sa zic 'corecturi'. sunt cateva erori provocate de graba: pe coloana 1 trebuie sa se gaseasca doar label-urile, celelalte pe alte coloane. Te rog schimba tu extensia din doc in asm, ca nu pot face upload la fisiere asm. Mai era si o directiva care elimina eroare 302 la compilare, dar nu mi-o amintesc acum... Dupa cate imi dau seama, prg lui cristianc va tine led-ul intr-o stare cat timp este apasat butonul, iar cand acesta se elibereaza, ledul isi schimba starea... Sper sa nu se supere ca i-am preluat codul si l-am modificat :prayer: Link spre comentariu
XName Postat Aprilie 17, 2007 Autor Partajează Postat Aprilie 17, 2007 mersi de codeu voiam sa fac un led la prima apasare de buton sa se aprinda , si o a doua apasare de buton sa se stinga, deaia consider ca e utila intrerupereaO sa mai incerc , sper sa iasa Link spre comentariu
cirip Postat Aprilie 18, 2007 Partajează Postat Aprilie 18, 2007 In legatura cu if si else de ce nu sunt acceptate in asamblare? Sunt acceptate, dar ca directive de asamblare conditionala, nu ca instructiuni. Directivele se adreseaza preprocesorului asamblorului, nu picului. Setul de instructiuni este cel de 35 de bucati din foaia de catalog. Numai pe alea le folosesti cand vrei sa ii spui picului ce sa faca mai ales ca cel putin in helpul de asamblare din MPLAB sunt trecute Foarte corect, sunt trecute, dar la ce categorie filozofica? Instructiuni sau directive?Succese succesive!Cirip Link spre comentariu
CristianC Postat Aprilie 18, 2007 Partajează Postat Aprilie 18, 2007 Cu mici modificari, prgm exemplu al lui CristianC nu va mai da erori la compilare... daca ne da voie, modificam codul a.i. matlab-ul sa creeze hex-ul. asta daca crezi ca te ajuta.Acele "mici erori" sunt doar warning-uri cu privire la aranjarea in pagina. Editorul forumului nu-mi permite sa aranjez codul cum mi-ar place.mersi de codeu voiam sa fac un led la prima apasare de buton sa se aprinda , si o a doua apasare de buton sa se stinga, deaia consider ca e utila intrerupereaO sa mai incerc , sper sa iasaUite un exemplu care sa faca ce vrei tu:ex: ;LED_CU_BUTON ;acest fisier scoate pe pinul RA1 1 si 0 logic ;in functie de butonul de pe RB7 #include p16F84a.inc LIST p=PIC16F84A ;modelul de microcontroler __CONFIG _XT_OSC & _WDT_OFF BANK0 macro bcf STATUS,RP0 endm BANK1 macro bsf STATUS,RP0 endm *********************** ORG 0x0000 ;Vectorul RESET goto Main ;************** Programul principal ********************************* Main BANK0 clrf PORTB BANK1 movlw B'10000000' movwf TRISB BANK0 clrf PORTA BANK1 movlw B'00000000' movwf TRISA BANK0 Loop btfss PORTB, 7 ;verific daca butonul este apasat, sar o instructiune daca da goto Loop ;astept apasarea butonului;--------------- Inversez starea LED-ului -------------------------btfss PORTA,1 ;verific daca LED-ul este aprins,sar o instructiune daca da goto $+3 ; sar 3 instructiuni inaintebcf PORTA,1 ;sting LED goto $+2 ; sar 2 instructiuni inaintebsf PORTA,1 ;aprind LED ;-----------------------------------------------------------------------call Delay btfsc PORTB, 7 ;verific daca butonul este apasat, sar o instructiune daca nu goto $-1 ;sar o instructiune inapoi, astept eliberarea butonuluicall Delaygoto Loop;******************************************************* ;******************************************************* ;********************** Functia Delay ********************* Delay;aceasta functie va fi completata in episodul urmatorreturn;******************************************************* endExemplu de mai sus este corect dar nu filtreaza oscilatiile datorate contactului mecanic al butonului. Ca sa elimini aceasta problema trebuie sa introduci o intarziere (Delay) intre testarile butonului. Durata intarzierii trebuie sa fie mai mare decat durata oscilatiilor mecanice (20ms ar trebui sa ajunga) Link spre comentariu
XName Postat Aprilie 18, 2007 Autor Partajează Postat Aprilie 18, 2007 Stiam ca din pacate butoanele nu inchid perfect din prima, dar am considerat sa nu incerc si un macro de intarziere se complica treaba mai mult. Dar contactul imperfect al unui buton nu poate fi eleiminat cu un condensator in paralel de cativa pico??Mersi de cod, sunt curios cum vei face macro Delay Link spre comentariu
CristianC Postat Aprilie 18, 2007 Partajează Postat Aprilie 18, 2007 Daca vrei filtru hardware pune un condensator de 100nf in paralel cu butonul Daca vrei filtru software: ;****************** Functia Delay ********************* cblock 0x1Cdelay1 ;declar variabiledelay2 endcDelay ; aproximativ 3*256*24= 18,4ms (daca folosesti quartz de 4 MHz) movlw .24 movwf delay1 clrf delay2 decfsz delay2,f goto $-1 decfsz delay1,f goto $-3 return ;*************************************************** Link spre comentariu
XName Postat Aprilie 18, 2007 Autor Partajează Postat Aprilie 18, 2007 Nu reusesc sa inteleg aceasta intarziereMa incurc la decfz delay2, fDupa cum am citit eu f trebuie sa fie in 0 si 127, tu de ce nu specifici aici cat este f , si de ce il folosesti asa direct, ca nu e definit niciunde fNar fi mai util sa pun 0 sau 1 in loc de f? Link spre comentariu
CristianC Postat Aprilie 18, 2007 Partajează Postat Aprilie 18, 2007 decsfz delay2, f f = 1w = 0 Eu folosesc f (file register) si w (WREG) pentru ca este mai sugestiv Al doilea parametru al instructiunii decfsz reprezinta destinatia. In cazul tau f reprezinta delay2 Link spre comentariu
XName Postat Aprilie 18, 2007 Autor Partajează Postat Aprilie 18, 2007 Am vrut sa maresc timpul pt functia de delay, ca sa o folosesc la o fuga de luminca pe portul b , dar nu merge Delay ; aproximativ 3*256*24= 18,4ms (daca folosesti quartz de 4 MHz) movlw .24 movwf delay1 clrf delay2 clrf delay3 decfsz delay3,f goto $-1 decfsz delay2,f goto $-3 decfsz delay1,f goto $-5 return Link spre comentariu
CristianC Postat Aprilie 18, 2007 Partajează Postat Aprilie 18, 2007 Mai multe despre rutinele delay: http://www.elforum.info/viewtopic.php?t=17976 Rutina Delay pe care ai scris-o este corecta Timpul de executie pentru delay-ul tau este de : 4.730931 secunde 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