Sari la conținut
ELFORUM - Forumul electronistilor

PIC 16f877A Led blink (sunt amator)


Vizitator ROCrysty

Postări Recomandate

Vizitator ROCrysty

Buna ziua. Am programat un pic16F877A cu urmatorul cod:

LIST	p=16F877A		;tell assembler what chip we are using	include "P16F877A.inc"		;include the defaults for the chip	__config 0x3D18			;sets the configuration settings (oscillator type etc.)	cblock 	0x20 			;start of general purpose registers		count1 			;used in delay routine		counta 			;used in delay routine 		countb 			;used in delay routine	endc		org	0x0000			;org sets the origin, 0x0000 for the 16F628,					;this is where the program starts running		movlw	0x07	movwf	CMCON			;turn comparators off (make it like a 16F84)   	bsf 	STATUS,		RP0	;select bank 1   	movlw 	b'00000000'		;set PortB all outputs   	movwf 	TRISB	movwf	TRISA			;set PortA all outputs	bcf	STATUS,		RP0	;select bank 0Loop		movlw	0xff	movwf	PORTA			;set all bits on	movwf	PORTB	nop				;the nop's make up the time taken by the goto	nop				;giving a square wave output	call	Delay			;this waits for a while!	movlw	0x00	movwf	PORTA	movwf	PORTB			;set all bits off	call	Delay	goto	Loop			;go back and do it againDelay	movlw	d'250'			;delay 250 ms (4 MHz clock)	movwf	count1d1	movlw	0xC7	movwf	counta	movlw	0x01	movwf	countbDelay_0	decfsz	counta, f	goto	$+2	decfsz	countb, f	goto	Delay_0	decfsz	count1	,f	goto	d1	retlw	0x00	end
Am folosit MPLAB IDE si mi-a rezultat codul hexazecimal:

:020000040000FA:1000000007309C0083160030860085008312FF3085:100010008500860000000000122000308500860068:1000200012200728FA30A000C730A1000130A2003A:0E003000A10B1B28A20B1828A00B14280034CB:02400E00183D5B:00000001FF
L-am introdus in microcontroller cu succes folosind ICProg (JDM programmer cu o placa AD-pic01)

 

Problema e ca nu "porneste". Nu i-mi aprinde led-ul deloc. Imediat pun si schema pe care testez PIC-ul.

 

Edit:

Posted Image

 

Pe orice port pun LED-ul nu se aprinde (mai putin 11, 32 si 14)

 

Mai trebuie sa pun ceva in schema sau e programul gresit?

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

Top autori în acest subiect

  • Liviu M

    4

  • vcdec

    3

  • 10vid

    3

  • remus2509

    1

Top autori în acest subiect

Vizitator ROCrysty

l-am "adaptat" pentru PIC-ul meu. Am vazut ca nu da eroare la simulare si nici la scriere... am zis ca e ok. Ideea e sa vad eu ca i-mi aprinde un led, ceva, sa vad ca misca. Dupa, am sa invat eu toate cuvintele cheie pentru el sa ii scriu eu codul. Acuma lipesc rezistenta.

Link spre comentariu
Vizitator ROCrysty

Nu mai pot modifica post-ul anterior. Am lipit rezistenta, am modificat codul in :

