Curso de programación de PIC en PICBasic Pro

Hola; compañeros de foro:
Por favor necesito su ayuda, estoy aprendiendo sobre el pic 16f628a en PBP y trato de hacer un timer para un ventilador manejado con optotriacs, no se como hacer que presionando el boton de stop por 10 segundos, entre a una parte del programa para cambiar el tiempo de funcionamiento, es algo asi:

if botonstop=0 (por >=10 seg.) then (gosub) (goto?) timer
....
....
....
timer:
if botonfrente= 0 then sumartiempo(para incrementar el tiempo de encendido)
if botonretro=0 then restartiempo (para reducir el tiempo de encendido)
return? goto inicio?
muchas gracias de antemano.
 
Saludos technique, dime exactamente lo que quieres que haga el programa y quizas pueda ayudarte, pero explica detalladamente y seguro aca te lo resolvemos, me gustaria saber que significa tiempo de encendido? es el tiempo que dura para encender o el tiempo que dura encendido? saludos
 
Última edición:
Hablando mal y pronto por que no me sente a pensarlo bien, creeria que podrias insertar la condicion if ... then para saltar a una rutina con un bucle de 10 segundoss con for...next y dentro de este bucle, si no ve que esta presionado el pulsador, retornar o ir a donde quieras...osea, que si esta presionado el pulsaodr hasta finalizar el bucle, al final solo tendrias que poner un goto e irias a la subrutina donde tendrias la parte de configutracion del temporixzador...
El tema esta en que en el momento en que entra en el bucle, el timer anterior, o mejor dicho, la cuenta del temporizador que tenias programado, al no correr en segundo plano, se pararia y si volves, retomaria desde donde lo dejo siempre y cuando no te4nga un reset la variable que almacena el dato del contador...Se entiende esto ultimo? De ultima, solo muestra parte de tu programa, y ahi sera mas facil ayudarte
Saludos
 
Última edición:
Hola que tal
antes que nada quiero agradecer a lubeck y a Maxtorcampos por su ayuda! Muchas Gracias :)
Les comento, ya logre establecer comunicacion con el pic, y mi practica ya quedo al 100%.
Lucbeck cuando ponia
portb=dat
me encendia los leds en el orden que mencione anteriormente. Por lo que opte por poner un if en cada dato, quedando asi
If dat=1 then high portb.0

y asi sucesivamente hasta encender el ultimo bit.

Maxtorcampos:
cuando ponia
if dat=128 then high portb.7
efectivamente el compilador ya no me mandaba errores, sin embargo el pic no reconocia esta instruccion, ya que no encendia ningun led.
porque pudo haber pasado esto?

reitero mis agradecimientos y si alguien gusta que comparta mi programa de labview y el del pic, con gusto los subo =)

un saludo
 
reitero mis agradecimientos y si alguien gusta que comparta mi programa de labview y el del pic, con gusto los subo =)

Lastima que ahora no tengo instalado el labview, no podras ponerlo en proteus....

me mata de curiosidad, el porque en ese pic, el binario no es binario....:unsure:
 
hola lubeck, con gusto, adjunto el de proteus y el que del pic que utilice para mi comunicacion.
por cierto veras que hay mas de 8 if's, bueno esto es porque era un corrimiento en sentido a la derecha y a la izquierda
 

Adjuntos

  • MC.rar
    7.9 KB · Visitas: 102
Pues no entiendo GOX.... ese codigo que me pasaste ni siquiera deberia de funcionar....:rolleyes:

puse este y va de 10 (y)

Código:
include "modedefs.bas"
@ device xt_osc 

trisc=%10000000
dat var byte 
trisb=0
portb=0

inicio:

serin portC.6, 0,dat
portb=dat
goto inicio

end
 
mmm.. fijate que en el proteus tienes el TX en RC6 y en el programa pones portC.1....

con respecto a los if .....thens.....

ya no se como mandas desde labview, es decir....

no es lo mismo un "1" (ascii) que en hexadecimal es un 31 o en binario es 00011001
a que mandes un 1 (numerico) que en hexadecimal es un 1 o en binario es un 00000001

ves la diferencia....

ahora si mandas un "1" es correcto como lo tienes....
si mandas un 1 es correcto como lo tengo...
 
me rindo.....:D

desde labview recibo datos numericos,

como es que recibes datos en labview.... si utilizas en el pic el comando SERIN????

quien manda a quie????

el labview no manda al pic???? , los manda en string(es lo mismo que Ascii).????

si es asi, entonces estas bien, y todo el problema estuvo en que tu intentaste recibir una cadena de caracteres (cadena de caracteres es la suma de dos o mas ascii o string) y por eso te marcaba error PICBASIC NO MANEJA CADENAS DE CARACTERES ejem Dat="18" (mal), Dat="1" (bien), y lo que paso es que MAXTORCAMPOS te suguirio quitar las comillas y yo me fui con el error y que recibias un dato numerico... por eso el portb=dat.....


