Curso de programación de PIC en PICBasic Pro

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.
hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo :aplauso:, 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. :apreton: :aplauso: (y)
De nada. (y)
Continúa leyendo este Tema y encontrarás mucha información.

Saludos.
 
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. :apreton::aplauso:(y)
 
Última edición:
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
 

Adjuntos

  • PULSADOR NUEVO COD.rar
    35.6 KB · Visitas: 74
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.
 

Adjuntos

  • Contador.zip
    102.3 KB · Visitas: 75
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:oops: sera haciendo una and, u or bueno mientras pido ayuda(y)

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
 
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.
 
Última edición:
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.
 
Amigos, esto es un troso del código pbp, no se por que dicen que es asembler, también manejo asembler:oops:
no es de mi autoria eso si , solo lo estoy modificandolo.;)



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 :confused:
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
 
Última edición por un moderador:
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.

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

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

Suerte.
 

Adjuntos

  • contador 2.rar
    13 KB · Visitas: 68
Última edición:
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. (y)

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

Suerte.

Hola, muchisimas gracias D@rkbytes :apreton:,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.
 
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 :apreton:
 

Adjuntos

  • CODIG2014CESRIM.rar
    48.4 KB · Visitas: 71
Bueno amigos. otra pregunta y a esto ya le luche mucho:unsure:, 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:oops:
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...:unsure:
 
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...:unsure:

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.
 
Última edición:
Hola compañeros.

estoy intentando establecer una comunicacion entre un pic18f2550 y un PC mediante USB, y estoy en el tipico error de que en proteus si funciona pero en la realidad no, el problema que presenta es que se conecta el circuito y se instala el controlador pero aparece un error y al volverlo a conectar el PC pone que no se recoconoce el dispositivo.

yo supongo que son los fuses no se si podrian echarle una miradita al codigo del Pic.

Código:
@ __config _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __config _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __config _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_3_2L & _VREGEN_ON_2L
@ __config _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
@ __config _CONFIG3H, _MCLRE_OFF_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_OFF_3H
@ __config _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _ICPRT_OFF_4L &_XINST_OFF_4L & _DEBUG_OFF_4L
@ __config _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
@ __config _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __config _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
@ __config _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H
@ __config _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
@ __config _CONFIG7H, _EBTRB_OFF_7H

DEFINE OSC 20          

USBBuffer        Var Byte[2] 
USBBufferCount   Var Byte 
Freq             var word 


usbinit 
main: 

 gosub DoUSBIn
 if usbbuffer[0]=1 then 
  toggle portb.0
  Freq=10130
  usbbuffer[0]=Freq.lowbyte
  usbbuffer[1]=Freq.highbyte
  gosub DoUSBOut
 endif

 freq=0
 
goto main

DoUSBIn:
   USBBufferCount = 2              
   USBService                                    
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   
   return
    
DoUSBOut:
   USBBufferCount = 2              
   USBService                                   
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut 
   return

anexo simulacion de proteus, visual basic y PBP
 

Adjuntos

  • LM.rar
    120.8 KB · Visitas: 62
Atrás
Arriba