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


D@rkbytes dijo: Ver Mensaje
Para el programa 1 puedes hacerlo de esta forma:
Código:
Symbol Pulsador = PORTB.0

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    
Programa:
    If Pulsador Then                ; Si Pulsador = 1
    While Pulsador                  ; Mientras Pulsador = 1
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Wend                            ; Pulsador ahora está en 0
    LCDOut $FE,1                    ; Limpiar la pantalla
    EndIf
    GoTo Programa
Para el segundo programa de esta otra forma:
Código:
Symbol Pulsador = PORTB.0

; Declaración de variables.
B0          Var Byte
Contador    Var Byte

Inicio:
    LCDOut $FE,1        ; Inicializar la pantalla.
    Clear               ; Limpiar variables.
    
Programa:
    Button Pulsador,1,255,255,B0,0,Programa
    Contador = Contador + 1         ; Incrementar Contador
    If Contador = 1 Then            ; Si Contador llegó a 1...
    LCDOut $FE,$80,"HOLA"           ; Escribir en línea 1
    LCDOut $FE,$C0,"ELECTRONICA"    ; Escribir en línea 2
    Pause 100
    Else                            ; Si es superior a 1...
    LCDOut $FE,1                    ; Borrar la pantalla.
    Contador = 0                    ; Regresar Contador a 0
    EndIf
    GoTo Programa
    
    End
Nota que estás usando el pin RA4 para el pin RS de la pantalla y el pin RA4 es con drenador abierto.
Para utilizar ese pin y obtener los dos estados lógicos que se requieren, debes colocar una resistencia Pull-Up.

Adjunto los códigos y la simulación por si requieres saber la conexión.

Saludos.
hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo , con respuestas como estas, haces que los que apenas empezamos y veiamos la programacion de pic como algo muy complejo; le tomemos empeño y ganas de seguir explorando.

si no es molestia me gustaria que me expliacaras 2 dudas que tengo:

1.- esta instruccion del 2do programa.

Button Pulsador,1,255,255,B0,0,Programa


2.- La funcion del pulsador de reset en el pin MCRL, del pic es borrar todo rastro de programa grabado, para poder grabar otros programas? o tiene otra funsión? es necesario colocarlo en todos los ejercicios que quiera hacer? o al momento que yo quiera montar el ejercicio fisicamente no lo coloco para no borrar por accidende el programa?

Nuevamente muchas gracias compañero.
05/01/2014 #2682

Avatar de juancaca

jesusmolo dijo: Ver Mensaje
hola juancaca, de antemano gracias por tu pronta respuesta, te comento que siguiendo tus indicaciones o corrígeme si me equivoque en algo, hice lo siguiente:

Código:
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0     'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4    'EN EL BIT A.4
DEFINE LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500  ' PAUSE DE MEDIO SEGUNDO

;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0   ; BOTON DE AJUSTE PARA HORA

CONTADOR VAR BYTE

INICIO: 

   IF PULSADOR = 1  THEN
   CONTADOR = CONTADOR + 1 
   GOSUB AUMENTAR
   ENDIF
GOTO INICIO

AUMENTAR:

   IF CONTADOR = 1 THEN
   GOSUB PRENDER
   ENDIF
   IF CONTADOR = 2 THEN
   GOSUB APAGAR
   ENDIF
GOTO AUMENTAR

PRENDER:
   LCDOUT $FE, 1 ' LIMPIAR VISOR
   LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
   LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
   LCDOUT $FE, $0C                                        'APAGAR EL CURSOR
GOTO AUMENTAR

APAGAR:
   CONTADOR = 0
   LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
                                  
END
La resistencia es PULL DOWN en PORTB.0, me sigue apareciendo el mensaje intermitente.
Probare ahora como me indica D@rkbytes y les comentaré.
De todas maneras muchas gracias juancaca por tu tiempo.

Adjunto el diagrama en proteus.
hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona

codigo 1

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        GOSUB AUMENTAR
    ENDIF
