fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Ayuda para el novat...
 
Avisos
Vaciar todo

Ayuda para el novato

9 Respuestas
4 Usuarios
0 Reactions
2,889 Visitas
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

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!

Responder
8 respuestas
goblin welder
Respuestas: 77
(@goblin-welder)
Trusted Member
Registrado: hace 16 años

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.

Responder
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

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!

Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 19 años

¿Cuál era el problema?

S2

Ranganok Schahzaman

Responder
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

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

Responder
Página 2 / 2
Compartir: