TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: tavisho en 22 de Febrero de 2008, 16:38:17
-
Hola foreros, soy octavio con algunas preguntas q necesito q me respondan. Resulta que he estado trabajando sobre los programas de el libro de Laboratorio de Microelectronica ; en el cual está presente este pequeño código assembler
;Contador UP/DOWN decimal de un dígito
;
;Sobre el display 7 segmentos conectado a la puerta B se visualizará el número de pulsos
;aplicados por la entrada RA0. RA1 determina si la cuenta es ascendente (a "1")
;o descendente
List p=16F84 ;Tipo de procesador
include "P16F84.INC" ;Definiciones de registros internos
Contador equ 0x0c ;Variable del contador
__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
org 0x00 ;Vector de Reset
goto Inicio
org 0x05 ;Salva el vector de interrupción
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W
Tabla_7_seg addwf PCL,F ;Desplaza al PC tantas posiciones como indique el valor
;del registro W
retlw b'10111111' ; código del 0
retlw b'10000110' ;1
retlw b'11011011' ;2
retlw b'11001111' ;3
retlw b'11100110' ;4
retlw b'11101101' ;5
retlw b'11111101' ;6
retlw b'10000111' ;7
retlw b'11111111' ;8
retlw b'11100111' ;9
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA ;Puerta A se configura como entrada
movlw b'00000110'
movwf OPTION_REG ;Preescaler de 128 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
clrf Contador ;Puesta a 0 del contador
Loop movf Contador,W
call Tabla_7_seg ;Convierte BCD a 7 segmentos
movwf PORTB ;Visualiza el valor del contador
Wait_0 clrwdt ;Refrescar el WDT
btfss PORTA,0 ;Subida de la señal RA0 ?
goto Wait_0 ;No
sleep ;Modo standby en espara de 18mS. Elimina rebotes
Wait_1 clrwdt ;Refrescar el WDT
btfsc PORTA,0 ;Bajada de RA0 (pulso) ??
goto Wait_1 ;No
sleep ;Modo standby en espara de 18mS. Elimina rebotes
btfss PORTA,1 ;RA1 = 1 ??
goto Down ;No, cuenta descendente
Up incf Contador,F ;Incrementa contador
movlw .10
subwf Contador,W
btfss STATUS,Z ;Es mayor de 9 ??
goto Loop ;No
clrf Contador ;Si, puesta a 0 del contador
goto Loop
Down decf Contador,F ;Decrementa el contador
movlw 0xff
subwf Contador,W
btfss STATUS,Z ;Es menor de 0 ??
goto Loop ;No
El cual ya he entendido por completo su funcionamiento , más no me es posible simularlo con éxito en proteus ya que el dis`play de 7 segmentos nunca cambia del valor del 0, cambié los valores de la tabla para pasarlos a un display de cátodo común aunque no creo que influya mucho. ojalá puedan analizarlo y darme luz sobre el problema. Lástima q no se como adjuntar archivos de proteus si no les mostraría el circuito q monté.
-
Hola:
Fijate que efectivamente ya lo compile y no marca ningun error mas aun me parece que hay problemas en la logica del lectura de entradas cuando INCREMENTA y cuando DECREMENTA. Pregunta: ¿este circuito ya lo armaste en un PROTOBOARD y funciono correctamente?. Si puedes mandame el archivo de proteus que te da problemas.
¿Cual es la fuente de este programa?, ¿como se llama el libro exactamente?, ¿link?
Ojala que aun este a tiempo de ayudarte
-
Hola:
Soy novato en esto de los PIC y pido disculpas de antemano
Para salir de sleep se utiliza el Wdt? Si es asi el micro se resetea comenzando de nuevo en el vector de reset
Para salir de sleep se utilizan tres modos
1-Por la activacion de la patilla MCLR# y va al vector reset
2-Por el desvordamiento del perro guardian y va al vector reset
3-Cuando se genera una interrupcion ,de las cuatro posibles,pero no puede ser del TMR0 ya que en modo sleep el oscilador
no funciona
Otra cuestion es OPTION_REG lo tienes asignado a TMR0 pro no veo su utilizacion
Tal vez falte algo de programa ???
Sin ningun deseo de haver molestado os mando un saludo
-
Hola a todos :
Pido las mas sinceras disculpas por haber cometido un error
En el anterior post escribi un verdadero error que fue:
-Por el desvordamiento del perro guardian y va al vector reset
Pido disculpas si ello ha llevado a una confusion .Lo cierto es que el WDT despierta al PIC despues de una instruccion SLEEP y continua con la
siguiente instruccion que sigue a SLEEP
Te pido disculpas tavisho
Si puedo decirte que el programa lo compile y grabe en la placa de pruebas PicTrainer funcionando bien y dando los valores de la tabla
Ahora tambien entiendo el tema de asignacion del TMR0 .El bit 3 de OPTION_REG denominado PSA es el que asigna el divisor de frecuencia
al WDT o al TMR0
Si este bit esta a 0 se asigna el divisor de frecuencia al TMR0 , en el caso contrario si estuviera a 1 se asigna al WDT
Me despido con saludo y pidiendo de nuevo mis mas sinceras disculpas
-
Juan bienvenido al foro; fijate que estas contestando un mensaje de hace un año, por lo que no tienes que pedir perdon porque esa persona Juan_tope no volvio a escribir desde aquella, seguro que ya no anda por el foro y el tema esta olvidado o resuelto
tapi8
-
Hola:
gracias me queda mucho por aprender
Un saludo tapi8