GOTO INICIO

AUMENTAR:

    IF CONTADOR = 1 THEN
        GOSUB PRENDER
    ENDIF
    IF CONTADOR = 2 THEN
        GOSUB APAGAR
    ENDIF
GOTO inicio

PRENDER:
    LCDOUT $FE, 1 ' LIMPIAR VISOR
    LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
    LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
    'LCDOUT $FE, $0C 'APAGAR EL CURSOR
return 

APAGAR:
    
    CONTADOR = 0
    LCDOUT $FE, 1 ' LIMPIAR VISOR
return

END
codigo 2

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        if contador=1 then
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
            LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA 
        else
            contador=2
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            CONTADOR = 0
        endif    
    ENDIF
GOTO INICIO
end
espero te sirva
cordial saludo
05/01/2014 #2683
Moderador

Avatar de D@rkbytes

jesusmolo dijo: Ver Mensaje
si no es molestia me gustaría que me explicaras 2 dudas que tengo:

1.- esta instrucción del 2do programa.

Button Pulsador,1,255,255,B0,0,Programa


2.- La función del pulsador de reset en el pin MCRL, del pic es borrar todo rastro de programa grabado, para poder grabar otros programas? o tiene otra función? es necesario colocarlo en todos los ejercicios que quiera hacer? o al momento que yo quiera montar el ejercicio físicamente no lo coloco para no borrar por accidente el programa?
Para la primer pregunta mira por aquí: Instrucción Button PBP

La función del pin MCLR es resetear el microcontrolador, no borra el programa interno.
Al llevar este pin a un estado lógico 0 el microcontrolador reinicia el programa desde el vector de reset.
Sin embargo no reinicia los valores almacenados en la memoria RAM.
Por ese motivo hay que iniciar las variables con el valor deseado antes de la ejecución del programa.

En el PIC16F84A y algunos otros, por ejemplo los PIC16F87X/A este pin puede colocarse directamente a VCC.
De esta forma no se podrá resetear el microcontrolador por accidente.
La única forma de que se borre el programa es regrabando el microcontrolador o que éste se dañe.
En otros microcontroladores PIC el pin MCLR puede también ser usado como entrada.

Cualquier duda sobre el funcionamiento del PIC que uses se encuentra en su hoja de datos.
jesusmolo dijo: Ver Mensaje
hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo , con respuestas como estas, haces que los que apenas empezamos y veíamos la programación de pic como algo muy complejo; le tomemos empeño y ganas de seguir explorando.
De nada.
Continúa leyendo este Tema y encontrarás mucha información.

Saludos.
05/01/2014 #2684


juancaca dijo: Ver Mensaje
hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona

codigo 1

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        GOSUB AUMENTAR
    ENDIF
GOTO INICIO

AUMENTAR:

    IF CONTADOR = 1 THEN
        GOSUB PRENDER
    ENDIF
    IF CONTADOR = 2 THEN
        GOSUB APAGAR
    ENDIF
GOTO inicio

PRENDER:
    LCDOUT $FE, 1 ' LIMPIAR VISOR
    LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
    LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
    'LCDOUT $FE, $0C 'APAGAR EL CURSOR
return 

APAGAR:
    
    CONTADOR = 0
    LCDOUT $FE, 1 ' LIMPIAR VISOR
return

END
codigo 2

Código:
INICIO: 

    IF PULSADOR = 1 THEN
        while pulsador=1
        wend
        pause 200
        CONTADOR = CONTADOR + 1 
        if contador=1 then
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
            LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA 
        else
            contador=2
            LCDOUT $FE, 1 ' LIMPIAR VISOR
            CONTADOR = 0
        endif    
    ENDIF
GOTO INICIO
end
espero te sirva
cordial saludo
juancaca, muchas gracias por tan variadas soluciones, me doy cuenta que todo esta en el empeño y la creatividad que uno desarrolle para cada problema.
22/01/2014 #2685


