Google Búsqueda personalizada

Regístrate gratis para participar de los foros, o si ya estás registrado haz login.

Adaptar 12F83 al 12F629

comentario del autor Dom Ago 23, 2009 9:08 am
   
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

   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.

Meta

Reputación

asistió a la solución Mar Ago 25, 2009 5:16 pm
   
Ok.
Meta creo que te referis al PIC12F683 no?
Bueno primero lo siguiente:
1)-Cambia CMCON0 por CMCON
2)-El Pic12F629 no lo podes usar ya que el programa que pusiste usa GP0 como analogo y este no lo trae, o sea que solo podes usar el PIC12F675 que si trae.
Aca es donde lo setea:
Código:
movlw   0x51             
movwf   ANSEL
 

Asi que bueno proba con eso y cualquier cosa pregunta.-
Tene en cuenta tambien esto:
PIC12F683:
Memoria:2K
Eeprom:256
Timer 8 bit:2
Timer 16 bit:1
PIC12F675:
Memoria:1K
Eeprom:128
Timer 8 bit:1
Timer 16 bit:1
Saludos y espero que te sirva.-

mammuky

Reputación

comentario del autor Mar Ago 25, 2009 8:18 pm
   
Voy a probar y gracias.

¿Crees que va a funcionar con el 12F675 realmente?

El error que te tira, es porque el 16F629 no tiene los siguientes registros.

TMR2IF
ADCON0 ---> SOLO LO TIENE EL PIC12F675
CMCON0 ---> TIENE EL CMCON
ADRESH ---> TIENE EL ADRESL
ANSEL ---> SOLO LO TIENE EL PIC12F675
T2CON ---> SOLO TIENE EL T1CON
PR2
TMR2IE
T2CON ---> SOLO TIENE EL T1CON
TMR2ON


Por último, no tiene la característica del BODEM sino que tiene BOD

Resumiendo, no te sirve el 12F629 tendrás que cambiar por otro compatible.

Meta

Reputación

sin valorar Mar Ago 25, 2009 9:04 pm
   
Ok.
Asi es. Es cuestion de comparar los registros y adaptar.
Saludos.-

mammuky

Reputación



Hacer una pregunta

Boletín de Noticias

Reciba noticias de tecnología, tips de reparación y ofertas exclusivas.



Reglamento / P+F

Foros

Miembros / Expertos