Sari la conținut
ELFORUM - Forumul electronistilor

ajutor proiect pic 16f84


elcomar

Postări Recomandate

Trebuie sa faci ceea ce ti-am spus in mesajul anterior : trebuie sa inveti assembler. Asm-ul nu este chiar asa "user friendly", nu este nici greu dar, nu poti sa modifici la intamplare doar niste valori numerice, sau altceva , si sa te astepti sa mearga asa cum vrei; trebuie sa intelegi programul, sa stii ce face fiecare linie din acesta. Net-ul este plin de tutoriale si exemple in assembler, poti invata si singur, cum de-altfel au facut multi, numai vointa sa fie. Incepi mai intai cu aplicatii simple ,gen licurici, apoi treci la altele mai complexe. Cand nu intelegi ceva, ne poti cere ajutorul.Daca nu esti interesat sa inveti vre-un limbaj de programare,si contactul cu uC-uri este doar unul pasager, spune-mi si iti modific eu programul asa cum doresti.

Link spre comentariu
  • Răspunsuri 43
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • elcomar

    20

  • francezu

    12

  • puiu

    11

Top autori în acest subiect

  • 1 lună mai târziu...

as putea sa modific programul pentru 16f84 ca sa mearga cu PIC12F629I/P ? sau mai bine zis trebuie modificat? ce trebuie sa modific? (e vorba de programul de mai sus)

Link spre comentariu

Da, se poate porta programul pe pic12f629. Trebuiesc modificate in primul rand adresele la care se aloca variabilele- 12f629 are inceputul gpr-urilor la alta adresa fata de 16f84. Apoi trebuie dezactivat modulul comparator din 12f629, in cazul in care vei folosi oscilatorul intern trebuie introdusa si o rutina de recuperare a valorii osccal, si cel mai important trebuiesc redefiniti pinii IO si reconfigurat registrul TRISIO( in loc de TRISA si TRISB)Detaliile despre cele de mai sus le gasesti cu siguranta in dataseet :da

Link spre comentariu

1. Si bineinteles trebuie sa inlocuiesti unele comenzi pe care le ai in PIC16 si nu le ai in familia PIC12. Trebuie sa stii ca familia PIC12 este cu instructiuni scrise pe 12 biti, pe cand familia PIC16 are instructiunile pe 14 biti, iar PIC18 este pe 16 biti. Deci ai mai multe instructiuni in familia lui PIC16 ca unul din familia PIC12. Daca vrei sa programezi unul din familia PIC12, trebuie sa ai mai putine instructiuni(ca tip), deci vei avea mai multe linii de programare, deoarece va trebui sa descri instructiuni din familia lui PIC16 cu instructiuni recunoscute de PIC12.

Link spre comentariu
  • 9 luni mai târziu...

ma puteti ajuta si pe mine cu acest cod sursa? as vrea ca sa functioneze la fel numai ca timpul de pornire sa fie 5 minute, nu 5 secunde iar dupa ce isi va face ciclul pe cele 2 iesiri sa nu mai porneasca daca butonul este retinut in continuu ci doar daca este deschis si apoi reinchisaici atasez si codul sursa, multumesc:list p=16F84A ; list directive to define processor#include ; processor specific variable definitions__CONFIG 0x3FF2errorlevel -302 cblock 0x0Cw_tempstatus_tempd1d2d3counterendc;**********************************************************************TP equ .5 ;timp pornire (s)DI equ .5 ;durata impuls (s)DP equ .50 ;durata pauza (s);**********************************************************************#define PB PORTA,1#define L1 PORTA,2#define L2 PORTA,3;**********************************************************************ORG 0x000 ;Configclrf PORTAclrf PORTBbanksel TRISAmovlw 0x02movwf TRISAclrf TRISBbanksel PORTA;------------------------------------------------Loopbtfsc PBgoto $-1call debbtfsc PBgoto Loopmovlw TP*.20movwf counterwrcall deb btfsc PB goto Loop decfsz counter,f goto wr bsf L1movlw DImovwf counterl2call D1sdecfsz counter,fgoto l2bcf L1movlw DPmovwf counterl3call D1sdecfsz counter,fgoto l3bsf L2movlw DImovwf counterl4call D1sdecfsz counter,fgoto l4bcf L2call D1s goto Loopdeb ;debounce delay ,50ms;99993 cyclesmovlw 0x1Emovwf d1movlw 0x4Fmovwf d2Delay_0decfsz d1, fgoto $+2decfsz d2, fgoto Delay_0;3 cyclesgoto $+1nop;4 cycles (including call)returnD1s ;1s delay;1999996 cyclesmovlw 0x11movwf d1movlw 0x5Dmovwf d2movlw 0x05movwf d3Delay_1decfsz d1, fgoto $+2decfsz d2, fgoto $+2decfsz d3, fgoto Delay_1;4 cycles (including call)returnEND ; directive 'end of program'

