Adaptar 12F83 al 12F629

Hola:

¿Alguien puede hechar una mano para adaptar este PIC 12F83 al 12F629/675?

Su código fuente es:

Código:
list      p=12F683        ; list directive to define processor
	#include <p12F683.inc>    ; processor specific variable definitions

	errorlevel  -302          ; suppress message 302 from list file

	__CONFIG   _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSCIO 

;***** VARIABLE DEFINITIONS******************
w_temp        EQU     0x70        ; variable used for context saving 
status_temp   EQU     0x71        ; variable used for context saving

FLAGS		EQU		0x20		;software state register
PULSER		EQU		0x21		;pulse on counter
DWELLTIMER	EQU		0x22		;pulse off counter
STATE		EQU		0x23		;programmed state
BUTTONHOLD	EQU		0x24
FREQR		EQU		0x25		;frequency value
TEMP1		EQU		0x26
TEMP2		EQU		0x27
PULSEL		EQU		0x28
DWELLTIMEL	EQU		0x29
TEMP5		EQU		0x2A
LEDBLINK	EQU		0x2B
TEMP3		EQU		0x2C



;*******bits in FLAGS register***********
PULSEONR		equ		0
PULSEONL		equ		1
TRIGOUT			equ		2
LEDHI			equ		3
STATECHANGE		equ		4


;*******bits in STATE register***********
RIGHTACTIVE		equ		0
LEFTACTIVE		equ		1

;*********GPIO pin names*****************
LEDL			equ		5
LEDR			equ		4
BUTTONR			equ		2
BUTTONL			equ		3
TRIGGERR		equ		0
TRIGGERL		equ		1


;**********Speed settings: change these to change speed (0x05-0xFF)
FIRERATE1		equ		0x2F
FIRERATE2		equ		0x16
FIRERATE3		equ		0x12
FIRERATE4		equ		0x0F



;**********************************************************************
	ORG     0x000             ; processor reset vector
	goto    main              ; go to beginning of program
	

	ORG     0x004             ; interrupt vector location
	movwf   w_temp            ; save off current W register contents
	movf	STATUS,w          ; move status register into W register
	movwf	status_temp       ; save off contents of STATUS register

			;Take a good note here. OSC is left at default 4MHz.
			; We are running at 1MHz instruction cycle, or 1 micro second
			;Timer 2 is prescaled 1:4 and compared (PR2) to 250.
			; we now have hardware interupt that falls every 1ms exactly
			;within limitation of osctune. Main code is inconsequential.
			;PULSE and DWELL values control the signals precisely.
			;All pulse logic is switched within the few microseconds to 
			;service the interupt routine. DO NOT modify the ISR
			;with any kind of 'wait' or 'loop'. If you want to trigger
			; timed events do so by setting an open FLAG bit and have the 
			;event done in the main loop.


	btfss	PIR1, TMR2IF		;timer 2 int happened
	retfie

;**************** LED blinking *********************************************
								;Our main routine will turn the flag bit
								;LEDON on or off. The 10ms pulse is a duty cycle
								;for the code to work with both CG and
								;matrix controllers. 

BlinkLed	
	btfss	FLAGS, LEDHI
	goto	LedLow
	decfsz	LEDBLINK, f			;if pulse is active, count down 10ms
	goto	RightLED
	movlw	0x0A
	movwf	LEDBLINK
	bcf		FLAGS, LEDHI		;10ms done, turn off LEDHI bit
	goto	RightLED
LedLow
	decfsz	LEDBLINK, f			;LEDLO time, count down 10ms
	goto	RightLED
	movlw	0x0A
	movwf	LEDBLINK
	bsf		FLAGS, LEDHI		;10ms done, turn LEDHI bit on

RightLED
	btfsc	STATE, RIGHTACTIVE	;is RF on?
	goto	OutputRightLED
	bsf		STATUS, RP0			;bank 1
	bsf		TRISIO, LEDR		;tristate LED
	bcf		STATUS, RP0			;bank 0
	goto	LeftLED
OutputRightLED
	btfsc	FLAGS, LEDHI		;if ledhi true,
	bsf		GPIO, LEDR			;turn output hi
	btfss	FLAGS, LEDHI		;if ledhi flase,
	bcf		GPIO, LEDR			;turn led output lo
	bsf		STATUS, RP0			;bank 1
	bcf		TRISIO, LEDR		;turn output on
	bcf		STATUS, RP0			;bank 0