Saludos a todos.
Amigo jesusmolo: Porque limpias la pantalla dos veces, creo que no es necesario.
23/01/2014 #2686


Saludos
Amigos despues de casi 2 semanas de trabajo puedo entrar con un poco de calma al foro, es dificil para mi ya que del trabajo soy exclavo, ayer estuve intentando modificar el codigo del codigo sobre los pulsadores pero aun no le encuentro el logaritmo adecuado para que trabaje como deberia de ser. este es el primer codigo que un amigo del foro me ayudo y trabaja perfecto con un solo pulsador activando su respectivo relay
Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_CLKOUT    
@ DEVICE WDT_OFF             
@ DEVICE PWRT_OFF            
@ DEVICE LVP_OFF               
@ DEVICE CPD_ON             
@ DEVICE PROTECT_ON 
       
DEFINE OSC 4 

CMCON = 7

TRISB = %00000000 
TRISA = %11110001 
PORTA = %00000000
PORTB = %00000000

TLED1       VAR word 
TLED2       VAR word 
TLED3       VAR WORD 

MinutO      var byte   
Segundo     Var Byte     
MAS_TIEMPO  VAR BYTE
INITIO      VAR BYTE
I           var byte

FLAG        VAR WORD
FLAG0       VAR word
FLAG1       VAR word
FLAG2       VAR word

AUX         VAR BYTE
MILISEGUNDO var byte



;******POTENCIA******///////****** 
LED_0       var PORTB.0  
LED_1       VAR PORTB.1 
LED_2       VAR PORTB.2 
LED_3       VAR PORTB.3
Trbuz       VAR PORTB.7
;********************///////******

;******PULSADORES****///////****** 
                
BOTON0      VAR PortA.0 
BOTON1      VAR PortA.6
BOTON2      VAR PortA.7
;********************///////******

TMR0 = 206
OPTION_REG = %10000111 'preescaller 256 
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
flag2=0
i=0
    

     INICIO:  
   
     if boton0 = 1 then    ;activo boton
     WHILE boton0 = 1
     I = I + 1
     FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
     PAUSEUS 10
     NEXT
     WEND
     WRITE 00,I
     goto verifica      
     endif 
     
     if led_0 = 0 and led_1 = 0 and led_2 = 0 then
     goto inicio
     else
     goto temporiza
     endif       
    
     verifica:
       
     if i => 256 then
     i = 0
     goto inicio
     endif
     
     IF I <= 50  THEN 
     SOUND Trbuz,[110,5] 
     Trbuz = 0
     FLAG0 = 10 'PARA UN TIEMPO DE 10 SEG
     toggle led_0
     I = 0
     ENDIF
     
     IF I <= 150 and i > 50 THEN 
     for aux = 0 to 1
     SOUND Trbuz,[110,5]
     pause 300
     next
     Trbuz = 0
     FLAG0 = 60 'PARA UN TIEMPO DE 1min
     toggle led_0
     I = 0
     ENDIF
     
     IF I <= 200 and i > 150 THEN  
     for aux = 0 to 2
     SOUND Trbuz,[110,5]
     pause 300
     next 
     Trbuz = 0
     FLAG0 = 120 'PARA UN TIEMPO DE 2min 
     toggle led_0
     I = 0
     ENDIF    
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '998.4 MILISEGUNDOS + 1.14 = 999.54 ML  = 1 SEG APORX.
     MILISEGUNDO = 0
     
     
     IF led_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     Led_0  = 0
     ENDIF 
     endif       
     GOTO INICIO
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS 
                 'EL VALOR DEL TMR0 ES DE 206 Y  EL DEL PREESCALER DE 256
                 'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
                 'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
                 'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
    Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP 

    END
pero al agregarle el segundo pulsador con su respectivo relay y que haga las mismas funciones que el primero ya no trabaja de la misma manera y se loquea o hace cosas que no le estoy indicando aca les dejo el codigo que trato de implementar espero poder explicarme bien y recibir su ayuda
Código:
TMR0 = 206
OPTION_REG = %10000111 'preescaller 256 
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000

