Curso de programación de PIC en PICBasic Pro

Se puede crear una máquina virtual para xp, y cosas así

el mismo windows 7 trae una utilidad para descargarla. Pero ya lo quise hacer y no pude :LOL:

Tendré q volver a intentar. GRACIAS y slds
 
Código:
stat var bit
boton var porta.0 [COLOR=blue]'puerto del boton[/COLOR]
main:
 stop:
 if boton then toggle stat:pause 200
 if stat then goto stop
 [COLOR=blue]' aqui tu codigo[/COLOR]
goto main
end
a ver si te sirve lo hice sin probar... :D

ERROR Line 31: Bad expression. (proyecto)
ERROR Line 31: Bad expression or missing THEN. (proyecto)
ERROR Line 31: IF without a matching ENDIF. (proyecto)

Esto es lo que me tira. Gracias por intentar ayudarme.
 
Código:
stat var bit
boton var porta.0 [COLOR="Blue"]'puerto del boton[/COLOR]
main:
 [B]stope:[/B]
 if boton then toggle stat:pause 200
 if stat then goto [B]stope[/B]
[COLOR="blue"] 'aqui tu codigo[/COLOR]
goto main
end
perdon el stop es una instruccion del compilador cambiala por stope...
 
Última edición:
Gracias Lubeck, pero te voy a molestar un poco mas:
Podrias comentar un poco las instrucciones que usaste?(mi intencio es aprender); y por alguna razon, al conectar la fuente arranca de una con el programa, sin esperar a que se oprima el pulsador. Yo tengo la entrada del pic conectada a masa a través de una R de 10k.
A, me olvidaba, como el codigo es "lento", un secuenciador, le cuesta parar, a veces tengo que oprimir unas cuantas veces para que se detenga, queria saber si se puede repetir ese fragmento de codigo a la mitad del programa principal para que haya mas posibilidades de que se detenga de una.
Gracias de nuevo.
 
Última edición:
Código:
stat var bit  [COLOR="blue"]'defines una variable tipo bit Alto o bajo 1 o 0[/COLOR]
boton var porta.0 [COLOR="blue"]'defines el puerto donde colocaste el boton pulsador[/COLOR]
High stat 'a[COLOR="blue"]qui pones en alto la variable stat=1 para que se haga el ciclo stope al iniciar[/COLOR]

main: [COLOR="blue"]' defines la etiqueta para el bucle infinito[/COLOR]
 stope: [COLOR="blue"]' defines la etiqueta para el regreso e impide que continue la ejecucion del programa[/COLOR]
 if boton then toggle stat:pause 200[COLOR="blue"] ' si el boton=1 (apretado) entonces cambia el estado de la variable stat si estaba en 1 la pone en 0 o viceversa (toggle) , el pause 200 es un antirebote[/COLOR]
 if stat then goto stope [COLOR="blue"]´ahora  si stat=1 (puede no ponerse el =1) entonces se regresa a la etiqueta stope si no continua con la ejecucion...[/COLOR]
 [COLOR="blue"]'aqui tu codigo[/COLOR]
goto main [COLOR="Blue"]' se cierra el bucle infinito y se va a main[/COLOR]
end

A, me olvidaba, como el codigo es "lento", un secuenciador, le cuesta parar, a veces tengo que oprimir unas cuantas veces para que se detenga, queria saber si se puede repetir ese fragmento de codigo a la mitad del programa principal para que haya mas posibilidades de que se detenga de una.
y si subes el codigo y vemos de que se esta hablando...
no creo que sea solucion el repetirlo...
 
Última edición:
CMCON = %00001111
TRISA = %11111111 'todos los pines como entradas
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
star var bit
boton var porta.6 'puerto del boton
High star

inicio:

stope:
portb = %00000000
if boton then toggle star:pause 200
if star then goto stope

PORTB = %00000001
pause 200
portb = %00000000
pause 200
PORTB = %00000010
pause 200
portb = %00000000
pause 200
PORTB = %00000100
pause 200
portb = %00000000
pause 200
PORTB = %00001000
pause 200
portb = %00000000
pause 200
goto inicio

end

Muchas gracias, ya casi lo tengo como quiero.
 
Última edición:
para eso te conviene la funcion...

on interrupt goto
sirve para interrumpir el pause ante un evento...
dale una estudiada primero... y si no lo asimilas postea...
el resto del codigo quedaria igual es solo para despausar las pausas :LOL:
 
Un saludo a todos,

Por aqui estoy molestando nuevamente, mis disculpas si les enredo el orden que ya traen pero necesito salir de una duda sobre las condiciones anidadas en pic basic, he tratado de hacer funcionar este pequeño código pero siempre da errado y no he podido, así que no me queda de otra que consultar con los que saben, aqui el código y muchas gracias de antemano:
Código:
A=2
B=5
C=6
D=5
F=6

INICIO:

IF (A=2  AND (A=B AND C=D)) THEN 
LCDOut "CAMBIO DE ESTADO"
PAUSE 500
ELSE
LCDOUT "ERRADO"
PAUSE 500
ENDIF
GOTO INICIO
END
 