Link spre comentariu

Ti-am modificat codul astfel incat se pot obtine valori mai mari pt TP ( pana la 65535 secunde- 16 biti ).

list p=16F84A ; list directive to define processor	#include <p16F84A.inc> ; processor specific variable definitions	__CONFIG 0x3FF2	;========= 8 MHz clock ============		errorlevel -302	cblock 0x0C	w_temp	status_temp	d1	d2	d3	counterH	counterL	secs_cnt	endc;**********************************************************************TPH equ .1  ;timp pornire MSB    timp pornire (s) = TPH*256 + TPLTPL equ .44 ;timp pornire LSB DI equ .5 ;durata impuls (s)DP equ .50 ;durata pauza (s);**********************************************************************#define PB PORTA,1#define L1 PORTA,2#define L2 PORTA,3;**********************************************************************	ORG 0x000;Config	clrf	PORTA	clrf 	PORTB	banksel	TRISA	movlw 	0x02	movwf 	TRISA	clrf 	TRISB	banksel PORTA;------------------------------------------------Loop	btfsc 	PB	goto 	$-1	call 	deb	btfsc 	PB	goto 	Loop	movlw 	TPH					; preload counter	movwf 	counterH	movlw	TPL	movwf	counterL	movlw	.20	movwf	secs_cnt			; preload seconds counterwr	call 	deb	btfsc 	PB	goto 	Loop	decfsz 	secs_cnt,f	goto 	wr	movlw	.20	movwf	secs_cnt			; preload seconds counter;--		tstf	counterL			; if low byte>0 then	btfss	STATUS,Z				goto	decrem_lo			; 	decrement it								; else	tstf	counterH			; if high byte=0 then	btfsc	STATUS,Z	goto	Begin					;  timeout, exit loop	movlw	.255				; else		movwf	counterL			; preload low byte	decf	counterH,f			; and decrement high byte	goto 	wr	decrem_lo	decfsz	counterL,f			; decrement low byte	goto	wr	tstf	counterH			; if counter>0	btfss	STATUS,Z	goto	wr					; stay in loop								; else timeout, exit loopBegin	bsf 	L1	movlw 	DI	movwf 	counterLl2	call 	D1s	decfsz 	counterL,f	goto 	l2	bcf 	L1	movlw 	DP	movwf 	counterLl3	call 	D1s	decfsz 	counterL,f	goto 	l3	bsf 	L2	movlw 	DI	movwf 	counterLl4	call 	D1s	decfsz 	counterL,f	goto 	l4	bcf 	L2	wr2						; wait button release	btfss	PB	goto	wr2	call	deb	btfss	PB	goto	wr2	goto 	Loop		; releaseddeb ;debounce delay ,50ms;99993 cycles	movlw 	0x1E	movwf 	d1	movlw 	0x4F	movwf 	d2Delay_0	decfsz 	d1, f	goto 	$+2	decfsz 	d2, f	goto 	Delay_0;3 cycles	goto 	$+1	nop;4 cycles (including call)	returnD1s ;1s delay;1999996 cycles	movlw 	0x11	movwf 	d1	movlw 	0x5D	movwf 	d2	movlw 	0x05	movwf 	d3Delay_1	decfsz 	d1, f	goto 	$+2	decfsz 	d2, f	goto 	$+2	decfsz 	d3, f	goto 	Delay_1;4 cycles (including call)	return	END ; directive 'end of program'
Link spre comentariu