FLAG0=0
FLAG1=0
FLAG2=0
i=0

    MAIN:
      IF BOTON0 = 1 THEN 
      GOTO UNOOO
      endif
      IF BOTON1 = 1 THEN 
      GOsub DOS
      endif
    GOTO MAIN   

   UNOOO:  
     IF BOTON0 = 1 THEN   
      WHILE BOTON0 = 1
       I = I + 1
        FOR AUX0 = 0 TO 1000 
         PAUSEUS 10
        NEXT 
       WEND
      goto verifica      
     endif
     
     if LED_0 = 0 then
      goto UNOOO    
     else
      goto temporiza
     endif   
    return

     verifica:
       
       if i => 256 then
        i = 0
       goto UNOOO
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
        toggle LED_0
       I = 0
      ENDIF
     
       IF I <= 150 and i > 50 THEN 
        for AUX0 = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 10 seg
         toggle LED_0
        I = 0
       ENDIF
        
       IF I <= 200 and i > 150 THEN  
        for AUX0 = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 15 seg 
       toggle LED_0
      I = 0
     ENDIF 
   return  
     
   DOS:  
     if BOTON1 = 1 then    
      WHILE BOTON1 = 1
       I = I + 1
        FOR AUX1 = 0 TO 1000 
         PAUSEUS 10
        NEXT
       WEND
     goSUB verifica1      
    endif      
    
     if LED_0 = 0 then
      goto DOS    
     else
      goto temporiza
     endif                
    return
    
     verifica1:
       
       if i => 256 then
        i = 0
       goto DOS
      endif
     
       IF I <= 50  THEN 
        SOUND Trbuz,[110,5] 
         Trbuz = 0
         FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
        toggle LED_1
       I = 0
      ENDIF
        
       IF I <= 150 and i > 50 THEN 
        for AUX0 = 0 to 1
         SOUND Trbuz,[110,5]
          pause 300
         next
          Trbuz = 0
          FLAG0 = 10 'PARA UN TIEMPO DE 10seg
         toggle LED_1
        I = 0
       ENDIF
       
       IF I <= 200 and i > 150 THEN  
        for AUX0 = 0 to 2
         SOUND Trbuz,[110,5]
          pause 300
         next 
        Trbuz = 0
        FLAG0 = 15 'PARA UN TIEMPO DE 15 seg
       toggle LED_1
      I = 0
     ENDIF   
    return  
     
     temporiza:
     IF MILISEGUNDO => 78 THEN  '
     MILISEGUNDO = 0
     
     
     IF LED_0 = 1 AND TLed1 < FLAG0 THEN
     TLed1 = TLed1 + 1
     ELSE
     TLed1  = 0
     FLAG0  = 0
     LED_0  = 0
     I      = 0
     endif       
     GOTO UNOOO
     
     IF LED_1 = 1 AND TLed2 < FLAG1 THEN
     TLed2 = TLed2 + 1
     ELSE
     TLed2  = 0
     FLAG1  = 0
     LED_1  = 0
     I      = 0
     ENDIF 
     endif       
     GOTO DOS     
     
    Disable
    MI_INTERRUPCION:
    PAUSEUS 13   
                 
    MILISEGUNDO = MILISEGUNDO + 1

    TMR0 = 206
    INTCON = %10100000
    Resume 
    Enable 

    END
la simulacion tambien lo adjunto
Archivos Adjuntos
Tipo de Archivo: rar PULSADOR NUEVO COD.rar (35,6 KB (Kilobytes), 55 visitas)
28/01/2014 #2687


