Sari la conținut
ELFORUM - Forumul electronistilor

help. pic 16F690


Vizitator gabi_g26

Postări Recomandate

Vizitator gabi_g26

Buna ziua,

 

Am inceput sa invat sa programez microcontrolere si m-am lovit de o situatie la care nu gasesc solutie.

Am scris urmatorul program si nu functoneaza cum ar trebui:

 

#include <p16F690.inc>__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)         org 0Start:     bsf     STATUS,RP0            bcf     TRISC,3               bcf     STATUS,RP0            clrf 	 PORTC	 bsf 	 STATUS ,RP0	 bsf 	 TRISA,3	 bcf 	 STATUS, RP0	 clrf 	 PORTA	 btfss 	 PORTA,3	 goto Start	 bsf     PORTC,3               	goto    $                     end
El ar trebui sa aprinda un led in momentul apasarii unui buton. Problema e ca in modul simulare al programului MPLAB merge(modul animatie), dar cand il incarc in microcontroler, ledul sta aprins indiferent de starea butonului.

Sper ca puteti sa ma ajutati.

 

Cu stima,

Gabi

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

Top autori în acest subiect

  • francezu

    2

  • adrian_pic

    1

Top autori în acest subiect

In primul rind nu ai un delay in program. Deci tu aprinzi ledul si apoi il stingi si tot asa , dar la o frecventa foarte mare!!! Si da programul iti functioneaza corect si face ce vrei tu doar ca tu cu ochiul liber nu-l poti vedea cum se stinge si cum se aprinde. De aceea trebuie sa faci asa: aprinzi ledul, apoi urmeaza un delay (o intarziere in care microcontrolerul nu face nimic) de 0.5 secunde sa zicem, apoi stingi led-ul si iar un delay de 0,5 secunde si apoi o ia de la inceput. Deci dupa ce aprinzi led-ul trebuie sa faci o pauza de 0,5 secunde , apoi stingi si iar pauza de 0,5 secunde. Stii sa faci acest delay in asm?Vezi ca este aici pe undeva cod cu asa ceva. Daca nu-l gasesti da un semn si o sa iti puna cineva codul. Si inca ceva, tu ai in codul tau in bucla START configuarea portului A si C. Scoatele din bucla START instructiunile de configuare ca nu este nevoie sa faci asta de fiecare data. Inainte de a intra in bucla START faci configurarea porturilor si apoi urmeaza bucla START.

Link spre comentariu

@gabi_g26 - Codul scris de tine e departe de a fi ceea ce trebuie. Incearca programul de mai jos, care la prima apasare a butonului aprinde led-ul, la a doua il stinge, apoi se repeta secventa. Am incercat sa comentez cat mai complet fiecare instructiune. Daca ai nelamuriri raspund cu placere. Pentru rutine de intarziere este foarte util program-ul de aici .

 

	list		p=16f690			; list directive to define processor	#include	<P16F690.inc>		; processor specific variable definitions		__CONFIG    _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF	errorlevel  -302              	; anuleaza mesajul de atentionare 302 ;---------------------------;;Declarare variabile		;;---------------------------;	cblock	0x20					; adresa registrilor de scop general	d1								; variabile folosite 	d2								; in rutina de intarziere	endc;----------------------------------;;Definire intrari/iesiri		   ;;----------------------------------;#define buton	PORTA,3		; push-buton legat la pinul RA3#define led		PORTC,3		; led legat la pinul RC3;----------------------------------	ORG		0x000			; processor reset vector;----------------------------------;;Configurare porturi si periferice ;;----------------------------------;	banksel	ANSEL			; selecteaza banca in care se afla registrul ANSEL	clrf	ANSEL			; dezactiveaza intrarile	clrf	ANSELH			; analogice	banksel	PORTA			; selecteaza bank0	clrf	PORTA			; preincarca valorile  	clrf	PORTB			; initiale	clrf	PORTC			; ale iesirilor	banksel	TRISA			; selecteaza bank1	movlw	b'00001000'		; PORTA- pin RA3 setat	movwf	TRISA			; configurat ca intrare	clrf	TRISB			; PORTB-toti pinii iesiri	clrf	TRISC			; PORTC-toti pinii iesiri	banksel	PORTA			; selecteaza bank0	Loop	btfsc	buton			; buton apasat?	goto	Loop			; nu, asteapta ca butonul sa fie apasat	call 	delay			; da, executa intarziere debouce	btfsc	buton			; inca apasat?	goto	Loop			; nu, asteapta reapasare							; da, basculeaza iesirea la care este cuplat led-ul	btfss	led				; daca led-ul este aprins	goto	$+3	bcf		led				; => stinge led	goto	$+2	bsf		led				; altfel aprinde led	btfss	buton			; buton eliberat?	goto	$-1				; nu, asteapta eliberarea butonului	call	delay			; da, executa intarziere debounce	btfss	buton			; buton eliberat?	goto	$-4				; nu, asteapta eliberarea butonului	goto	Loop			; da, proceseaza urmatoarea apasare a butonului.;----------------------------------------;; Rutina de intarziere pentru eliminarea   ;; efectului de vibratie a contactelor ;;----------------------------------------;delay						; intarziere de 50ms pentru ceas de 4MHz	movlw	0x0E	movwf	d1	movlw	0x28	movwf	d2Delay_0	decfsz	d1, f	goto	$+2	decfsz	d2, f	goto	Delay_0	goto	$+1	nop	return	end