LeftLED
	btfsc	STATE, LEFTACTIVE	;is RF on?
	goto	OutputleftLED
	bsf		STATUS, RP0			;bank 1
	bsf		TRISIO, LEDL		;tristate LED
	bcf		STATUS, RP0			;bank 0
	goto	RightTrigger
OutputleftLED
	btfsc	FLAGS, LEDHI		;if ledhi true,
	bsf		GPIO, LEDL			;turn output hi
	btfss	FLAGS, LEDHI		;if ledhi flase,
	bcf		GPIO, LEDL			;turn led output lo
	bsf		STATUS, RP0			;bank 1
	bcf		TRISIO, LEDL		;turn output on
	bcf		STATUS, RP0			;bank 0

;**************** Right trigger logic***************************************	
RightTrigger
	btfsc	STATE, RIGHTACTIVE	;is RF on?
	goto	ActiveR
	bsf		STATUS, RP0			;bank 1
	bsf		TRISIO, TRIGGERR	;output off
	bcf		STATUS, RP0			;bank 0	
	goto	LeftTrigger

ActiveR
	btfss	FLAGS, TRIGOUT		;controllertype 
	bcf		GPIO, TRIGGERR		;determines
	btfsc	FLAGS, TRIGOUT		;output state
	bsf		GPIO, TRIGGERR	
	btfss	FLAGS, PULSEONR		;is pulse active?
	goto	OffstateR
	decfsz	PULSER, f			;if pulse is active, count down 10ms
	goto	LeftTrigger
	bcf		FLAGS, PULSEONR		;10ms is over, clear flags and 
	bsf		STATUS, RP0			;bank 1
	bsf		TRISIO, TRIGGERR	;tristate output
	bcf		STATUS, RP0			;bank 0	
	movf	FREQR, w			;and reset pulse time.
	movwf	PULSER
	goto	LeftTrigger

OffstateR
	decfsz	DWELLTIMER, f		;count down dwell time to next pulse
	goto	LeftTrigger
	bsf		FLAGS, PULSEONR		;if dwell is done turn on outputs
	bsf		STATUS, RP0			;bank 1
	bcf		TRISIO, TRIGGERR	;and reset pulse time
	bcf		STATUS, RP0			;bank 0	
	movf	FREQR, w			;from frequency value
	movwf	DWELLTIMER

LeftTrigger
	btfsc	STATE, LEFTACTIVE	;is RF on?
	goto	ActiveL
	bsf		STATUS, RP0			;bank 1
	bsf		TRISIO, TRIGGERL	;output off
	bcf		STATUS, RP0			;bank 0	
	goto	EndInterupt

ActiveL
	btfss	FLAGS, TRIGOUT		;controllertype 
	bcf		GPIO, TRIGGERL		;determines
	btfsc	FLAGS, TRIGOUT		;output state
	bsf		GPIO, TRIGGERL	
	btfss	FLAGS, PULSEONL		;is pulse active?
	goto	OffstateL
	decfsz	PULSEL, f			;if pulse is active, count down 10ms
	goto	EndInterupt
	bcf		FLAGS, PULSEONL		;10ms is over, clear flags and 
	bsf		STATUS, RP0			;bank 1
	bsf		TRISIO, TRIGGERL	;tristate output
	bcf		STATUS, RP0			;bank 0	
	movf	FREQR, w			;and reset pulse time.
	movwf	PULSEL
	goto	EndInterupt

OffstateL
	decfsz	DWELLTIMEL, f		;count down dwell time to next pulse
	goto	EndInterupt
	bsf		FLAGS, PULSEONL		;if dwell is done turn on outputs
	bsf		STATUS, RP0			;bank 1
	bcf		TRISIO, TRIGGERL	;and reset pulse time
	bcf		STATUS, RP0			;bank 0
	movf	FREQR, w			;from frequency value
	movwf	DWELLTIMEL

EndInterupt
	bcf		PIR1, TMR2IF

	movf    status_temp,w     ; retrieve copy of STATUS register
	movwf	STATUS            ; restore pre-isr STATUS register contents
	swapf   w_temp,f
	swapf   w_temp,w          ; restore pre-isr W register contents
	retfie                    ; return from interrupt


;*************************************SUBROUTINES**********************************

Wait10ms
	clrf	TEMP2
	movlw	0x0D
	movwf	TEMP1				;rough 10ms timer for button debounce.

Loop1
	decfsz	TEMP2, f			;count down 256*3=768 cycles
	goto	Loop1
	decfsz	TEMP1, f			;count down 768*13=9986 cycles
	goto	Loop1
	return
	
			;*************************************************************