Hola, amigos foreros,estoy tratando de aprender a programar microcontroladores,pero se me hace un poco dificil ya que en donde vivo no conosco a alguien que sepa de esto,tampoco hay centros de educacion para esto,el caso es que me compre un programador de pic y unos cuantos pic para probar,el caso es que estoy tratando de hacer un contador ascendente y descendente con dos pulsadores, un display de 7 segmentos y un pic 16F84A,en internet encontre lo que necesitaba para hacerlo funcionar, pero uno de 0 a 9 y de hecho funciona,pero quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.
Archivos Adjuntos
Tipo de Archivo: zip Contador.zip (102,3 KB (Kilobytes), 54 visitas)
28/01/2014 #2688

Avatar de COSMICO

Hola amigos.
Hace tiempo vengo siguiendo este hilo y me asalta una duda con respecto al reloj ds1307.
en el siguiente tramo de codigo, como hago para pasarlo a 12horas el reloj
Se supone que debo escribir el bit 6 del registro 2 en 1 sea %01000000, pero se me borra la hora sera haciendo una and, u or bueno mientras pido ayuda

grabarRTC:

I2CWRITE DPIN,CPIN,%11010000,0,[$00] ;setear 00 segundos
Pause 10 ;retardo para finalizar grabación
I2CWRITE DPIN,CPIN,%11010000,1,[$39] ;setear 39 minutos
Pause 10
I2CWRITE DPIN,CPIN,%11010000,2,[$12] ;setear las 23 horas
Pause 10
I2CWRITE DPIN,CPIN,%11010000,3,[$5] ;setear día lunes ,D=1,L=2
Pause 10 ;M=3 , M=4, J=5, V=6, S=7
I2CWRITE DPIN,CPIN,%11010000,4,[$06] ;setear día 27 del mes
Pause 10
I2CWRITE DPIN,CPIN,%11010000,5,[$8] ;setear mes agosto
Pause 50
I2CWRITE DPIN,CPIN,%11010000,6,[$09] ;setear año 09
Pause 10
I2CWRITE DPIN,CPIN,%11010000,7,[$10] ;control %00010000 para
Pause 10 ;encender el led cada 1 seg.


WRITE 0,1 ;escribe en la memoria 0 el valor de 1 para que no
;se vuelva a grabar otra vez estos datos en el RTC

goto inicio ;ir a presentar los datos en el LCD

end
29/01/2014 #2689
Moderador

Avatar de D@rkbytes

alex candelo q dijo: Ver Mensaje
aquí dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.
Para que alguien te pueda ayudar necesitas adjuntar el código en PICBasic Pro, no el código en ensamblador que genera el compilador.

Este debe tener extensión *.bas ó *.pbp
29/01/2014 #2690


alex candelo q dijo: Ver Mensaje
Hola, amigos foreros,estoy tratando de aprender a programar microcontroladores,pero se me hace un poco dificil ya que en donde vivo no conosco a alguien que sepa de esto,tampoco hay centros de educacion para esto,el caso es que me compre un programador de pic y unos cuantos pic para probar,el caso es que estoy tratando de hacer un contador ascendente y descendente con dos pulsadores, un display de 7 segmentos y un pic 16F84A,en internet encontre lo que necesitaba para hacerlo funcionar, pero uno de 0 a 9 y de hecho funciona,pero quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.
te ayudaria pero es asm yo solo trabajo en pbp.
29/01/2014 #2691

Avatar de ByAxel

alex candelo q dijo: Ver Mensaje
quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1,aqui dejo el esquema y el archivo .asm y el .hex para que alguien me ayude a modificarlo, de antemano muchas gracias.
Juega con la tabla puesta en el Label "L0012:", ahí están las combinaciones de dígitos para mostrar en el display.
Sugiero que pongas tus dudas en el tema adecuado como ASM desde cero, además el archivo *.asm está generado por un compilador Basic, revisa los comentarios para que puedas ir entendiendo el pseudocódigo.
29/01/2014 #2692

Avatar de COSMICO

Amigos, esto es un troso del código pbp, no se por que dicen que es asembler, también manejo asembler
no es de mi autoria eso si , solo lo estoy modificandolo.

---------- Actualizado después de 38 minutos ----------