al tu poner Dat="1" picbasic internamente traduce a DAt=00011001 y deja de manejar los ascii....

espero te sirva mi explicacion
 
Última edición:
si asi es, labview le manda al pic los datos.
entonces no puedo recibir un numero >10 en el pic??
porque en realidad labview si manda datos numericos, el problema es que esos datos numericos no pueden ser escritos en el "visa write" (que es el encargado de mandar los datos), debido a que este visa write no puede recibir datos numericos es necesario convertirlos a string, pero siguen siendo datos numericos solo que en otro formato para que el visa write pueda escrbirlos en el pic, se que los datos son numericos por que los obtengo de un for loop, el cual hace un conteo y con este conteo encendia y apagaba mis leds.

lubeck mi duda es.. envio datos numericos >10 previamente convertidos a string, como puedo hacer para que el pic me interprete este dato y pueda asi encender algo, se puede hacer esto?

ejemplo

IF dat=10 then HIGH portb.0

ya lo intente sin las comillas pero no enciende el led
 
Última edición:
lubeck mi duda es.. envio datos numericos previamente convertidos a string, como puedo hacer para que el pic me interprete este dato y pueda asi encender algo, se puede hacer esto?

pues si te entiendo bien, (yo no he usado el labview), lo que tienes que hacer es mandar al visa write el codigo ascii del numero, es decir si quieres mandar un 65 al pic entonces mandas una "A" que es el numerico que le corresponde, busca la tabla de codigos ascii...

si tu mandas una "A" que es el codigo 65 que es 1000001 te va a prender el bit 0 y el 6....
en microcontroladores debes de estar pensando siempre o lo mas posible en Binario...
 
ejemplo si mando un 75 que es una K que es 0100 1011
puedo poner
esto...
IF dat=K then high portb.0??

sin mandar una K necesariamente de labview, mando un 75, pero el pic, me puede interpretar este 75 como una K?
 
Última edición:
El PIC siempre hace lo que su programa le indique.... Si el programa indica que el dato recibido se debe tratar como "k" entonces el PIC la tratara como K, pero si le indica que la trate como numero entonces asi se hara....

No se si me explique.... :D
 
El PIC siempre hace lo que su programa le indique.... Si el programa indica que el dato recibido se debe tratar como "k" entonces el PIC la tratara como K, pero si le indica que la trate como numero entonces asi se hara....

No se si me explique.... :D

si, pero es que ese es mi problema, cuando yo recibo un 10 o un numero mayor a 10 el pic no hace nada, desde labview y debido a la programacion que tengobno puedo enviarle letras puro numero, si pudiera enviar letras se facilitaria todo. bueno cuando mando un 10 y el pic lo recibe simplemente no hace nada con este dato, y es lo que no entiendo, como puedo hacer para que el pic interprete este dato y asi pueda enecender un puerto
 
seguro que esta recibiendo un 10 (numerico) o estas recibiendo dos caracteres un "1" y un "0" osea un "10"???

el segundo picbasic no es posible que lo reciba...


es diferente....
 
yo hice este codigo que recibe caracteres y lo convierte en numero el pic
la idea es que mandes desde la computadora una serie de caracteres por ejemplo
"0000123*" cuando lo recibe el pic
el primer caracter que es un "1" le asigna DATO[5]=49 despues DATO[6]=50, despues DATO[7]=51
y cuando recibe el "*"
hace la conversion a 123 numerico

DATO[INDICE]=DATOE 'este es el caracter que recibo por el puerto serie
INDICE=INDICE+1
IF DATOE=="*" THEN ' cuando del PC llaga un "*" interpreto el numero que recibi
INDICE=1
FOR I=1 TO 7
SELECT CASE DATO 'dato que recibi
CASE 48 ' es un cero?
NUM=0
CASE 49 ' es un uno?
NUM=1
CASE 50 ' es un dos?
NUM=2
CASE 51 'creo que ya entendiero....
NUM=3
CASE 52
NUM=4
CASE 53
NUM=5
CASE 54
NUM=6
CASE 55
NUM=7
CASE 56
NUM=8
CASE 57 ' es un nueve?
NUM=9
CASE ELSE 'CUALQUIER OTRO CARACTER LO TOMA COMO CERO "O"
NUM=0
END SELECT
NEXT I
'aqui determino que numero me enviaron por el PC
DATOACUM=NUM[7] + NUM[6]*10 + NUM[5]*100 + NUM[4]*1000 + NUM[3]*10000

espero te sirva...
 
Última edición:
Atrás
Arriba