Jump to content
ELFORUM - Forumul electronistilor

Limbaj de asamblare PIC16F84A


Nucleu

Recommended Posts

Salut! Sunt "cel mai" incepator in programarea picurilor si

pentru inceput am achizitionat un programator/placa de dezvoltare K8048

http://alex.nickisco.com/wp-content/upl ... id-322.jpg

 

Odata cu placa am primit si un cd cu diferite programe demonstrative (*.asm).

 

Am luat aceste programe si am inceptu sa le modific dupa ce am mai studiat unele tutoriale si datasheetul de la Pic16F84 dar inca mai am neclaritati. Desi in fisierul de asamblare sunt si explicatii as fi recunoscator daca as primi niste explicatii si mai clare... :nas:

 

Am acesta rutina:

 

 

; **************************

; * delay routine: *

; **************************

DELAY

MOVLW D'150' ;* ;Put 150 decimal in the 'TIMER1' register.

MOVWF TIMER1 ;*

 

DELAY2

 

MOVLW D'150' ;Put 150 decimal in the 'TIMER2' register.

MOVWF TIMER2

DECFSZ TIMER2,F ;* ;Timer2 = Timer2 -1, skip next instruction if Timer2 = 0.

GOTO $-1 ;* ;Jump back 1 instruction.

 

DECFSZ TIMER1,F ;Timer1 = Timer1 - 1, skip next instruction if Timer1 = 0

GOTO DELAY2 ;Jump to 'DELAY2' routine

RETLW 0 ;Return (jump back to main) and load W-reg with 0.

 

 

 

Am incercat sa modific aceasta rutina si anume sa sterg timer1 din intreaga rutina...dar nu mai functioneaza nimic.

 

Ar putea cineva sa explice mai clar ce se intampla in codul asta si de ce este o asa mare dependenta intre "DELAY" si "DELAY2"?

 

Mersi! :freaza:

Link to comment
  • Replies 6
  • Created
  • Last Reply

Top Posters In This Topic

  • puiu

    2

  • Nucleu

    2

  • cirip

    1

  • Liviu M

    1

Top Posters In This Topic

Am incercat sa modific aceasta rutina si anume sa sterg timer1

De ce? Cu ce scop? Este absolut normal ca facand modificari la intamplare sa nu mai mearga.

Ar putea cineva sa explice mai clar ce se intampla in codul asta si de ce este o asa mare dependenta intre "DELAY" si "DELAY2"?

Poate ca dependenta nu e cuvantul potrivit. DELAY este numele rutinei. Apelarea ei se face cu "call DELAY".DELAY2 este o eticheta simbolica din interiorul rutinei. Undeva ai un GOTO DELAY2. Daca stergi eticheta, goto ramane cu o destinatie nerezolvata, adica nu stie unde sa se duca.Intelegerea functionarii programului se obtine prin simulare pas cu pas si urmarirea schimbarilor din registre. Orice program are o logica. Schimband ceva de dragul schimbarii duce, cel mai probabil, la erori de asamblare si/sau la nefunctionarea programului.Cirip
Link to comment

ce incercam eu de fapt a fost sa reduc timpul din rutina la jumatate...prin stergerea unui "timer" . Am sa vad ce pot sa rezolv cu MPLAB :freaza:

Link to comment

1. Pentru reducerea timpului la jumatate trebuie numai un timer modificat si anume TIMER1 in loc de 150 sa-l incarci cu 75.2.Vezi ca trebuie si variabile TIMER1 si TIMER2 sa fie declarate si alocate unde sunt. 3.Daca poti sa utilizezi MPLAB ar fi foarte indicat deoarece poti sa vezi cum se schimba valorile din registri TIMER1 si TIMER2.

Link to comment
  • 3 weeks later...

Am sa completez si eu cu cateva lucruri simple pentru a fi ceva mai clar.Ceea ce scriu este doar ca ideie nu le compilez, deci sa le verificati.Tu ai:DELAY ; eticheta, de fapt chestia asta nu exista in program ;(HEX), prin ea se intelege doar adresa instructiunii urmatoareMOVLW D'150' ; W=150MOVWF TIMER1 ; TIMER1=W=150DELAY2 nopnopnop;---------------------------------------------------------MOVLW D'150' ; W=150 .MOVWF TIMER2 ; TIMER2=150;---------------------------------------------------------;============================================DECFSZ TIMER2,F ;Fa TIMER2<-TIMER2-1 ; ",F"=pune rezultatul scaderii in TIMER2 GOTO $-1 ; Sari inapoi cu o instructiune; $=adresa curenta; Aici va fi TIMER2=150, 149,148,...........0. La 0 iese din ciclu.; Daca ai PIC la 4Mhz ai 4 perioade de tact/instructiune deci ;1us/instruct (1Minstructiuni/s); S-ar putea ca instructiunile care includ salt sa ia 2us, dar verifica; deci in total 151 ciclu ( daca ar fi sa luam si "0") a cate 2-3uS;============================================DECFSZ TIMER1,F ;GOTO DELAY2 ; Tot ce am marcat sus se repeta de TIMER1 ori; tot ce am marcat sus poate fi folosit singur pentru o intarziere de 300-500us ; aici poate fi folosit GOTO $-6; am folosit nop sa cada exact saltul asta "$-6" fara un calcul riguros.RETLW 0 ;Return Poti daca vrei sa eviti asta sa ii dai intarzierea extern.Ceva de genul(Pin1) ----RRRR-----(Pin2)-----CCCC-----(GND)Unde R-rezistenta, C-condensatorPoti sa reglezi timpul dintr-o rezistenta variabila.In felul asta se poate gandi si un "mini convertor A/D" citind un senzor care are raspuns "rezistiv"Pin1=output; din momentul in care primeste "1" se asteapta un timp pana cand Si Pin2=input ajunde la "1". Asta este delay-ul.In paralel cu condensatorul apre o rezistenta mare care sa il descarce.

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