Hola amigos, este es el código como les digo no es mio y esta aqui en el foro
Donde dice grabarRTC: se configura el Ds1307, pero no he podido pasarlo a formato 12 horas
y lo intento asi:
I2CWRITE DPIN,CPIN,%11010000,2,[$64] ;formato 12 horas %01000000
Pause 10
I2CWRITE DPIN,CPIN,%11010000,2,[$12 & $127 ] ;setear las 12 horas, 127 para no borras bit 6
Pause 10
Código:
;------------------------------------------------------------------------
;Programa para escribir y leer un RTC DS1307
include "modedefs.bas"        

;OPTION_REG.7=1  

Define LCD_DREG PORTB     ;usamos puertoB como salida de datos
Define LCD_DBIT 4           
Define LCD_RSREG PORTB   ;RS va conectado a puertoB
Define LCD_RSBIT 2               ; RS a Rb5
Define LCD_EREG PORTB     ; E va conectado a puertoB
Define LCD_EBIT   3
DEFINE LCD_COMANDUS 2000 
DEFINE LCD_DATAUS 600


CPIN  Var PortA.3                 ;pin señal de reloj I2C
DPIN  Var PortA.4                 ;pin de datos I2C
UP    VAR PORTA.0
DOWN_MODE  VAR PORTA.1
SET   VAR PORTA.2
TX VAR PORTB.1
POS   VAR BYTE

X VAR BYTE
FLAG VAR BIT
TIMEX VAR BYTE

LIMIT VAR BYTE

segu    var byte   ;definir tamaño de variable segundos 1 a 255
minu    var byte                    ;variable para los minutos
hora    var byte                    ;variable para las horas
diaS    var byte                    ;variable día de la semana 
diaF    var byte                    ;variable día fecha del mes
mes     var byte                    ;variable mes 
anio    var byte                    ;variable año de 2 dígitos
XTEMP VAR BYTE
TEMP1 VAR BYTE

dato    VAR BYTE                 ;variable para almacenar dato leído
actualizado VAR BIT              ;variable para almacenar un 1 o 0

EEPROM 0,[0]        ;memoria 0 con el valor inicial 0 , sirve para
                        ;indicar que nunca ha corrido este programa
READ 0,actualizado    ;carga el valor de la memoria EEPROM dirección 0

IF actualizado =0 THEN grabarRTC   ;si es la 1ra vez que corre ir a grabar RTC
                                   ;caso contrario solo leer el RTC
INICIO:   
    I2CREAD DPIN,CPIN,%11010000,0,[segu]   ;leer los datos de mem. 0,            
    I2CREAD DPIN,CPIN,%11010000,1,[minu]   ;1,2,..y guardarlos en sus
    I2CREAD DPIN,CPIN,%11010000,2,[hora]   ;respectivas variables
    I2CREAD DPIN,CPIN,%11010000,3,[diaS] 
    I2CREAD DPIN,CPIN,%11010000,4,[diaF]             
    ;hora=((hora DIG 1)*16)+(hora DIG 0)
    ;minu=((minu DIG 1)*16)+(minu DIG 0)

   ;lcdout $fe,1,DEC2 hora,":",DEC2 minu,":",hex2 segu       
    lcdout $fe,1,HEX2 hora,":",HEX2 minu,":",HEX2 segu;, " ",DEC2 TEMP1   ;mostrar la
                          ;hora minuto y segundos en 2 dígitos (HEX2)
 
PAUSE 300                            ;esperar 0,3 segundo
    

goto inicio                         ;volver a leer los datos