ReadEE
	bsf     STATUS    , RP0		;Bank1
	movlw	0x02
    movwf   EEADR
    bsf     EECON1    , RD		;start read
    movf    EEDAT    , W
	bcf     STATUS    , RP0		;Bank0
    return
			;*************************************************************

WriteEE
	bsf     STATUS    , RP0
	movwf	EEDAT
	movlw	0x02
	movwf	EEADR
	bsf		EECON1,WREN 		;Enable write
	bcf		INTCON, GIE 		;Disable INTs
	btfsc	INTCON, GIE 		;See AN576
	goto	$-2 
	movlw 	0x55 				;Unlock write
	movwf 	EECON2 
	movlw 	0xAA
	movwf 	EECON2 
	bsf 	EECON1, WR 			;Start the write
WaitForEEWrite
	btfsc   EECON1, WR			;wait for hardware to clear (done writing)
    goto    WaitForEEWrite
	bcf     STATUS    , RP0		;Bank0
	bsf 	INTCON, GIE 		;Enable INTS
    return

;**********************************************************************************
;**********************************************************************************
;**********************************************************************************
main

	clrf	GPIO
	clrf	FLAGS				;clear outputs and code status register
	movlw	0x07
	movwf	CMCON0				;comparators off
	bsf		STATUS, RP0			;bank 1
	movlw	0x0F				;start with 0-3 inputs (ADC read)
	movwf	TRISIO				;pin 0 & 1 & 5 out, all other inputs
	movlw	0x51				;Fosc/16, pin 0 analog
	movwf	ANSEL				;Right trigger is analog input
	movlw	0x04
	movwf	WPU					;enable week pullups
	bcf		OPTION_REG, 7		;enable all week pullups 
	bcf		STATUS, RP0			;bank 0
 
Continuación del cósigo fuente.

Código:
movlw	0x01				;Left just, Vdd, channel 0
	movwf	ADCON0				;module on.
	movlw	0x10
	movwf	TEMP1
Wait4ADC
	decfsz	TEMP1, f
	goto	Wait4ADC			;acquisition time
	bsf		ADCON0, 1			;start ADC
	btfsc	ADCON0, 1
	goto	$-1					;wait for conversion to be done
	movlw	0x40				;about 0.5V from 2V ref
	subwf	ADRESH, w			;if f > W, C=1
	btfsc	STATUS, C			;ie- if trigger > 0.5V, then matrix
	bsf		FLAGS, TRIGOUT		;matrix config sources (output high)
	bsf		STATUS, RP0			;bank 1
	movlw	0x0C				;restore pin IO
	movwf	TRISIO	
	clrf	ANSEL				;all digital now
	bcf		STATUS, RP0			;bank 0

	movlw	0x0A				;start with 10ms pulse width
	movwf	LEDBLINK			;for the LEDs
	movlw	FIRERATE1			;this will get overwritten,
	movwf	PULSER				; but start with a default value
	movwf	PULSEL
	movwf	DWELLTIMER
	movwf	DWELLTIMEL
	call	ReadEE				;get state value
	movwf	STATE

	movlw	0x01
	movwf	T2CON				;timer 2, prescale 1:4, no postscale
	bsf		STATUS, RP0			;bank 1
	movlw	0xFA
	movwf	PR2					;setup 1ms hardware interupt
	bsf		PIE1, TMR2IE		;enable timer2 interupt
	bcf		STATUS, RP0			;bank 0
	bsf		T2CON, TMR2ON		;turn on timer2
	movlw	0xC0
	movwf	INTCON				;turn on interupts globally
	goto	InitState			;get first firerate value

;******MAIN LOOP***************
Start
TestLeft
	btfsc	GPIO, BUTTONL
	goto	TestRight			;Test for left button press
	call	Wait10ms
	btfsc	GPIO, BUTTONL		;button is down for 10ms
	goto	TestRight
ReleaseLeft
	btfss	GPIO, BUTTONL		;wait for button release			
	goto	ReleaseLeft
	call	Wait10ms
	btfss	GPIO, BUTTONL		;wait for button release			
	goto	ReleaseLeft

	movlw	0x02
	xorwf	STATE, f			;toggle left trigger
	call	WriteEE				;store state

TestRight
	btfsc	GPIO, BUTTONR
	goto	Start
;	goto	DisplayState		;Test for right button press
	call	Wait10ms
	btfsc	GPIO, BUTTONR		;button is down for min 10ms
	goto	Start
