Sida 1 av 1

programera pic16F628a

Postat: 7 januari 2007, 19:39:33
av squiz3r
Hej, jag hadde tänkt att försöka programera en pic 16F628A, också undrar jag bara om följande program är gjort för internal osc? är det bara att låta osc pinnarna "hänga i luften" isåfall? ska man sätta ett 33kOhm motstånd mellan MCLR och +5V?

Edit: den använder väll MCLR?

Kod: Markera allt

;****************************************************************
;* Name of Project:	Experiment 1		*
;* Push red button RB0 to turn on red LED RB4	*
;****************************************************************

	list P = 16F628	;microcontroller identity
		; e.g: 0x033 = hex value

	__Config 3F18h 

;****************************************************************
;Equates
;****************************************************************
status	equ	0x03
cmcon	equ	0x1F
rp1	equ	0x06	;this is bit 6 in file 03
rp0	equ	0x05	;this is bit 5 in file 03

;****************************************************************
;Beginning of program
;****************************************************************
reset:	org	0x00	;reset vector address	
	goto	SetUp	;goto set-up
	nop
	nop
	nop
	org	4	;interrupts go to this location 
	goto	isr1	;goto to Interrupt Routine  - not used
			;    in these experiments.
			;isr1 must be written at address 004
			;   otherwise bcf status,rp1 will be 
			;   placed at address 01 by assembler!	

;****************************************************************
;* Port A and B initialisation			*
;****************************************************************

SetUp	bcf	status,rp1		;select bank 1 
	bsf	status,rp0
	
	movlw	0xFF		;make all Port A inputs
	movwf	0x05			
	movlw	0x0F		; out out out out  in in in in 
	movwf	0x06		; 

	bcf	status,rp0		;select programming area - bank0
	movlw	0x07		;turn comparators off and enable
	movwf	cmcon		;    pins for I/O functions
	goto 	Main

;****************************************************************
;* Interrupt Service Routine will go here (not used)	*
;****************************************************************
isr1

;****************************************************************
;* Main 					*
;****************************************************************

Main	btfss	0x06,0	;Port B, input bit 0 = red button pushed?
	goto	Main1
	bsf	0x06,4	;Port B, output bit 4 = turn on red LED
	goto	Main
Main1	bcf	0x06,4	;Port B, output bit 4 = turn off red LED
	goto	Main	

	END

Postat: 7 januari 2007, 20:12:56
av sodjan
Det är mycket möjligt att koden *fungerar*, men det är en
riktigt slarvigt skriven skit-kod.

> __Config 3F18h

Bättre att använda de riktiga symbolerna från INC filen. T.ex (också för en 628A) :

__CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON

Byt ut symbolerna efter hur du vill ha det, Se slutet av P16F628A.INC
och naturligtsvis databladets beskrivning av de olika CONFIG bitarna.

> status equ 0x03
> cmcon equ 0x1F
> rp1 equ 0x06 ;this is bit 6 in file 03
> rp0 equ 0x05 ;this is bit 5 in file 03

Helt fel sätt !!
Använd P16F628A.INC istället. Där finns symboler för alla register och bitar definierade.

> bsf status,rp0

Använd BANKSEL istället. Mindre risk för fel.

> movlw 0xFF ;make all Port A inputs
> movwf 0x05
> movlw 0x0F ; out out out out in in in in
> movwf 0x06 ;

Använd symbolerna TRISA och TRISB istället.

> ska man sätta ett 33kOhm motstånd mellan MCLR och +5V?

Normalt, ja.

> den använder väll MCLR?

Kanske, kanske inte.
Jag tänker inte försöka reda ut vad "__Config 3F18h" betyder.

Här är ett kort exempel på en kod för 16F628A (som blinkar en LED) :

Kod: Markera allt

;**********************************************************************
;   Enkelt blink-a-led, 16F628A.                                       *
;                                                                     *
;**********************************************************************
;    Files required:  P16F628A.INC                                     *
;                     16F628A.LNK                                      *
;                                                                     *
;**********************************************************************


	list      p=16f628A
	#include <p16f628A.inc>
	
	__CONFIG   _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON

RESET_VECTOR    CODE    0x000     ; processor reset vector
	    goto    start             ; go to beginning of program


INT_VECTOR      CODE    0x004     ; interrupt vector location
        goto    isr_routine       ; goto main interrupt service routine.
        

;***************************************************************
MAIN    CODE

start

        banksel cmcon
        movlw   h'07'
        movwf   cmcon            ; Stäng av ADC.

        banksel trisa
        clrf    trisa
        clrf    trisb             ; Alla pinnar = utgångar.

        banksel t1con
        movlw   b'00110001'
        movwf   t1con             ; Se datablad...
        
        banksel pie1
        movlw   b'00000001'
        movwf   pie1              ; Enable avbrott från TMR1.

        banksel intcon	
        bsf     intcon, peie
        bsf     intcon, gie       ; Enable avbrott...

loop
        goto loop                 ; Vänta på avbrott...
 


;***************************************************************
ISR_ROUTINE  CODE

isr_routine

        banksel porta
        comf    porta            ; Blinka !!

        banksel pir1
        bcf     pir1, tmr1if     ; clear avbrotts flagga.

        retfie

		end

Postat: 7 januari 2007, 20:15:59
av Stuggi
Ser man på, när man tittar på detdär så förstår man ju nästan assembler :D

Postat: 7 januari 2007, 20:33:41
av sodjan
Det mesta handlar om struktur och bra kommentarer.
Helst ska man inte behöver läsa själva assmembler
instruktionerna för att förstå vad koden gör... :-)

Postat: 7 januari 2007, 20:36:10
av squiz3r
Tack så mycket :D !

"Vänta på avbrott" vad menas med det?

Postat: 7 januari 2007, 20:40:53
av sodjan
> "Vänta på avbrott" vad menas med det?

Att processorn väntar på ett avbrott ("Interrupt").
I just detta fall från när Timer1 "slår över" från h'FFFF' till h'0000'.

Just den delen används väl inte i din kod, men det finns ett
helt kapitel om interrupt i databladet om du vill veta mer.

Exemplet var mer för struktur och t.ex användning av INC filen,
inte en komplett lösning för just *ditt* fall...