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

Temas similares

24/06/2016 #81


D@rkbytes dijo: Ver Mensaje
Una contención lógica es cuando dos o más terminales (pines) entran en corto circuito.
Esto sucede más en sistemas bidireccionales, cuando ambas se comportan como salidas y sus niveles lógicos son opuestos.

En tu programa lo que puede estar causando esa falla, es la librería que estás usando para la pantalla.
Al no cumplir con los tiempos adecuados de I/O (Entrada y salida) para el bus de datos, entran en colisión.

Solución: Modificar los tiempos de I/O, o usar la librería que viene con el compilador. "lcd420.c"
Gracias, modificare eso de la librería, incluso supongo que también se podría solucionar con la instrucción -fast_io-, no se; intentare y lo solucionare, muchas gracias y estaré al pendiente con nuevas.
24/06/2016 #82
Moderador

Avatar de D@rkbytes

arturkick dijo: Ver Mensaje
Incluso supongo que también se podría solucionar con la instrucción -fast_io-, no sé.
La instrucción "fast_io(puerto)", sirve para indicarle al compilador que utilice el puerto cómo se defina con la instrucción "set_tris_puerto()"

Por ejemplo, si tengo: #use fast_io(b)
// Defino los pines que serán entradas y salidas.
set_tris_b(0b11111000); // RB2, RB1 y RB0 como salidas.

Si después escribo, output_b(0xFF); // Únicamente se pondrán en 1 los bits declarados como salidas.
Si no se hubiera declarado "fast_io(puerto)", todo el puerto B se pondría en 1, aunque se haya declarado con "set_tris_b(valor);", que <RB7:RB3> sean entradas.

De esa forma el compilador respetará los pines definidos como entradas o salidas usando la instrucción "set_tris_x(valor)"
24/06/2016 #83


D@rkbytes dijo: Ver Mensaje
La instrucción "fast_io(puerto)", sirve para indicarle al compilador que utilice el puerto cómo se defina con la instrucción "set_tris_puerto()"

Por ejemplo, si tengo: #use fast_io(b)
// Defino los pines que serán entradas y salidas.
set_tris_b(0b11111000); // RB2, RB1 y RB0 como salidas.

Si después escribo, output_b(0xFF); // Únicamente se pondrán en 1 los bits declarados como salidas.
Si no se hubiera declarado "fast_io(puerto)", todo el puerto B se pondría en 1, aunque se haya declarado con "set_tris_b(valor);", que <RB7:RB3> sean entradas.

De esa forma el compilador respetará los pines definidos como entradas o salidas usando la instrucción "set_tris_x(valor)"
gracias por el conocimiento d@rkbytes, entonces no es como yo creía, definitivamente veré como manejo eso de la flex lcd ya que la librería propia del compilador (lcd420) trae definido el pin RB0 para usarlo con la lcd y yo queria usarlo para hacer interrupción, creo que la librería de lcd420 no se puede modificar como la libreria de lcd 16x2 utilizando #define y reasignar los pines o si?
24/06/2016 #84
Moderador

Avatar de D@rkbytes

arturkick dijo: Ver Mensaje
Creo que la librería de lcd420 no se puede modificar como la librería de lcd 16x2 utilizando #define y reasignar los pines. ¿O sí?
Si se puede modificar, yo ya lo he hecho y por aquí en el Foro podrás encontrar cómo se hace.
25/06/2016 #85


D@rkbytes dijo: Ver Mensaje
Si se puede modificar, yo ya lo he hecho y por aquí en el Foro podrás encontrar cómo se hace.
muchas gracias D@RKBYTES, lo checare
01/08/2016 #86


Me trabe
Hola, buenas tardes,

