desktop

Curso de programación de PIC en PICBasic Pro

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
 
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
Ya solucione mi problema con el 18f2550, los codigos estaban bien, el error estaba en que al parecer la pasta de soldadura hacia puente entre las pistas de los pines del cristal, la limpie y raspe con un cepillito. todo ok. gracias.

ahora surgió otro problema con el circuito para medir Inductancias pero ese ya es otro rollo. vere si lo soluciono por mi mismo:D
 
Hola.
Me gustaria saber como ir sumando el valor de las teclas pulsadas en un teclado matricial, y luego me lo almacene en una variable y me lo muestre en eun LCD
Ejemplo. Si pulso en el teclado13579000 me almacene 13.579.000 y me lo muestre el LCD
 
Hola ReyVilla te agradesco por tu tiempo yo acabo de descargar el archivo lo pruebo y te comento pero desde ya muchas gracias por tu ayuda ya que ahora podre ver que es lo que me faltaba inmediatamente lo probare amigo gracias



Amigo funciona de maravillas te agradesco mucho a ti y a todos que siempre aportan sus conocimientos ahora tratare de ponerle un led que oscile tiempo de 2 seg para poder ver que este encendido la placa. muchas gracias amigo muchas gracias a todos
 
Última edición:
Saludos a todos compañeros.
Hoy les traigo 2 dudas que me han surgido de una guía practica de lenguaje basic para PICS.
La cuestión es la siguiente:
Nota: el PIC que estoy usando es un 16f84A.

Código:
1 Define    LCD_DREG    PORTB
2 Define    LCD_DBIT    0
3 Define    LCD_RSREG    PORTB
4 Define    LCD_RSBIT    4
5 Define    LCD_EREG    PORTB
6 Define    LCD_EBIT    5
7 trisb = 0
8 trisa = %00011
9 dato var byte
10 dato=25
11 lcdout $fe,1
12
13 inicio:
14 lcdout $fe,2,"P1 suma P2 resta" 
15 Lcdout $fe,$C0,"Dato: ",Dec Dato
16 if porta.0 = 0 and dato<50 then call suma
17 if porta.1 = 0 and dato>0 then call resta
18 goto inicio
19
20 suma:
21 dato = dato+1
22 pause 250
23 return
24
25 resta:
26 dato = dato-1
27 pause 250
28 return
29
30 END
Cómo ya saben, simplemente muestra en pantalla cuando sumo o resto, la duda es que en la guía me especifican que el comando de la linea 15 debe ser escrito así

15 Lcdout $fe,$C0,"Dato: ",Dec Dato," "

Con ese espacio entre comillas, realmente desconozco el porque de eso, y es que si no coloco cuando empiezo a restar llega un punto en que el mensaje del display pierde coherencia con lo que hago y en vez de restar de 1 en 1, salta de 10 en 10 :S.
Me gustaría saber si alguien sabe cual es la función de ese espacio. OJO en la guía no me dicen en ningún momento el porque de ese espacio.
Bueno la otra cuestión es mas sencilla. ¿En que se diferencía un pic16f84A de un 16f84 ? (sin la A)
 
Última edición por un moderador:
Atrás
Arriba