Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
XName

Cel mai simplu cod pt PIC16F84A

Recommended Posts

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 Loop
aici in ultima parte ar trebui cat timp este 1 pe RB7 sa lumineze ledurile pe portul a

 

Multumesc, sper sa aflu enigma

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 :)

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 iasa

Uite 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)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ;***************************************************

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

decsfz delay2, f

 

f = 1

w = 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • 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.