Un saludo a todos,

Por aqui estoy molestando nuevamente, mis disculpas si les enredo el orden que ya traen pero necesito salir de una duda sobre las condiciones anidadas en pic basic, he tratado de hacer funcionar este pequeño código pero siempre da errado y no he podido, así que no me queda de otra que consultar con los que saben, aqui el código y muchas gracias de antemano:
Código:
A=2
B=5
C=6
D=5
F=6

INICIO:

IF (A=2  AND (A=B AND C=D)) THEN 
LCDOut "CAMBIO DE ESTADO"
PAUSE 500
ELSE
LCDOUT "ERRADO"
PAUSE 500
ENDIF
GOTO INICIO
END

Haber con lo que entiendo..., en esa comparación no hace falta poner paréntesis,
basta con if A=2 AND A=B AND C=D then, o que es lo que tratas de hacer?

saludos
 
gracias por responder,

Es cierto lo que me comentas, estaba errado en el código que quería publicar, es muy parecido:
Código:
ARCHIVO  VAR BYTE[2]
  A VAR BYTE 
  C VAR BYTE 
  F VAR BYTE
  SALIDA VAR PORTB.0
A=2
ARCHIVO[1]=6
C=6
ARCHIVO[2]=7
F=7

INICIO:

IF A=2  AND ARCHIVO[1]=c AND ARCHIVO[2]=f THEN 
LCDOut "CAMBIO DE ESTADO"
PAUSE 500
ELSE
LCDOUT "ERRADO"
PAUSE 500
ENDIF
GOTO INICIO
END
 
Los array comienzan desde el índice cero [0] que viene a ser el primero y como tu variable array es para dos valores, entonces solo se puede indexar con el [0] y el [1]. Por eso cuando usas ARCHIVO[2] da error porque la variable array no es de 3 valores.

saludos.
 
Bueno, estube leyendo sobre on interrupt goto, y por lo que aprendi para el 16f628 solo acepta interrupciones por algun portB, los cuales yo estoy usando todos como salidas. Tendria que cambiar todo el programa, pero lo peor es que ya tengo la plaqueta hecha.
Si no hay otra forma, tendre que hacerlo. Saludos y gracias
 
Si no hay otra forma, tendre que hacerlo.
si si hay otra forma....
eliminar el pause 200 y hacer los temporizadores con contadores...
dejame preparar algo... a ver si es de tu agrado...

Prueba este...
Código:
CMCON = %00001111  
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salida

star  var bit
boton var PortA.6
A     var byte
B     var word 
Clear
portb=0
high star
inicio:

if boton then 
 toggle star
 portb = 0
 pause 200
endif 

if not star then
 lookup a,[1,2,4,8],b
 PORTB = b
 pause 200
 a=a+1
 if a=4 then a=0
endif
goto inicio

end

el lookup puede ser este segun tu secuencia
lookup a,[1,0,2,0,4,0,8,0],b
y el if se cambia por esto if a=8 then a=0
 
Última edición:
Muchas gracias ByAxel por tu ayuda, ahora tengo un mensaje que se presenta cuando repito varias veces el proceso, que es cambiar de estado una salida con una clave, el mensajes es éste:
stack underflow executing return instruction.
stack underflow executing call instruction.

Gracias de antemano a quien decida ayudarme.
 
Gracias por responder Lubeck, sí es buena idea.
Código:
EPROM1 VAR BYTE
EPROM2 VAR BYTE



Inicio:

DIGITAR:
 x=0
 READ 0,EPROM1
 READ 1,EPROM2
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut, "Digite la clave."

Consulta:
Call Teclado
If VAR1 = 0  Then consulta 
If VAR1 = 10 Then Consulta	
If VAR1 = 11 Then VAR1=0    
If VAR1 = 12 Then Consulta       
X = X + 1
PAUSE 100
ALMACEN[X] = VAR1
IF X=1 THEN LCDOUT $FE,$C7,"*"
IF X=2 THEN LCDOUT $FE,$C8,"*": GOSUB VERIFICAR
GOTO CONSULTA

VERIFICAR:
PAUSE 40
if ALMACEN[1]=EPROM1 AND ALMACEN[2]=EPROM2  THEN
TOGGLE SALIDA
LCDOut $fe, 1
LCDOut "CAMBIO DE ESTADO"
PAUSE 400
ENDIF
GOTO INICIO
END
 
Creo que faltan mas cosas del codigo no?....
haciendo esto no me tira ningún error al compilar pero no entiendo que debe hacer....
Código:
EPROM1 VAR BYTE
EPROM2 VAR BYTE
x      var word
var1   var word
almacen var word[3]
salida var byte

Inicio:

DIGITAR:
 x=0
 READ 0,EPROM1
 READ 1,EPROM2
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut, "Digite la clave."