;        Title "LED flasher.";        list P = 16F877A;        include "P16f877A.inc"  ; use definition file for 16F877;; --------------------; USER RAM DEFINITIONS; --------------------;        CBLOCK 0x20   ; RAM starts at address 20hNaHiNaLoNbHiNbLo        ENDC;        org 0x0000      ; start address = 0000h; INITIALISE PORTS; binary used to see individual pin level        movlw b'00000000'       ; all port pins = low        movwf PORTA        movlw b'00000000'        movwf PORTB        movlw b'00000000'        movwf PORTC        movlw b'00000000'        movwf PORTD        movlw b'00000000'        movwf PORTE        bsf STATUS,RP0  ; set RAM Page 1 for TRIS registers; INITIALISE PORTS; binary used to see individual pin IO status        movlw b'00000000'       ; all IO pins = outputs        movwf TRISA        movlw b'00000000'        movwf TRISB        movlw b'00000000'        movwf TRISC        movlw b'00000000'        movwf TRISD        movlw b'00000000'        movwf TRISE        movlw b'00000110'       ; all analog pins = digital        movwf ADCON1        bcf STATUS,RP0  ; back to RAM page 0; LED FLASH LOOPLoop    bsf PORTC,4 		bsf PORTA,1   ; RC4 = high = led on		bsf PORTA,2		bsf PORTA,3		bsf PORTA,4		bsf PORTA,5        call Delay        bcf PORTC,4     ; RC4 = low = led off        call Delay        goto Loop; 1/2 SEC DELAY SUBROUTINE WITH 4MHz CLOCKDelay   movlw 01h        movwf NbHi        movlw 03h        movwf NbLo        movlw 8Ah        movwf NaHi        movlw 5Bh        movwf NaLoDeLoop0 decfsz NaLo,F        goto DeLoop0        decfsz NaHi,F        goto DeLoop0        decfsz NbLo,F        goto DeLoop0        decfsz NbHi,F        goto DeLoop0        ;        return        end
L-am scris cu succes in microcontroller si nu face nimic. Trebuia sa i-mi deschida port-urile A1, A2, A3, A4 si C4

Update la diagrama:

Posted Image

Posted Image

Link spre comentariu

In schema LED-ul apare legat invers.Vad ca ai renuntat la linia config :bataie care oricum era gresita, pentru ca era selectat un oscilator low power (LP), care nu e capabil sa antreneze in oscilatie un cristal cu frecventa mare ca de ex. 4MHz. Condensatori de 15-22 pF ai pus de la pinii quartzului la GND?Pune si linia asta, cu valoarea modificata pentru oscilator XT.__config 0x3D01 ;sets the configuration settings (oscillator type etc.)

Link spre comentariu
Vizitator ROCrysty

Am rezolvat si cu linia de configurare si cu C-urile. LED-ul e desenat invers dar e ok in circuit.

Desen facut in Paint :d

Posted Image

 

S-au deschis porturile. Problema era din program si la oscilator (ca nu aveam puse prostiile alea de condensatoare)

Multumesc pentru ajutor. Acuma am sa imi bat capu maine sa vad cum le fac sa clipeasca.

Link spre comentariu
Vizitator ROCrysty

Am probleme cu oscilatorul. Nu sunt sigur ca e bun, nu stiu sigur daca sunt in regula condensatoarele... ma gandeam sa il schimb cu unul de 16MHz. Ce condensatori am nevoie pentru el si care e linia de configurare pentru acesta? Sau mai simplu nu pun nici-unul dar nu stiu cum sa il pornesc pe cel interior. Ce linie de comanda trebuie? Am citit datasheet-ul dar m-am pierdut in el....

Link spre comentariu

In fisierul "C:\Program Files\Microchip\MPASM Suite\P16F877A gasesti definitiile dieverselor "cuvinte cheie" folosite in program.La sfarsitul fisierului gasesti sectiunea CONFIG, cu diversele variante pentru bitii de configurare.Configurarea PIC-ului se face combinand variantele alea in directiva __config in programul tau.De exemplu, daca tu vrei oscilator HS (mai multe la pagina 145 in data-sheet), fara watchdog si fara protejat de coduri, n-ai decat sa inlocuiesti __config in programul tau cu.__config _FOSC_HS & _WDT_OFF & _CP_OFF & _CPD_OFFDaca-ti trebuie altceva, adaptezi cerintelor tale. La pagina 144 gasesti descrierea bitilor de configurare.

Link spre comentariu

E cu dus si intors.Setarile din mplab se pot pierde (eu, de exemplu, imi pastrez sursele pe server si generez proiectele de fiecare data in alt loc), asa ca peste o luna o sa uiti sa le setezi sau cum le-ai setat si n-o sa mai mearga. Bineinteles ca la proiecte ceva mai complexe, la aprins un LED nu-i problema.Daca le scrii in cod (cu __config), acolo raman.

Link spre comentariu
Vizitator ROCrysty

