Nucleu Postat Aprilie 28, 2010 Partajează Postat Aprilie 28, 2010 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... 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! Link spre comentariu
Liviu M Postat Aprilie 29, 2010 Partajează Postat Aprilie 29, 2010 http://ww1.microchip.com/downloads/en/D ... 33014h.pdf Link spre comentariu
cirip Postat Aprilie 29, 2010 Partajează Postat Aprilie 29, 2010 Am incercat sa modific aceasta rutina si anume sa sterg timer1De 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
puiu Postat Aprilie 29, 2010 Partajează Postat Aprilie 29, 2010 1. Daca ai fisierele in asm. ar trebui sa le simulezi cu MPLAM, un soft care este gratis pe site-ul producatorului MICROCHIP. Dupa ce le simulezi, ai sa poti sa faci pas cu pas si modificari si ai sa vezi ce poti sa faci si ce nu. 2. Situ-ul pentru MPLAB 8.50 este http://www.microchip.com/stellent/idcpl ... t=SW007002 . Link spre comentariu
Nucleu Postat Aprilie 29, 2010 Autor Partajează Postat Aprilie 29, 2010 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 Link spre comentariu
puiu Postat Aprilie 29, 2010 Partajează Postat Aprilie 29, 2010 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
Mondan Postat Mai 17, 2010 Partajează Postat Mai 17, 2010 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
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