Consulta:
Call Teclado
If VAR1 = 0  Then consulta 
If VAR1 = 10 Then Consulta	
If VAR1 = 11 Then VAR1=0    
If VAR1 = 12 Then Consulta       
X = X + 1
PAUSE 100
ALMACEN[X] = VAR1
IF X=1 THEN LCDOUT $FE,$C7,"*"
IF X=2 THEN LCDOUT $FE,$C8,"*": GOSUB VERIFICAR
GOTO CONSULTA

VERIFICAR:
PAUSE 40
if ALMACEN[1]=EPROM1 AND ALMACEN[2]=EPROM2  THEN
TOGGLE SALIDA
LCDOut $fe, 1
LCDOut "CAMBIO DE ESTADO"
PAUSE 400
ENDIF
GOTO INICIO

teclado:
return

END
 
Ok Lubeck, no coloqué el código del teclado. El código funciona y lo unico que debe hacer es cambiar la salida y retornar nuevamente al mismo punto para nuevamente repetir el proceso, lo que sucede es que después de hacerlo varias veces, aunque sigue funcionando, lanza ese mensaje en cascada, uno tras otro. Aquí publico todo el código para ver si puedes ayudarme con eso pues quiero implementarlo pero sin errores o mensajes que me pongan a dudar.
Código:
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
 
  CMCON=7  
TRISB=%00000100 
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3
   
'----------------------
CAPTURA1 VAR BYTE
CAPTURA2 VAR BYTE
CAPTURA3 VAR BYTE
CAPTURA4 VAR BYTE
EPROM1 VAR BYTE
EPROM2 VAR BYTE
OPCION VAR BYTE
X VAR BYTE
Y VAR BYTE
A VAR BYTE
B VAR BYTE
VAR1 VAR BYTE
VAR2 VAR BYTE
ALMACEN  VAR BYTE[1]
ALMACEN2 VAR BYTE[2]
NCLAVE1 VAR BYTE
NCLAVE2 VAR BYTE
SALIDA VAR PORTB.0
'----------------------
 COLUMNA1 VAR PORTA.4
 COLUMNA2 VAR PORTA.7
 COLUMNA3 VAR PORTA.6
 
 FILA1 VAR PORTA.0
 FILA2 VAR PORTA.1
 FILA3 VAR PORTA.2
 FILA4 VAR PORTA.3
 '---------------------  
   EEPROM 0,[5,6]
   
 
 '---------------------   

Inicio:

DIGITAR:
 x=0
 READ 0,EPROM1
 READ 1,EPROM2
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut, "Digite la clave."

Consulta:
Call Teclado
If VAR1 = 0  Then consulta 
If VAR1 = 10 Then Consulta	
If VAR1 = 11 Then VAR1=0    
If VAR1 = 12 Then Consulta       
X = X + 1
PAUSE 100
ALMACEN[X] = VAR1
IF X=1 THEN LCDOUT $FE,$C7,"*"
IF X=2 THEN LCDOUT $FE,$C8,"*": GOSUB VERIFICAR
GOTO CONSULTA

VERIFICAR:
PAUSE 40
if ALMACEN[1]=EPROM1 AND ALMACEN[2]=EPROM2  THEN
TOGGLE SALIDA
LCDOut $fe, 1
LCDOut "CAMBIO DE ESTADO"
PAUSE 400
ENDIF
GOTO INICIO
END

   
    Teclado:
    VAR1=0
	LOW COLUMNA1      ' Columna 1 = 0
	If FILA1 = 0 Then VAR1 = 1 		' tecla "1"
	If FILA2 = 0 Then VAR1 = 4		' tecla "4"
	If FILA3 = 0 Then VAR1 = 7		' tecla "7"
	If FILA4 = 0 Then VAR1 = 10		' tecla "*"

	HIGH COLUMNA1     ' Columna 1 = 1
	LOW COLUMNA2      ' Columna 2 = 0
	If FILA1 = 0 Then VAR1 = 2 		' tecla "2"
	If FILA2 = 0 Then VAR1 = 5		' tecla "5"
	If FILA3 = 0 Then VAR1 = 8   	' tecla "8"
	If FILA4 = 0 Then VAR1 = 11		' tecla "0"
 
	HIGH COLUMNA2    ' Columna 2 = 1
	LOW COLUMNA3     ' Columna 3 = 0
 	If FILA1 = 0 Then VAR1 = 3		' tecla "3"
	If FILA2 = 0 Then VAR1 = 6		' tecla "6"
	If FILA3 = 0 Then VAR1 = 9		' tecla "9"
	If FILA4 = 0 Then VAR1 = 12		' tecla "#"
     HIGH COLUMNA3
    PAUSE 20
    RETURN        
    END
 
Última edición:
Hola que tal, hace poco que empece con esto de la comunicacion en serie, solo que ya he intentado varias veces y no encuentro el error, al parecer es Matlab, porque cuando corro el programa me dice que las variables tienen conflictos, alguien que me pueda hechar una manita??
Lo unico que quiero ke haga el pic es que prenda un led y se apague cuando el usuario asi lo desee.
Aqui dejo los programas que estoy utilizando
 

Adjuntos

  • ComSerial.rar
    646 bytes · Visitas: 142
Atrás
Arriba