Estoy diseñando un reloj con calendario y múltiples alarmas basado en el libro de microcontroladores pic de Carlos A Reyes. El relog es lo de menos por que esta copiado del libro y funciona. Se me esta complicando mucho con el tema de las alarmas. Estoy usando un pic 16f628a el cual se encarga de traducir los datos de un ds1703 y los compara con los datos guardados en una memoria 24lc04b los cuales son cofigurables.
Hasta ahora estoy comparando únicamente segundos para ver resultados rápidos. por ahora la comparación funciona y no tuve que convertir variables ni nada pero tengo este problema...
Por ejemplo: mientras seteo los segundos estos cuentan en exadecimal y por ejemplo si seteo 0A que seria el equivalente a 10, la comparación entre la memoria y el reloj no funciona, pero si seteo 10 que en exadecimal seria 16 me hace la comparación entre 10 hexadecimal del ds1703 y 16 (10) exadecimal de la memoria y se activa la alarma, lo cual no le encuentro sentido, pero estaba buscando la forma de que para modificar la variable de alarma poner un contador que cada vez que cuente 10 pulsos de seteo me sume 6 puntos para saltar del 09 al 10 sin problema. pero no pude, y ya estoy trabajando a prueba y error por que me quede sin ideas.
una vez que solucione esto la idea es replicarlo hasta que no de mas la memoria del 24lc04b por lo menos 100 veces.
Les dejo el adjunto con mi proyecto y un código desordenado por que ya no se que inventar
Aclaro que estuve revisando el proyecto de D@rkbytes y me parece muy bueno, pero no me quiero alejar mucho de lo que estoy haciendo, a no ser que no me quede otra opción
Archivos Adjuntos
Tipo de Archivo: rar mi relog.rar (22,2 KB (Kilobytes), 10 visitas)
01/08/2016 #87
Moderador

Avatar de D@rkbytes

Necesitas convertir a BCD los datos que comparas, para que tengan el mismo formato.
No sé para qué son tantas variables, no las veo necesarias para lo que requieres.
En dado caso, puedes usar arreglos, por ejemplo: Hora Var Byte[23]

Por lo que veo hasta ahora del programa, (que no es mucho) yo si optaría por modificarlo para incluir las rutinas de conversión.
02/08/2016 #88


Hola d@rkbytes
Ahora estoy leyendo "basic para microcontroladores pic"
Ya leí sobre los array que es para guardar muchos datos diferentes en la misma variable dentro del microcontrolador, no se si se podrá aplicar a una memoria externa, tengo que probar y después les cuento.
Pero por eso puse tantas variables de horas y minutos, en el libro que estaba usando de guia no explica esto de los array, en total quiero que se puedan configurar 36 alarmas diferentes
Como explique el programa es poco, porque estoy probando la comparación y por eso programe únicamente los segundos para ver un resultado rápido, acá si te voy a tener que hacer caso entonces y poner el conversor, lo que no me queda claro por ejemplo, es que el ds1703 guarda los datos en exadecimal pero volviendo a la cuenta los datos de este saltan por ejemplo de 09 a 10 y no de 09 a 0A como en la memoria. lo que había hecho era que los datos de la memoria me los muestre el display con DEC2 pero al momento de comparar no me funcionaba ni comparando por ejemplo 10 con 10(0A) ni con 10(16) como explique en el mensaje anterior. Por eso el código por ahora quedo como esta escrito en el archivo.
Pero bueno.

Para no explicar tanto me parece que tengo que contar mi objetivo.

Lo que quiero hacer es un reloj calendario (hecho), que tenga la opción de configurar múltiples alarmas y guardarlas en una memoria externa(No terminado).

Gracias por la ayuda, saludos
02/08/2016 #89
Moderador

Avatar de D@rkbytes

El asunto es que el DS1307 no usa formato hexadecimal, si fuera así no habría problema entre formatos.
Para el microcontrolador es igual un 10 que un 0x0A, porque lo entenderá en binario, 0b1010

El DS1307 usa el BCD (Decimal codificado en binario), donde cada dígito decimal es codificado con una secuencia de 4 bits.

Usa la rutina de conversión del post #19 y tendrás ese problema resuelto.
02/08/2016 #90


Gracias D@rkbytes excelente, ya pude igualar el tipo de variables y ahora puedo hacer la comparación correctamente.
Ahora voy a seguir con los array a ver hasta donde llego.
Bueno gracias por esta mano, ahora tengo que seguir con una alarma completa y después con las 36 alarmas configurables para terminar.
Gracias nuevamente.
10/10/2016 #91


Buenas a todos,

Después de 2 meses volví a a retomar mi proyecto (aclaro que sigo experimentando)
Las variables array creo que ya las tengo dominadas (todavía no probé guardarlas en una memoria externa)
Volví a cambiar todo mi proyecto. pero volví a trabarme en el tema de la conversión y comparación.

