Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/01/2013 #1


Problema con Interrupciones en el Pic16f628A
Estoy haciendo un reloj de ajedrez (2 relojes en cuenta regresiva que al accionarse uno este se pone en pausa y el otro continua y viceversa) el problema que tengo es que puedo parar el 1er reloj y hacer que continué el 2do con la función ON INTERRUPT GOTO y el puerto externo B.0 INTCON=%10010000... es posible asignar a otro puerto externo para asignarlo al 2do reloj vi que puedes usar los puertos b4-b7 pero no estoy muy claro.

Espero no confundirles y si es posible que me respondan en lenguaje PBP que es el único que se gracias...

Los 2 relojes estan en un LCD y al primer reloj lo controla un pulsador en el B.0 y el otro (No se como utilizarlo) en el B.1
05/01/2013 #2
Moderador

Avatar de D@rkbytes

torressnake dijo: Ver Mensaje
vi que puedes usar los puertos b4-b7 pero no estoy muy claro.
Espero que este ejemplo te aclare como usar las interrupciones externas por cambio de estado en RB4-RB7

Posiblemente puedas usar el código en tu proyecto.

Suerte.
05/01/2013 #3


Gracias por la respuesta... voy a revisarlo
25/01/2013 #4


Ya termine mi proyecto las interrupciones funcionan como deben Gracias y la simulacion es 10/10... ahora tengo otro problema al grabarle en el pic16f628 y probarle el circuito no funcionan... pueden revisar mi codigo... los fuses estan bien? no aparece nada en el lcd:

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 30/11/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ __config _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF

CMCON=7

TRISB=%10010000  'Se activa los puertos b.7 y b.4 

h1 VAR byte      'Se definen las variables para las horas, minutos y segundos

S1 VAR byte 

M1 VAR byte

h2 VAR byte

S2 VAR byte 

M2 VAR byte

DEFINE LCD_DREG PORTA     'Se definen los puertos A para el uso del LCD

DEFINE LCD_DBIT 0

DEFINE LCD_RSREG PORTA

DEFINE LCD_RSBIT 6

DEFINE LCD_EREG PORTA

DEFINE LCD_EBIT 7

BotonA var PORTB.4        'Se definen los botones de los jugadores
BotonB Var PORTB.7


'------------------------------------------------------------------------
'Programa inicial de bienvenida

INICIO:

LCDOUT $FE,$80, "Chess Clock V1.0"

LCDOUT $FE,$C0, "Press Any Button"
 
if BotonA=0 then    'Si se presiona el Boton A nos vamos al reloj uno y seteamos el segundo reloj
Lcdout $FE,1
LCDout $FE,$C8, DEC2 H2="0", ":", DEC2 M2="0", ":", DEC2 s2="0"
Goto Inicio1 
else 
if botonB=0 then    'Si se presiona el Boton B nos vamos al reloj dos y seteamos el segundo reloj
Lcdout $FE,1
LCDOUT $FE,$80, DEC2 H1="0", ":", DEC2 M1="0", ":", DEC2 s1="0"
goto inicio2
endif    
endif
goto Inicio
end

'--------------------------------------------------------------------------

INICIO1:              'Este es el programa para el reloj uno

s1=s1-1               'Se hace un algoritmo para crear una cuenta regresiva.
if s1>59 then
    s1=59
    m1=m1-1
    if m1>59 then
    m1=59
    h1=h1-1
        if h1>23 then
        h1= 0
        endif
    endif
endif

if s1=0 and m1=0 and h1=0 then  'En esta parte si la cuenta regresiva termina va
goto fin1                       'a otro programa que detiene el reloj
endif
           
LCDOUT $FE,$80, DEC2 H1, ":", DEC2 M1, ":", DEC2 s1  'Se imprime los valores en pantalla
PAUSE 800 

if PORTB.4=0 then resume INICIO2 'Si hay una interrupcion por parte del boton A se detiene
                                 'el proceso actual y se continua con el reloj dos
goto inicio1
end

'--------------------------------------------------------------------------

INICIO2:                   'Este es el programa para el reloj dos

s2=s2-1                    'Se hace un algoritmo para crear una cuenta regresiva
if s2>59 then
    s2=59
    m2=m2-1
    if m2>59 then
    m2=59
    h2=h2-1
        if h2>23 then
        h2=0
        endif
    endif
endif
     
if s2=0 and m2=0 and h2=0 then  'En esta parte si la cuenta regresiva termina va
goto fin2                       'a otro programa que detiene el reloj
endif