functioneaza, multumesc numai ca nu mai pot modifica timpul de pornire/ sau modific eu unde nu trebuie (am schimbat 44 cu 11 si nu s-a schimbat nimic dar am un quart de 4 Mhz)unde trebuie sa schimb ca sa mearga la 5 minute si pe 4 Mhz?

Link spre comentariu

In codul postat de mine mai sus scrie clar

;========= 8 MHz clock ============
deci este pentru cristal de 8 MHz. Pentru a functiona pe 4 Mhz trebuiesc recalculate rutinele de intarziere, cea de 50ms - denumita "deb"; si cea de 1s - denumita D1s. Pentru generarea rutinelor de intarziere foloseste calculatorul de AICI

Pentru calcularea timpului este scris in cod la comentariu. Pt ca in asm nu poti defini variabile mai mari de 8biti se recurge la un artificiu, concatenand mai multi bytes.In cazul variabilelor pe 2 bytes, cel mai semnificativ are o pondere de 256 ori mai mare decat cel mai putin semnificativ. De aici rezulta formula de calcul pt variabila de 2 bytes : N=256*MSB+LSB. Daca de exemplu vrem N=2535, atunci MSB=9 si LSB= 231; astfel 256*9 +231 = 2535. In cod TP poate lua valori de la 0 la 65535 secunde, cu rezolutie de 1s. In codul postat anterior TP= 5min= 300s= 256*1 +44 ( pt ceas de 8 mega)/

Link spre comentariu

poti sa mai verifici putin codul? ar trebui ca dupa ce face primul ciclu (adica daca tin butonul inchis 5 minute sa am iesire pe cele 2 iesiri asa cum era descris la inceputul proiectului) dar sa nu mai porneasca daca butonul ramane inchis decat daca butonul este deschis si apoi reinchis (timp de 5 minute)sper sa intelegeti ce am vrut sa spunFaza este ca a mers ok 2 zile iar acum a dat o eroare: a pornit si a doua oara ciclul ceea ce nu trebuia sa se intample pentru ca nu a deschis nimeni intrerupatorul kMentionez ca toate astea le fac pe o placa de test iar la iesiri am conectat cate un mic buzzer.

Link spre comentariu

Ma astept sa ai un intrerupator acolo si nu un buton pe care sa-l tii apasat 5min; este conectat ca in schema trimisa ? adica intre pinul 18 si masa cu pull-up de 10kohmi. Teoretic nu ar trebui sa treaca de ultima rutina "wr2" daca nu se deschide intrerupatorul. Incearca sa maresti delay-ul pt debounce apeland de mai multe ori rutina "deb":

wr2                  ; wait button release   btfss   PB   goto   wr2   call   deb   call   deb   btfss   PB   goto   wr2   goto    Loop      ; released
Link spre comentariu

este conectat ca in schema si mentionez ca nu a facut aceasta problema decat o singura data, moment in care era deasupra masinii de spalat care era in stare de functionare (pe bune).Sa fi prins ceva paraziti? dar cum? montajul era conectat la o baterie, nu la retea. Am repetat testul acum in camera si aici nu am nici o problema. p.s. butonul este unul de tip basculant :) nu stau cu degetul pe el

Link spre comentariu

Sa fi prins ceva paraziti?l

Posibil. Daca nu ai inca, pune un cond ceramic de 100-470nF cat mai aproape de pinii de alimentare ai Pic-ului si eventual alimenteaza-l si prin stabilizator :7805 , etc.
Link spre comentariu

are stabilizator 7805, condensator nu am decat la incarcatorul pentru baterie/1000 micro dar in momentul cu problema era decuplat. Sper din toata inima sa fi fost de la paraziti. Data viitoare o sa acord mai multa atentie filtrajului, e bine ca am ajuns si aici :) deci procesoarele sunt sensibile

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