Sari la conținut
ELFORUM - Forumul electronistilor

Limbaj de asamblare PIC16F84A


Nucleu

Postări Recomandate

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 spre comentariu
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • puiu

    2

  • Nucleu

    2

  • cirip

    1

  • Liviu M

    1

Top autori în acest subiect

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 spre comentariu

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

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