LCDOUT $FE,$c8, DEC2 H2, ":", DEC2 M2, ":", DEC2 s2  'Se imprime los valores en pantalla
PAUSE 800
if PORTB.7=0 then resume INICIO1 'Si hay una interrupcion por parte del boton B se detiene
goto Inicio2                     'el proceso actual y se continua con el reloj uno
end

'---------------------------------------------------------------------------
'Fin de los dos relojes setea en cero a los relojes


Fin1:
LCDOUT $FE,$80, DEC2 H1="0", ":", DEC2 M1="0", ":", DEC2 s1="0"
PAUSE 1000
end

Fin2:
LCDOUT $FE,$C8, DEC2 H2="0", ":", DEC2 M2="0", ":", DEC2 s2="0"
PAUSE 1000

end
---------- Actualizado después de 3 minutos ----------

Esta es la imagen del circuito:
https://www.dropbox.com/s/miavegyjin731zk/Diagrama.jpg
25/01/2013 #5
Moderador

Avatar de D@rkbytes

¿Qué programa estás usando para compilar?
Lo digo por la forma en que declaras los fuses, ya que tanto MicroCode Studio como MPLAB generarían error.

Si se usa MPLAB se tiene que modificar el archivo 16F628A.INC de la carpeta PBP.
Y si se usa MicroCode Studio, se escriben de otra forma, como en el programa que adjunte anteriormente.

Ahora, tomando eso en cuenta, así como los tienes declarados están bien y no tendrás problemas por ese lado.
Por mera curiosidad grabe un PIC y lo conecte a un LCD modelo JHD 162A, y el programa funciona bien.
Así que debes tener un problema de hardware. Revisa bien tus conexiones.

Una recomendación un tanto importante para ciertos displays, es darles un tiempo antes de iniciar, por ejemplo 500Ms.

Suerte.
25/01/2013 #6


Mi PC tiene MPLAB para que sea compatible con windows 7... y tengo una maquina virtual con el MicroCode y este tiene el ensanblador por defecto... ya les genere a los dos cambiandole los fuses y al momento de grabarle al pic no hay error pero sigue sin salir nada...

---------- Actualizado después de 9 minutos ----------

Unas Preguntas?
Solo le pongo un pause de 500 al inicio del programa o donde?
Probaste mi codigo y si te salio en tu lcd? sera posible que me pases el .hex (Para evitar sospechas)

Y por ultimo Gracias!
25/01/2013 #7
Moderador

Avatar de D@rkbytes

torressnake dijo: Ver Mensaje
Unas Preguntas?
Solo le pongo un pause de 500 al inicio del programa o donde?
Probaste mi codigo y si te salio en tu lcd? sera posible que me pases el .hex (Para evitar sospechas
El retardo se coloca antes de iniciar la pantalla.
Por ejemplo:
Pause 500
LCDOUT $FE,1 ; Limpia e inicializa la pantalla.
O de esta otra forma...
Pause 500
LCDOUT $FE,1,"Hola Mundo"

Sin embargo a mi me funciono normalmente aún sin agregar el retardo.

Aquí adjunto el proyecto en MPLAB probado físicamente y en simulación.

Nota:
Yo tengo que modificar los archivos PBPMPLAB.BAT y 16F628A.INC para utilizar MPLAB.

Suerte.
Archivos Adjuntos
Tipo de Archivo: rar Chess Clock Funcionando.rar (51,2 KB (Kilobytes), 22 visitas)
25/01/2013 #8


Gracias por la respuesta.
Ya le probe... y me sale el mismo resultado: Una linea prendida y la otra oscura... significa algo?

Si ayuda en algo tengo un quemador Pickit2 clone...
25/01/2013 #9
Moderador

Avatar de D@rkbytes

Posiblemente debe ser algo referente con los fuses que no se están estableciendo como són.
Yo no uso ese programador, utilice el PICSTART Plus.
Aquí en el Foro existen algunos temas que tratan sobre eso, posiblemente te sirvan.
No consigo grabar el pic
Con que grabar PIC 16f628a
Problema al iniciar el oscilador PIC16f628

Podría haber más temas. Pero prueba compilando un programa sencillo como hacer parpadear un LED,
para que verifiques si está trabajando el oscilador interno.

Suerte.
25/01/2013 #10


Creo que es problema del grabador pic (o de mi pic)... grabe la instruccion de parpadeo y nada... creo que voy a tener que probarlo con otro... Gracias de todos modos
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.