Curso de programación de PIC en PICBasic Pro

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:
Sobre la primer pregunta:
Al utilizar Dec Dato, Si el resultado de Dato es de 3 dígitos (por ejemplo),
cuando el resultado sea de 2 ó 1 dígito, éste quedará a la izquierda de los dígitos anteriores y el resultado se verá confuso.
Para solucionar eso, debes utilizar DecX dónde X es la cantidad de dígitos a mostrar en el resultado.
Por ejemplo LCDOut $FE,$80,Dec4 Dato

Si el resultado es de 2 dígitos, se mostrará así: 0012

El espacio que se usó después de Dato," " debe servir para borrar algo a la derecha del resultado.

Sobre la otra consulta, lee las hojas de datos para que veas cual es la diferencia entre ambos.
 
claro ! ya lo veo por eso es que la cuenta pierde coherencia
12
11
10
90
80
70
...
el espacio para quitar ese cero porque no se especifica el numero de dígitos, gracias por eso.
en cuanto a lo de la "A " ya tengo los datasheet a primera vista tiene que ver por como estan hecho (cmos)

Por cierto referente al código anterior hay algo que me tiene liado con todos los codigos, y es que por ejemplo cuando tengo que hacer las pausas no se por que PARA MI cuando simulo en Proteus tengo que escribir 250 en Microcode para que en la simulacion transcurra 1 s .. lo que pienso es que es una mala configuracion pero no se como arreglarlo
 
Por cierto, referente al código anterior, hay algo que me tiene liado con todos los códigos, y es que por ejemplo, cuando tengo que hacer las pausas, no sé porque PARA MI cuando simulo en Proteus tengo que escribir 250 en Microcode para que en la simulación transcurra 1 s.
Lo que pienso es que es una mala configuración pero no sé como arreglarlo.
Eso debe ser porque en proteus algunos PIC tienen por defecto como frecuencia de trabajo 1MHz y seguramente tu programa trabaja con 4MHz.

Cambia la frecuencia de trabajo del PIC en proteus de acuerdo a la frecuencia de trabajo de tu programa.
 
si, gracias compañero la opcion se llama "processor clock frecuency" y esta dandole a las propiedades del microcontrolandor en el proteus, vienen con una configuración por defecto.
 
Buenas, quisiera saber si alguien me pudiera orientar en la comunicacion 1wire, ya tengo algunos conocimientos es programacion, quiero usar el sensor parallax colorpal con el PIC 16f877A, actualmente programo con PIC BASIC PRO....
 
Hola compañero sabrás si es posible lo que intento?
Lo que pasa es que tengo una impresora epson TMU-220 y quiero enviarle unos comandos Esc/Pos desde un pic 16F628 que tiene un puerto USART la impresora tiene RX y tx POR se me hizo posible poder usar este pic la verdad nunca en mi vida me habia metido en lo de la programacion de pic ni mucho menos se como grabarlo jejeje espero y me puedas orientar lo que quiero enviar al pic desde el puerto USART a la impresora epson es una leyenda y saber que la comunicación en ella si esta funcionando, pongo un ejemplo del los comandos Esc/Pos Y espero me puedas orientar a saber como lo puedo meter en el pic o si no es posible desde este pic basico me ayudes a buscar el optimo tengo varios proyectos y espero podamos colaborar juntos jjeje saludos
______________________
Ejemplo Esc/Pos
PRINT #1, CHR$(&H1B);"@"; 'Initializes the printer (ESC @)
PRINT #1, CHR$(&H1B);"a";CHR$(1);'Specifies a centered printing position (ESC a)
PRINT #1, CHR$(&H1B);"!";CHR$(0); 'Specifies font A (ESC !)
PRINT #1, "January 14, 2002 15:00";
PRINT #1, CHR$(&H1B);"d";CHR$(3); 'Prints and 3 line feeding (ESC d)
PRINT #1, CHR$(&H1B);"a";CHR$(0); 'Selects the left print position (ESC a)
PRINT #1, CHR$(&H1B);"!";CHR$(1); 'Selects font B
PRINT #1, "TM-U210B $20.00";CHR$(&HA);
PRINT #1, "TM-U210D $21.00";CHR$(&HA);
PRINT #1, "PS-170 $17.00";CHR$(&HA);
PRINT #1, CHR$(&HA); 'Line feeding (LF)
PRINT #1, CHR$(&H1B);"!";CHR$(17); 'Selects double-height mode
PRINT #1, "TOTAL $58.00"; CHR$(&HA);
PRINT #1, CHR$(&H1B);"!";CHR$(0); 'Cancels double-height mode
PRINT #1, "------------------------------";CHR$(&HA);
PRINT #1, "PAID $60.00";CHR$(&HA);
PRINT #1, "CHANGE $ 2.00";CHR$(&HA);
PRINT #1, CHR$(&H1D);"V";CHR$(66);CHR$(0); 'Feeds paper & cut
’Drawer Kick (ESC p)
PRINT #1, CHR$(&H1B); CHR$(&H70); CHR$(&H0); CHR$(60); CHR$(120);
________________________________________________________________-
La nota queda asi desde la impresora:
16m8tip.jpg