Código:
CMCON = 7

DEFINE  I2C_SCLOUT  1    ;para que no necesite resistencia pull-up en SCL

DEFINE  LCD_DREG        PORTA         ; define pines del LCD  B4  a  B7 
DEFINE  LCD_DBIT          0      ; empezando desde el Puerto B4 hasta el B7 
DEFINE  LCD_RSREG       PORTB    ;define el puerto B para conectar el bit RS 
DEFINE  LCD_RSBIT         3      ;este es el puerto B3 
DEFINE  LCD_EREG        PORTB    ;define el puerto B para conectar el bit Enable 
DEFINE  LCD_EBIT          1      ;este es el puerto B2

DS1307  con %11010000
SCL     var PORTB.7        ; pin señal de reloj I2C
SDA     var PORTB.6        ; pin de datos I2C

Hrtc var byte
Mrtc var byte
Srtc var byte

Hbcd var byte
Mbcd var byte
BCDIn   Var Byte
BCDOut  Var Byte
BinHold Var Byte

Cuenta var byte
Hora var byte[24]
Minuto var byte[24]


    Hora[0]=00
    Hora[1]=01
    Hora[2]=02
    Hora[3]=03
    Hora[4]=04
    Hora[5]=05
    Hora[6]=06
    Hora[7]=07
    Hora[8]=08
    Hora[9]=09
    Hora[10]=10
    Hora[11]=11
    Hora[12]=12
    Hora[13]=13
    Hora[14]=14
    Hora[15]=15
    Hora[16]=16
    Hora[17]=17
    Hora[18]=18
    Hora[19]=19
    Hora[20]=20
    Hora[21]=21
    Hora[22]=22
    Hora[23]=23
    
    Minuto[0]=00
    Minuto[1]=02
    Minuto[2]=04
    Minuto[3]=06
    Minuto[4]=08
    Minuto[5]=10
    Minuto[6]=12
    Minuto[7]=14
    Minuto[8]=16
    Minuto[9]=18
    Minuto[10]=20
    Minuto[11]=22
    Minuto[12]=24
    Minuto[13]=26
    Minuto[14]=28
    Minuto[15]=30
    Minuto[16]=32
    Minuto[17]=34
    Minuto[18]=36
    Minuto[19]=38
    Minuto[20]=40
    Minuto[21]=42
    Minuto[22]=46
    Minuto[23]=48
        
lcdout $fe, 1

Inicio:

    for cuenta = 0 to 24
        LCDOut $FE,$80,"Alarma ",dec2 hora[cuenta],":", dec2 minuto[cuenta]
            
            I2CRead SDA,SCL,DS1307,0,[srtc]        
            I2CRead SDA,SCL,DS1307,1,[mrtc]
            I2CRead SDA,SCL,DS1307,2,[hrtc]
        
        LCDOut $FE,$C0,"Hora: ",Hex2 hrtc,":",Hex2 mrtc,":",Hex2 srtc," "
        
        BCDIn = hrtc
        GoSub DecToBCD
        hrtc = BCDOut
        BCDIn = mrtc
        GoSub DecToBCD
        mrtc = BCDOut
            
            if hora[cuenta] = hrtc then
                high porta.7
                pause 1000
            endif 
            
            pause 300
    next cuenta
        pause 300
    goto inicio

DecToBCD:
    BinHold = BCDIn
    BinHold = (BinHold Dig 1) * $10 + (BinHold Dig 0)
    BCDOut = BinHold
    Return

end
Probé convertir las alarmas a bcd y no me funciono, probé con las horas a bcd y tampoco me funciono.
La verdad... doy un paso para adelante y 4 para atrás
Adjunto el archivo que estoy usando para simular.
Sigue estando todo muy verde. ene este momento quiero resolver el tema de la comparación nada mas

Al final volví a convertir las alarmas. pero tuve que agregar 2 variables mas en el conversor para después usarlas para comparar Esta nueva etapa ya me quedo funcionando
Archivos Adjuntos
Tipo de Archivo: rar Relog.rar (17,5 KB (Kilobytes), 3 visitas)
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 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.