Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola, me acabo de registrar en esta web y veo que me pasare bastantes horas leyendo foros ya que soy un apasionado de la robotica, aunque nunca me he puesto en serio.
Estoy empezando a programar mis cosillas despues de comprar por ebay un programador de pic 16f690. Queria hacer el tipico programilla para empezar en que un led al cabo de 2 segundos se apagara. Llevo un buen rato mirandome otros foros y paginas de internet y esto es a lo que he llegado:
#include <P16F690.inc> ; processor specific variable definitions
__CONFIG (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
CONTADOR EQU 0x24
STATUS_TEMP EQU 0x25
W_TEMP EQU 0x26
ORG 0x000
GOTO CONFIGURATION
ORG 0x004
GOTO BREAK
BREAK:
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
INCF CONTADOR
MOVLW b'00001101' ;Valores inciales del contador
MOVWF TMR1H
MOVLW b'11010000'
MOVWF TMR1L
BCF PIR1,TMR1IF ;Desactivamos flag interrupcion
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
CONFIGURATION:
CLRF CONT
BSF STATUS,RP0
BCF STATUS,RP1 ;Bank1
MOVLW b'00000000' ;Configuración de los puertos entrada / salida de PORTB
; 1= Entrada
; 0= Salida
MOVWF TRISC
BCF STATUS,RP1
BCF STATUS,RP0 ;Bank0
CLRF PORTC
BSF PORTC,0 ;Encendemos el led
BSF STATUS,RP0 ;Bank1
MOVLW b'00000111' ;Oscilador interno
MOVWF OSCCON ;( 000 -> 31KHz)
BCF STATUS,RP0 ;Bank0
MOVLW b'00001101' ;Valores iniciales timer
MOVWF TMR1H
MOVLW b'11010000'
MOVWF TMR1L
MOVLW b'10110000' ;Configuracion timer
MOVWF T1CON
BSF STATUS,RP0 ;Bank1
;Mascaras
BSF PIE1,TMR1IE
BSF INTCON,PEIE
BSF INTCON,GIE
BCF STATUS,RP0 ;Bank0
BSF T1CON,TMR1ON ;Timer ON
PROGRAMA:
MOVFW CONTADOR
XORLW d'2'
BTFSS STATUS,ZERO
BCF PORTC,0 ;Apagamos el led
GOTO PROGRAMA
END
Observaciones:
En el puerto C bit zero hay un led conectado.
El timer esta configurado para que haya una interrupcion por segundo.
El oscilador local lo he configurado para que funcione a 31KHZ.
Un vez todo este rollo la pregunta es fácil....QUE COÑO FALLA? Lo he grabado en el pic y lo he ejecutado y esto no tira!
En lugar de escribir todo el código del tirón y ver el resultado final lo mejor es ir haciendolo poco a poco y comprobando los pequeños pasos, aunque ésto suponga escribir código de más. Encontrar lo que falla si no has ido poco a poco suele ser difícil.
El ORG 4 es el vector del ISR por lo que está bien situado.
Hay pines que por defecto van configurados como analógicos, si los vas a usar como digitales debes configurarlos como tal en su registro, o siempre leeras uno.
En las etiquetas tienes ":", no sé si sobran.
Hola ya he conseguido que se enciende y se apague el led! Ahora voy a por mas...intentare un detector de obstaculos o un rastreador. Gracias por la ayuda!
¿Cuál era el problema?
S2
Ranganok Schahzaman
Ranganok el error estaba en la interrupcion cuando se guardan los valores de los registros y status. El codigo para recuperar correctamente los status son:
INTERRUPCION:
MOVWF W_TEMP
SWAPF W_TEMP, 1
MOVFW STATUS
CLRF STATUS
MOVWF STATUS_TEMP
;Codigo
MOVFW STATUS_TEMP
MOVWF STATUS
MOVFW W_TEMP
RETFIE