; ************************ subrutina grabar *********************
grabarRTC:
      
    I2CWRITE DPIN,CPIN,%11010000,0,[$00]   ;setear 00 segundos
        Pause 10                     ;retardo para finalizar grabación
    I2CWRITE DPIN,CPIN,%11010000,1,[$39]   ;setear 39 minutos
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,2,[$23]    ;setear las 23 horas
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,3,[$5]    ;setear día lunes ,D=1,L=2
        Pause 10                              ;M=3 , M=4, J=5, V=6, S=7
    I2CWRITE DPIN,CPIN,%11010000,4,[$06]    ;setear día 27 del mes
        Pause 10  
    I2CWRITE DPIN,CPIN,%11010000,5,[$8]    ;setear mes agosto
        Pause 50  
    I2CWRITE DPIN,CPIN,%11010000,7,[$10]   ;control %00010000 para
        Pause 10                           ;encender el led cada 1 seg.
    
    
    WRITE 0,1       ;escribe en la memoria 0 el valor de 1 para que no    
                    ;se vuelva a grabar otra vez estos datos en el RTC
    
    goto inicio                 ;ir a presentar los datos en el LCD
end
29/01/2014 #2693


D@rkbytes dijo: Ver Mensaje
Para que alguien te pueda ayudar necesitas adjuntar el código en PICBasic Pro, no el código en ensamblador que genera el compilador.

Este debe tener extensión *.bas ó *.pbp
Hola, aqui subo nuevamente todo con el codigo .bass.
Archivos Adjuntos
Tipo de Archivo: zip contador 2.zip (105,0 KB (Kilobytes), 40 visitas)
29/01/2014 #2694

Avatar de COSMICO

Hola amigos.
Ya solucione el problema, efectivamente tenia que hacer una or al escribir la hora para no borrar el bit am pm.Gracias a todos.
30/01/2014 #2695
Moderador

Avatar de D@rkbytes

alex candelo q dijo: Ver Mensaje
quiero que cuente de 0 a 6 y viceversa y que donde va el cero ponga el 1 y donde va el 1 ponga el 0, es decir 1,0,2,3,4,5,6 y viceversa 5,4,3,2,0,1.
El programa que adjuntas está en Basic pero para el PIC Simulator IDE.
Es algo más parecido al Basic de PROTON IDE pero de todas formas los lenguajes son similares.

Cómo este tema trata de programas en PICBasic Pro, hice la conversión del código y así es como quedaría.
Código:
@ Device PIC16F84A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device XT_OSC,WDT_OFF,PWRT_ON
;*******************************************************************************

Digito Var Byte

Inicio:
    TRISB = $80
    PORTB = 6
    Clear

MainLoop:
    If PORTA.1 = 1 Then
    Pause 250
       Digito = Digito + 1
        If Digito > 6 Then
            Digito = 0
        Endif
    EndIf

    If PORTA.0 = 1 Then
    Pause 250
        If Digito = 0 Then
            Digito = 6
        Endif
        Digito = Digito - 1
    EndIf
    
    LookUp Digito,[6, $3F, $5B, $4F, $66, $6D, $7D], PORTB
    
Goto MainLoop


    End
Adjunto el proyecto para usarlo con el compilador PICBasic Pro y la simulación.

COSMICO dijo: Ver Mensaje
Hola amigos.
Ya solucione el problema, efectivamente tenia que hacer una or al escribir la hora para no borrar el bit am pm.Gracias a todos.
Que bueno que lo lograste.

Cómo comentario, los mensajes anteriores estaban referidos a alex candelo q
Ya que él fue quién subió el código en ensamblador.

Suerte.
Archivos Adjuntos
Tipo de Archivo: rar contador 2.rar (13,0 KB (Kilobytes), 38 visitas)
30/01/2014 #2696

Avatar de COSMICO

jeje gracias por la aclaracion amigo D@rkbytes
Ye se me hacía raro raro raro
30/01/2014 #2697


D@rkbytes dijo: Ver Mensaje
El programa que adjuntas está en Basic pero para el PIC Simulator IDE.
Es algo más parecido al Basic de PROTON IDE pero de todas formas los lenguajes son similares.

Cómo este tema trata de programas en PICBasic Pro, hice la conversión del código y así es como quedaría.
Código:
@ Device PIC16F84A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device XT_OSC,WDT_OFF,PWRT_ON
;*******************************************************************************

