programera pic16F628a

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

programera pic16F628a

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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
Användarvisningsbild
Stuggi
Inlägg: 887
Blev medlem: 4 december 2005, 00:09:51
Ort: Jakobstad, Finland
Kontakt:

Inlägg av Stuggi »

Ser man på, när man tittar på detdär så förstår man ju nästan assembler :D
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Tack så mycket :D !

"Vänta på avbrott" vad menas med det?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Skriv svar