Am observat ca nu le scria in hexa si am ramas la __config. Problema e ca nu reusesc sa il fac sa clipeasca... Circuitul este ok, programul este ok, (merge perfect in simulator). nu pot sa ii dau de cap.

 

In program sunt mai multe functii care le-am scris sa fie acolo... vroiam sa fac ceva frumos de la inceput da nu reusesc sa fac sa se stinga ledurile din Port E

 

COD:

Hidden text: ON
Available only to registered users.
Hidden text: OFF
;        Title "LED flasher.";        list P = 16F877A;        include "P16f877A.inc"  ; use definition file for 16F877; --------------------; USER RAM DEFINITIONS; --------------------		__config _FOSC_HS & _WDT_OFF & _CP_OFF & _CPD_OFF; Delay = 3 seconds; Clock frequency = 4 MHz; Actual delay = 3 seconds = 3000000 cycles; Error = 0 %	cblock	d1	d2	d3	endc      ;        org 0x0000      ; start address = 0000h; INITIALISE PORTS; binary used to see individual pin level        movlw b'00000000'       ; all port pins = low        movwf PORTA        movlw b'00000000'        movwf PORTB        movlw b'00000000'        movwf PORTC        movlw b'00000000'        movwf PORTD        movlw b'00000000'        movwf PORTE        bsf STATUS,RP0  ; set RAM Page 1 for TRIS registers; INITIALISE PORTS; binary used to see individual pin IO status        movlw b'00000000'       ; all IO pins = outputs        movwf TRISA        movlw b'00000000'        movwf TRISB        movlw b'00000000'        movwf TRISC        movlw b'00000000'        movwf TRISD        movlw b'00000000'        movwf TRISE        movlw b'00000110'       ; all analog pins = digital        movwf ADCON1        bcf STATUS,RP0  ; back to RAM page 0; LED FLASH LOOPLoop    call ledporteon		call delay1s		call delay1s		call delay1s		call delay1s		call ledporteoff		call delay1s		call delay1s      goto LoopDelay	movlw	0xE3	movwf	d1	movlw	0x7F	movwf	d2	movlw	0x37	movwf	d3	returnDelay_0	decfsz	d1, f	goto	$+2	decfsz	d2, f	goto	$+2	decfsz	d3, f	goto	Delay_0			;6 cycles	goto	$+1	goto	$+1	goto	$+1ledb7on bsf PORTB,7		returnledb7off bcf PORTB,7		returnledporteon bsf PORTE, 1		bsf PORTE, 2		bsf PORTE, 0		returnledporteoff		bcf PORTE, 0		bcf PORTE, 2		bcf PORTE, 1		returndelay1s	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	call Delay	return	end

 

Programul de delay este cam aiurea dar pentru cunostintele mele de amator, functioneaza.

Hidden text: ON
Available only to registered users.
Hidden text: OFF
Posted Image
Link spre comentariu

Din datasheet nu apare ca ar avea oscilator intern. Dar oricum, grija cu acel oscilator HS, sa nu busesti cuartul cu el.Daca s-a aprins LED-ul cu XT la 4MHz, inseamna ca oscilatorul XT functioneaza.La o prima vedere, delay-ul ala are vreo 30s. Esti sigur ca ai asteptat suficient de mult sa se stinga LED-ul? :nas:Mai taie din el.

Link spre comentariu
Vizitator ROCrysty

dap. am pus asa mare pentru ca la oscilatoru de 4 mhz cu programu de atunci i-mi deschidea si inchidea led-ul atat de repede incat nu se vedea. I-l vedeam doar mult mai slab (ca si cum l-as fi alimentat cu 2V in loc de 3,5) Am spus sa fie si de 30 secunde numa sa il vad ca se stinge... Am stat 5 minute cu el si nimic... care sa fie problema? la configurare? la circuit? eu nu pot sa i-mi dau seama...EDIT: Intr-adevar nu are oscilator intern... de aceea am apelat la 16 MHz. l-am dezlipit de pe o placa de la un scanner defect. Daca se are nu e problema... mai am vreo 20 de oscilatoare prin casa.

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