Digito Var Byte

Inicio:
    TRISB = $80
    PORTB = 6
    Clear

MainLoop:
    If PORTA.1 = 1 Then
    Pause 250
       Digito = Digito + 1
        If Digito > 6 Then
            Digito = 0
        Endif
    EndIf

    If PORTA.0 = 1 Then
    Pause 250
        If Digito = 0 Then
            Digito = 6
        Endif
        Digito = Digito - 1
    EndIf
    
    LookUp Digito,[6, $3F, $5B, $4F, $66, $6D, $7D], PORTB
    
Goto MainLoop


    End
Adjunto el proyecto para usarlo con el compilador PICBasic Pro y la simulación.


Que bueno que lo lograste.

Cómo comentario, los mensajes anteriores estaban referidos a alex candelo q
Ya que él fue quién subió el código en ensamblador.

Suerte.
Hola, muchisimas gracias D@rkbytes ,funciono bien , usare los dos codigos para hacer modificaciones para tratar de comprender algo de programacion de pic.
Estoy leyendo tambien el tema de asm desde cero.Suerte.
31/01/2014 #2698

Avatar de reyvilla

codigo de los pulsadores cesarim
Hola compañeros de vuelta por acá luego de mucho trabajo, ya logre ponerme de nuevo con el código del compañero cesarim luego de retomarlo con calma lo cambie un poquito pero en esencia lo que hice fue copiar y pegar varias veces las misma instrucciones para cada pulsador lo cual es bueno ya que si funciona con uno con los otros debe funcionar también ya que se repiten las misma sentencias en cada uno, revisalo y me avisas mucho éxito y saludos
Archivos Adjuntos
Tipo de Archivo: rar CODIG2014CESRIM.rar (48,4 KB (Kilobytes), 45 visitas)
31/01/2014 #2699

Avatar de COSMICO

Bueno amigos. otra pregunta y a esto ya le luche mucho, leí la ayuda de pbp y nada
Lo que quiero es en vez de enviar los datos directos al DS1307 con este formato [$12] el cual lo recibe bien.
este trozo de código.
I2CWRITE DPIN,CPIN,%11010000,2,[$12] ;setear las 12 horas
Pause 10

Hacer lo siguiente

horas var byte; variable tipo byte horas
horas=0

IF porta.0 = 0 then
horas = horas + 1
I2CWRITE DPIN,CPIN,%11010000,2,[horas] ;setear las 12 horas
Pause 10
ENDIF

de la anterior manera se escriben los datos en forma erronea despues del número 9
Tambien probe interponiendo el $ para formato hexa [$hora], pero sin efecto alguno
Como hago para pasar el dato de esta variable a su igual en hexadecimal, ya comprobe que este es el problema. Por ejemplo, 10 dcimal debe ser igual a 0x10 hexa para que el rtcc me lo reconozca bien y lo grabe como 10 en su registro.Segun la hoja del DS1307 los valores deben ser escritos en formato hexadecimal...
31/01/2014 #2700

Avatar de ByAxel

COSMICO dijo: Ver Mensaje
Por ejemplo, 10 dcimal debe ser igual a 0x10 hexa para que el rtcc me lo reconozca bien y lo grabe como 10 en su registro.Segun la hoja del DS1307 los valores deben ser escritos en formato hexadecimal...
Nop, el formato del RTC es BCD...
El RTC no reconoce entre binario, decimal, hexa ya que es lo mismo pero el BCD tiene una regla que es cada 4 bits es un valor numérico de 0 a 9.

10 decimal = 0x0A en hexa. por aquí ya está mal.

No recuerdo pero creo que el PBP tiene para convertir binario a BCD y viceversa pero no es dificil.
> Para decenas 10 decimal / 10 = (1) división.
> Para unidades 10 decimal % 10 = (0) resto de división.
Con eso ya tienes separado el valor en BCD para luego unir los 4 bits de cada uno en una sola variable.
Saludos.
¿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.