Autor Tema: Aprendiendo proton  (Leído 2400 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado lionelmessi

  • PIC10
  • *
  • Mensajes: 6
Aprendiendo proton
« en: 12 de Diciembre de 2005, 22:44:00 »
Bueno primero que nada quiero agradecer a doopel, giovanni y olotill por ayudarme en todo este tiempo y crearme en algunos casos atajos en este hermoso mundo que conozco hace poco tiempo .
Siquiendo el consejo de  gio voy a poner en este foro todas las dudas que se me planteen a fin de poder ayudar de alguna manera a los que esten aprendiendoi al igual que yo.

En este caso al duda es la siguiente .
Se treta de comandar un pic  de forma que realize operaciones en funcion de una serie de pulsadores.

Por favor alguien que explique los comandos if then endif  en castenallo Muchas risas
a modo de ejemplo el siguiente funcionamiento
mediante tres pulsadores  al accionar uno se encienda un led al accionar el n2 otro led al accioanr el ultimo pulsador el ultimo led.

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Aprendiendo proton
« Respuesta #1 en: 12 de Diciembre de 2005, 23:35:00 »
Hola:

Me alegro que tre decidieras a unirte a esta GRAN COMUNIDAD...

aqui te pongo algo de codigo que hara lo que quieres...



Codigo:
device 16f84a "pic a utilizar
xtal 4 "cristal
 
TRISB=%00111000 " configuramos el puerto como entradas y salidas
PORTB=0 "enceramos el puerto b

loop:
    if PORTB.3 = 0 then "preguntamos el estado de uno de los pulsantes
       high 0:low 1:low 2 " si se presiono se enciende un led y los otros
    endif                 "se apagan
    if PORTB.4 = 0 then   " ocurre lo mismo para los otros casos
       high 1:low 0:low 2
    endif
    if PORTB.5 = 0 then
       high 2:low 0:low 1
    endif
    goto loop
end


Sobre los comando if then end if.... este es un comando... que hace una accion solo si se cumple lo deseado...
por ejemplo:

Codigo:
    if PORTB.5 = 0 then
       high 2:low 0:low 1
    endif


hara lo que esta entre el if y end if solo si portb.5 es 0 si es otro valor no lo hace, el endif es para decir donde termina el if.... todo esto esta en la ayuda de proton.... cualquier cosa que no lo tengas claro siempre revisa la ayuda... alli estan todos los parametros de cada funcion y para que te sirve cada una de ellas... si no te queda claro aqui estamos para ayudar... Sonrisa Gigante

Suerte.... Rebotado

Desconectado lionelmessi

  • PIC10
  • *
  • Mensajes: 6
RE: Aprendiendo proton
« Respuesta #2 en: 13 de Diciembre de 2005, 12:08:00 »
 Gracias giovanni sirvio mucho y sigo progresando ,  

Para seguir progresando se me plante la siguiente duda , que estoy seguro que es una papa para ustedes.

La idea de el siguiente ejemplo es: mediante 6 pulsadores controlar el mensaje que aparece en el display y a su vez obtener niveles altos en el portd.

Se me ocurrio la siguiente idea
Omitiendo las conexiones del lcd y tratandoce de un pic 16f877a:
 

ADCON1=%111    ,se cambian a salidas digitales el porta
trisa=%111111    ,se definen entradas y salidas porta
trisd=%000000    ,se definen entradas y salidas portd

pulsador1:

if PORTa.0 = 0 then
high portd.0      
print $Fe, 1                    
delayms 30                      
print $fe,128,"-  hola "
endif              
goto pulsador1


pulsador2:

if PORTa.1 = 0 then  
high portd.1      
print $Fe, 1                    
delayms 30                      
print $fe,128,"-como andas?"
endif              
goto pulsador2

pulsador3:

if PORTa.2 = 0 then  
high portd.2      
print $Fe, 1                    
delayms 30                      
print $fe,128,"-todo bien?"
endif              
goto pulsador3

pulsador4:

if PORTa.3 = 0 then  
high portd.3      
print $Fe, 1                    
delayms 30                      
print $fe,128,"-Donde estas? "
endif              
goto pulsador4

pulsador5:

if PORTa.4 = 0 then  
high portd.4      
print $Fe, 1                    
delayms 30                      
print $fe,128,"-con quien estas? "
endif              
goto pulsador5

pulsador6:

if PORTa.5 = 0 then  
high portd.5      
print $Fe, 1                    
delayms 30                      
print $fe,128,"Quien mato al sr burns?"
endif              
goto pulsador6

El problema de este codigo es que solo se obtiene lo deseado con el primer codigo if(pulsador1) .
Tendria que poderce pasar de un mensaje al otro con solo pulsar...

Les pido que recuerden que estoy aprendiendo para evitar que me vengan a golpear hasta argentina por algun error burro que cometi Muchas risas
Desde ya les voy diciendo gracias

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Aprendiendo proton
« Respuesta #3 en: 13 de Diciembre de 2005, 14:27:00 »
Hola:

Rubens, no te sorprendas con lo que hace el PIC recuerda que el obedece a tus ordenes mediante la programacion... ji ji ji Sonrisa Gigante

el problema radica aqui:

Codigo:
ADCON1=%111 ,se cambian a salidas digitales el porta
trisa=%111111 ,se definen entradas y salidas porta
trisd=%000000 ,se definen entradas y salidas portd

pulsador1:

if PORTa.0 = 0 then
high portd.0
print $Fe, 1
delayms 30
print $fe,128,"- hola "
endif
goto pulsador1


Nunca va a avanzar a otra linea ya que se queda en este bucle.... goto pulsador uno hace que sea un bucle infinito y no haga nada mas que eso... para lo que tu quieres hacer podrias utilizar una sola etiqueta y al final goto etiqueta y dentro de eso preguntar por el estado de los pulsantes como en el primer ejemplo, es decir algo como esto:

Codigo:
ADCON1=%111 ,se cambian a salidas digitales el porta
trisa=%111111 ,se definen entradas y salidas porta
trisd=%000000 ,se definen entradas y salidas portd

INICIO:

if PORTa.0 = 0 then
high portd.0
print $Fe, 1
delayms 30
print $fe,128,"- hola "
endif

if PORTa.1 = 0 then
high portd.1
print $Fe, 1
delayms 30
print $fe,128,"-como andas?"
endif


if PORTa.2 = 0 then
high portd.2
print $Fe, 1
delayms 30
print $fe,128,"-todo bien?"
endif

if PORTa.3 = 0 then
high portd.3
print $Fe, 1
delayms 30
print $fe,128,"-Donde estas? "
endif


if PORTa.4 = 0 then
high portd.4
print $Fe, 1
delayms 30
print $fe,128,"-con quien estas? "
endif


if PORTa.5 = 0 then
high portd.5
print $Fe, 1
delayms 30
print $fe,128,"Quien mato al sr burns?"
endif
goto INICIO


Con eso conseguiras obtener el estado de todos los pulsantes ya que tienes una sola etiqueta y dentro de ella preguntas los estados de los pulsantes... Sonrisa Gigante

Suerte....!

Desconectado lionelmessi

  • PIC10
  • *
  • Mensajes: 6
RE: Aprendiendo proton
« Respuesta #4 en: 14 de Diciembre de 2005, 21:24:00 »
Muchas gracias gio anduvo todo de puta madre jjeje .

Estaria bueno aprender algo referido al control de tiempos...

Seguimos con los pulsadores en portb , ya que estos se podrian traducir en simples barreras , controles finales , etc.

La idea es utilizar el conocido comando if para controlar una determinada cantidad de tiempo.
Es decir

if  PORTb.0 = 0 then
high portd.1  (y aca el timpo que este en high)

Lo unico que se me viene a la capocha es delayms pero me parece una idea descabellada.
Y por ultimo en caso de no querer esperar el timpo que se selecciono , una vez que esta transcurriendo: "hacer una parada critica y volver a una determinada parte de el codido se me ocurre que mediante un pulsador:

if esepulsador= 0 then
goto lapartedelcodigo

espero no estar delirando mucho.

Solo tengo palabras de agradecimiento para la gente que conoci en el foro....Giño

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Aprendiendo proton
« Respuesta #5 en: 14 de Diciembre de 2005, 22:43:00 »
Hola:

No es descabellado lo del delayms

puedes hacer algo como esto, la idea es buena ahora esa plasmala en codigo y pruebalo y si el codigo no funciona o tienes algun error puedes postear el codigo aqui para revisarlo entre todos... Sonrisa Gigante


Desconectado lionelmessi

  • PIC10
  • *
  • Mensajes: 6
RE: Aprendiendo proton
« Respuesta #6 en: 15 de Diciembre de 2005, 10:53:00 »


La idea es la sihuiente:

Tengo dos juegos de pulsadores.. los de la derecha e izquierda
al apretar el primero me aparece un mensaje en la primera linea del lcd, eso mismo con todos los pulsadores de izq
al apretar alguno de los pulsadores  de la  derecha aparece un mensaje en la segunda linea del lcd, eso mismo con todos los pulsadores de la der. en este caso el tiempo

Osea selecciono el mensaje y se enciende por un determinado tiempo,,

Si pongo en la primera linea del lcd "Hola" y abajo selecciono 1 minuto que me entregue en portc.0 un nivel alto por 1 minuto..
Si pongo en la primera linea del lcd "chau" y abajo selecciono 1 minuto que me entregue en portc.1 un nivel alto por 1 minuto..
y asi con todos los pulsadore 5 min , 20 min  esa parte seri facil ( delayms)
pero  que una vez que seleccione aprete un pulsador que funcione de enter y me inicie el proceso...
Hasta aca llegue y me quede ...

trisa=%111111
trisd=%11100000
trisc=%11111111


INICIO:

    if PORTa.0 = 0 then
   
    delayms 100
    print $Fe, 1
    delayms 30
    print $fe,128,"Hola . "
    endif

    if PORTa.1 = 0 then
 
    delayms 100
    print $Fe, 1
    delayms 30
    print $fe,128,"chau "
    endif

  if PORTD.0 = 0 then
   
    delayms 30
    print $fe, $c0                    
    print "TIEMPO:    1 MIN"            
    endif
   
    if PORTD.1 = 0 then
 
    delayms 30
    print $fe, $c0                    
    print "TIEMPO:    5 MIN"            
    endif

Goto inicio

se me  ocurre algo como:

if port (PORTa.0) and (PORTd.0) : 0 then
high portc.0
delays (1 minuto) no se bien como se expresa
low portc.0

pero nose si esta bien

Solo tengo palabras de agradecimiento para la gente que conoci en el foro Giño

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Aprendiendo proton
« Respuesta #7 en: 15 de Diciembre de 2005, 13:31:00 »
Hola:

if port (PORTa.0=X) and (PORTd.0=X) then
-
-
-
-
-
endif

Asi seria lo que tu quieres hacer...

con respecto al tiempo mira la ayuda de proton:

Example

XTAL  = 4
   DIM VAR1 as BYTE
   DIM WRD1 as WORD
   VAR1 = 50
   WRD1= 1000
   DELAYMS 100      " Delay for 100ms
   DELAYMS VAR1      " Delay for 50ms
   DELAYMS WRD1   " Delay for 1000ms
   DELAYMS WRD1+ 10   " Delay for 1010ms

Puedes poner un delayms 60000 que seria un minuto pero toma en cuenta que el micro se quedaria en un bucle hasta que termine el tiempo y luego ejecutaria lo que sigue en tu programa.

Otra opcion es que hagas un bucle y alli utilices un tiempo mas corto y puedes preguntar por el estado de un pulsante por si quiere cancelar la operacion algo asi:

Codigo:
for i=0 to 60
   delayms 100
   if PORTD.0 = 0 then
      break
   endif
next i


donde D0 seria un boton para cancelar la accion... Sonrisa Gigante

Suerte...!

Desconectado lionelmessi

  • PIC10
  • *
  • Mensajes: 6
RE: Aprendiendo proton
« Respuesta #8 en: 16 de Diciembre de 2005, 21:41:00 »
Gracias una vez mas pude implementar tu ejemplo a mi proyecto muy bien.

Ya estoy en la etapa final...
Me falta un pelin....
Ese pelin es lo siguiente:
Se puede de alguna manera hacer una cadena de susesos para activar un determinado terminal del pic?
Haber si me hago entender.:

si primero porta.0 a se pone en 1 y luego porta.0 se pone en 1 entonces aparezca un 1 en portd.0

si primero porta.1 a se pone en 1 y luego porta.0 se pone en 1 entonces aparezca un 1 en portd.1

se entiende osea de acuerdo a el orden en que aparezcan en alto los terminales suceda algo

Espero que cuando te hagas un ratito me puedas contestar, estoy seguro que es muy facil pero no lo puedo resolver
Desde ya te lo voy agradeciendo--

Solo tengo palabras de agradecimiento para la gente que conoci en el foro  .Giño

Desconectado lionelmessi

  • PIC10
  • *
  • Mensajes: 6
RE: Aprendiendo proton
« Respuesta #9 en: 16 de Diciembre de 2005, 21:48:00 »
me confundi
la secuencia es

si primero porta.0 a se pone en 1 y luego porta.1 se pone en 1 entonces aparezca un 1 en portd.0
si primero porta.1 a se pone en 1 y luego porta.0 se pone en 1 entonces aparezca un 1 en portd.1
gracias

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Aprendiendo proton
« Respuesta #10 en: 18 de Diciembre de 2005, 00:11:00 »
Hola:

Se me ocurre que utilices una variable para que le asignes un valor cuando sea presionado el primer boton, en ese instante tendra un valor, y cuando presiones la otra tecla pregunta por ese valor, de no ser asi se deberia haber pulsado otro boton, y si fue la secuencia correcta puedes hacer que salte a una subrutina para que hagas la accion que desees, y luego cambiar el valor de la variable... espero haberme hecho entender.... Avergonzado


 

anything