;	goto	DisplayState
	movlw	0xC8
	movwf	BUTTONHOLD			;setup for 2 second hold
First2seconds
	call	Wait10ms
	btfsc	GPIO, BUTTONR		;button is down for more than 10ms
	goto	ReleaseRight
	decfsz	BUTTONHOLD, f 
	goto	First2seconds
	movlw	0xC8
	movwf	BUTTONHOLD			;setup for 2 second hold
Second2seconds
	call	Wait10ms
	btfsc	GPIO, BUTTONR		
	goto	ReleaseRight
	decfsz	BUTTONHOLD, f 		
	goto	Second2seconds		;button down for 4 seconds, change firerate
	
NextState
	movlw	0x40
	addwf	STATE, f			;change firerate state
InitState						;begin test for
	btfsc	STATE, 7			;state 1 or 2
	goto	State3
	btfsc	STATE, 6
	goto	State2
State1
	movlw	FIRERATE1				;state 1
	movwf	FREQR
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop01
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop01
	bsf		STATE, RIGHTACTIVE		;led on
	bsf		FLAGS, STATECHANGE		;notify a state change
	goto	ReleaseRight

State2
	movlw	FIRERATE2			;state 2
	movwf	FREQR
	bcf		STATE, RIGHTACTIVE		;blink twice, led off
	movlw	0x0A
	movwf	TEMP3
Loop02
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop02
	bsf		STATE, RIGHTACTIVE		;led on
	movlw	0x0A
	movwf	TEMP3
Loop03
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop03
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop04
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop04
	bsf		STATE, RIGHTACTIVE		;led on
	bsf		FLAGS, STATECHANGE		;notify a state change
	goto	ReleaseRight

State3
	btfsc	STATE, 6
	goto	State4
	movlw	FIRERATE3			;state 3
	movwf	FREQR
	bcf		STATE, RIGHTACTIVE		;blink 3 times, led off
	movlw	0x0A
	movwf	TEMP3
Loop05
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop05
	bsf		STATE, RIGHTACTIVE		;led on
	movlw	0x0A
	movwf	TEMP3
Loop06
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop06
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop07
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop07
	bsf		STATE, RIGHTACTIVE		;led on
	movlw	0x0A
	movwf	TEMP3
Loop08
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop08
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop09
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop09
	bsf		STATE, RIGHTACTIVE		;led on
	bsf		FLAGS, STATECHANGE		;notify a state change
	goto	ReleaseRight

State4
	movlw	FIRERATE4			;state 4, 22ms cycle
	movwf	FREQR
	bcf		STATE, RIGHTACTIVE		;blink 4 times, led off
	movlw	0x0A
	movwf	TEMP3
Loop10
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop10
	bsf		STATE, RIGHTACTIVE		;led on
	movlw	0x0A
	movwf	TEMP3
Loop11
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop11
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop12
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop12
	bsf		STATE, RIGHTACTIVE		;led on
	movlw	0x0A
	movwf	TEMP3
Loop13
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop13
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop14
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop14
	bsf		STATE, RIGHTACTIVE		;led on
	movlw	0x0A
	movwf	TEMP3
Loop15
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop15
	bcf		STATE, RIGHTACTIVE		;led off
	movlw	0x0A
	movwf	TEMP3
Loop16
	call	Wait10ms				;100 ms
	decfsz	TEMP3, f
	goto	Loop16
	bsf		STATE, RIGHTACTIVE	;led on
	bsf		FLAGS, STATECHANGE	;notify a state change

ReleaseRight
	btfss	GPIO, BUTTONR		;wait for button release			
	goto	ReleaseRight
	call	Wait10ms
	btfss	GPIO, BUTTONL		;wait for button release			
	goto	ReleaseRight
	btfsc	FLAGS, STATECHANGE	;test for button tap or state change
	goto	Continue01
	movlw	0x01
	xorwf	STATE, f			;toggle left trigger if button tap
Continue01
	bcf		FLAGS, STATECHANGE
	call	WriteEE				;store state
	goto	Start




	
; initialize eeprom locations

	ORG	0x2100
	DE	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07


	END                       ; directive 'end of program'

Saludo.

PD: Muy buena el nuevo foro, aunque me gusta más el estilo del color blanco azul del anterior y más cómo al leer. Por cierto, ya no deja tener textos muy largos como en el anterior, ni tampoco poner en negritas o enlaces al escribir. Recomiendo www.phpbb.com la versión 3.0
 
Última edición:
Atrás
Arriba