Si schema:

Posted Image

Link spre comentariu
Vizitator gabi_g26

@gabi_g26 - Codul scris de tine e departe de a fi ceea ce trebuie. Incearca programul de mai jos, care la prima apasare a butonului aprinde led-ul, la a doua il stinge, apoi se repeta secventa. Am incercat sa comentez cat mai complet fiecare instructiune. Daca ai nelamuriri raspund cu placere. Pentru rutine de intarziere este foarte util program-ul de aici .

 

	list		p=16f690			; list directive to define processor	#include	<P16F690.inc>		; processor specific variable definitions		__CONFIG    _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF	errorlevel  -302              	; anuleaza mesajul de atentionare 302 ;---------------------------;;Declarare variabile		;;---------------------------;	cblock	0x20					; adresa registrilor de scop general	d1								; variabile folosite 	d2								; in rutina de intarziere	endc;----------------------------------;;Definire intrari/iesiri		   ;;----------------------------------;#define buton	PORTA,3		; push-buton legat la pinul RA3#define led		PORTC,3		; led legat la pinul RC3;----------------------------------	ORG		0x000			; processor reset vector;----------------------------------;;Configurare porturi si periferice ;;----------------------------------;	banksel	ANSEL			; selecteaza banca in care se afla registrul ANSEL	clrf	ANSEL			; dezactiveaza intrarile	clrf	ANSELH			; analogice	banksel	PORTA			; selecteaza bank0	clrf	PORTA			; preincarca valorile  	clrf	PORTB			; initiale	clrf	PORTC			; ale iesirilor	banksel	TRISA			; selecteaza bank1	movlw	b'00001000'		; PORTA- pin RA3 setat	movwf	TRISA			; configurat ca intrare	clrf	TRISB			; PORTB-toti pinii iesiri	clrf	TRISC			; PORTC-toti pinii iesiri	banksel	PORTA			; selecteaza bank0	Loop	btfsc	buton			; buton apasat?	goto	Loop			; nu, asteapta ca butonul sa fie apasat	call 	delay			; da, executa intarziere debouce	btfsc	buton			; inca apasat?	goto	Loop			; nu, asteapta reapasare							; da, basculeaza iesirea la care este cuplat led-ul	btfss	led				; daca led-ul este aprins	goto	$+3	bcf		led				; => stinge led	goto	$+2	bsf		led				; altfel aprinde led	btfss	buton			; buton eliberat?	goto	$-1				; nu, asteapta eliberarea butonului	call	delay			; da, executa intarziere debounce	btfss	buton			; buton eliberat?	goto	$-4				; nu, asteapta eliberarea butonului	goto	Loop			; da, proceseaza urmatoarea apasare a butonului.;----------------------------------------;; Rutina de intarziere pentru eliminarea   ;; efectului de vibratie a contactelor ;;----------------------------------------;delay						; intarziere de 50ms pentru ceas de 4MHz	movlw	0x0E	movwf	d1	movlw	0x28	movwf	d2Delay_0	decfsz	d1, f	goto	$+2	decfsz	d2, f	goto	Delay_0	goto	$+1	nop	return	end
Si schema:

Posted Image

Multumesc pentru raspuns si program. Nu stiu ce se intampla dar microcontrolerul meu se comporta la fel ca si inainte (si cu programul trimis de tine). Se aprinde ledul indiferent de starea butonului :( O fi o problema de hard? Circuitul si butonul le-am masurat si sunt ok.
Link spre comentariu

Incerca sa muti led-ul pe alta iesire, modificand si linia de program unde este definita iesirea :

#define led      PORTC,3      ; led legat la pinul RC3
; poate din greseala ai reusit sa arzi portul respectiv. Folosind programul postat de mine , dupa alimentarea montajului led-ul nu se aprinde decat la apasarea butonului.
Link spre comentariu
Vizitator gabi_g26

Incerca sa muti led-ul pe alta iesire, modificand si linia de program unde este definita iesirea :

#define led      PORTC,3      ; led legat la pinul RC3
; poate din greseala ai reusit sa arzi portul respectiv. Folosind programul postat de mine , dupa alimentarea montajului led-ul nu se aprinde decat la apasarea butonului.
Mi-a mers programul trimis de tine, am deconectat microcontrolerul de la programator si l-am conectat la o sursa externa de 5 V si a mers. Initial rulam programul cu programatorul conectat la microcontroler si cred ca reseta el cumva ceva pe acolo. Multumesc pentru program si pentru sfaturi!
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