Aqui esta el manual esc/pos
y el datasheet del pic
http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf
http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf
saludos cordiales y gracias por cualquier ayuda brindada por adelantado
 
Como habrán notado soy nuevo en el foro, solicito sus comentarios y ayuda para terminar este proyecto con buen termino.
Estoy haciendo un contador en lcd, la idea es que graba la última cifra de la cuenta en la memoria interna hasta 65535, ya que le integro la memoria interna y solo me cuenta hasta 255 y se reinicia la cuenta de nuevo.
¿Alguien me puede ayudar por favor?
Anexo código en pbp. Saludos.
Código:
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
' Define registros y bits del LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

CMCON = 7
Cnt VAR Word    ' variables cont con capacitas de 8 bytescapacidad de 65535
                  
TRISB = 0         ' PORTB es salida
PAUSE 500        ' retardo para inicializar el LCD
Cnt = 0            ' limpia contador  y lo coloca a cero
LCDOUT $FE,1    ' limpia LCD 

inicio:                          ; rutina de conteo
    if porta.0=0 then        'pregunta
    cnt = cnt + 50           ' Incrementa contador 
    write 0,cnt                'graba mem.int.
    pause 10
    read 0,cnt 'CAJA 255     'lee mem. int.
    PAUSE 10       
    LCDOUT $FE,2             ' inicio del cursor LCD
    LCDOUT "CNT = ", DEC Cnt ' muestra en el display cnt y su conteo en decimal             
    PAUSE 300                ' espera un 0.3 seg.
    endif
    
    GOTO inicio              ' crea un bucle cerrado
    END                        ' fin del programa
 
Última edición por un moderador:
Ahora si me permiten compañeros del foro, quiero preguntarles que añadidura tengo que hacer para que me cuente hasta el limite word, pero ahora con mem. exterior, por su ayuda gracias de antemano.
Anexo mi programa:

Código:
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

CMCON = 7
TRISA=%11111100
TRISB=%0

Symbol SDA = PORTA.1 ' Alias para RB0
Symbol SCL = PORTA.0 ' Alias para RB1
      I VAR Byte     ' Declaración de variable "I"
     A1 VAR Byte     ' Declaración de variable "A1"
Direc VAR Word       ' Declaración de variable "Direc"
Control VAR Byte     ' Declaración de variable "Control"
Dato VAR Byte        ' Declaración de variable "Dato"

Pause 200            ' Pausa de 200 milisegundos para la LCD
LCDOut $fe, 1        ' Limpia la LCD

      Control = %10100000 ' Dato de Control
      Direc = $00 ' Dirección en la memoria externa
      Dato = 0 ' Dato inicial a ser grabado
memoria1:
      IF PORTA.2=0 THEN  'pregunta
      Dato = Dato + 50     ' Suma 2 a la variable "Dato"
      pause 300
      I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria
      Pause 10 ' Pausa de 10 milisegundos

      I2CREAD SDA, SCL, Control, Direc, [Dato]  ' Lectura de memoria
      LCDOUT $FE,1
     LCDOUT $fe, 2,"Dato ",#Dato                   ' Muestra el dato leido
      Pause 1000 ' Pausa de 1 segundo      
      ENDIF         'medio fin

GoTo memoria1 ' Salta a la etiqueta memoria a empezar nvo.
End
 
Última edición por un moderador:
hola a todos yo otra vez por aquí preguntando bobadas a ver sí me pueden ayudar, quisiera saber sí es posible crear un programa en basic donde yo pueda escoger varias funciones y estas estén en asm, algo así:

IF PORTA.0 = 1 THEN
c1 equ h'0c'
org h'00'
reset
goto start
org h'04'
start
mov1w h'09'
movwf c1
loop
incfsz c1,F
goto loop
goto start
ENDIF
 
Última edición:
¿Quisiera saber sí es posible crear un programa en basic dónde yo pueda escoger varias funciones y éstas estén en asm?
Si se puede, pero si quieres usar las variables dentro de un bloque en ensamblador en otra parte del programa, se tienen que usar diferente, "poniendo un guión bajo" para que el compilador distinga los punteros.

Mira este ejemplo en donde muestro como hacer lo que necesitas: Post #2379

Suerte.
 
Si se puede, pero si quieres usar las variables dentro de un bloque en ensamblador en otra parte del programa, se tienen que usar diferente, "poniendo un guión bajo" para que el compilador distinga los punteros.

Mira este ejemplo en donde muestro como hacer lo que necesitas: Post #2379

Suerte.

en tu codigo:
Código:
Loop100Ms
	decfsz	_Cnt1,F
	goto	$+2
	decfsz	_Cnt2,F
	goto	Loop100Ms
	goto	$+1
	nop
	return

porque pones el Goto $+1 y delante un nop seguido del return, ¿que no seria lo mismo poner?:
Código:
Loop100Ms
	decfsz	_Cnt1,F
	goto	$+2
	decfsz	_Cnt2,F
	goto	Loop100Ms
	return

o ¿cual es el fin de ponerlos?
 
Atrás
Arriba