Curso de programación de PIC en PICBasic Pro

Hola si se quisiera hacer un semaforo cual seria la programacion en el pic???
y si tuviera un contador de 12 a 0 hasta que se cambie de rojo a verde pero antes tiene que esperar 2 segundo en amarillo???
 
Última edición:
Hola jpetatob si te refieres al código depende de que funciones va a tener el semaforo, si es sencillo de uno o dos bombillos como el de los trenes, o si es peatonal o vehicular. Si tiene un contador con 7 segmentos...etc.
 
GRABANDO:

WRITE ADDRM1,MPOS1 'GRABA EN LA EEPROM EL VALOR DE MPOS1 EN LA DIRECCION ADDRM1
WRITE ADDRM2,MPOS2 'GRABA EN LA EEPROM EL VALOR DE MPOS2 EN LA DIRECCION ADDRM2
WRITE ADDRM3,MPOS3 'GRABA EN LA EEPROM EL VALOR DE MPOS3 EN LA DIRECCION ADDRM3
WRITE ADDRM4,MPOS4 'GRABA EN LA EEPROM EL VALOR DE MPOS4 EN LA DIRECCION ADDRM4
WRITE ADDRM5,MPOS5 'GRABA EN LA EEPROM EL VALOR DE MPOS5 EN LA DIRECCION ADDRM5
PAUSE 10

ADDRM1 = ADDRM1 + 5 'INCREMENTA ADDRM1 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM2 = ADDRM2 + 5 'INCREMENTA ADDRM2 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM3 = ADDRM3 + 5 'INCREMENTA ADDRM3 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM4 = ADDRM4 + 5 'INCREMENTA ADDRM4 DE 5 EN 5 PARA DIRECCION DE MEMORIA
ADDRM5 = ADDRM5 + 5 'INCREMENTA ADDRM5 DE 5 EN 5 PARA DIRECCION DE MEMORIA

RETURN 'Retorna


*****************************************************
Cada vez que se va esta subrutina incrementa la dirección de memoria de 5 en 5 para lograr que al grabar nuevamente no se monten los datos uno sobre otro.

Así como esta funciona pero creo que con un next se puede mejorar...saludoss:)
QUE TE PARESE LO SIGUIENTE
Declaras estos arreglos
ADDRM VAR BYTE[5]
MPOS VAR BYTE[5]

FOR I=1 TO 5
WRITE ADDRM,MPOS
NEXT I
FOR I=1 TO 5
ADDRM=ADDRM + 5
NEXT I

este codigo hace lo mismo, pero con next...:D
 
Así como esta funciona pero creo que con un next se puede mejorar

Intenta con esto...

Código:
MPos  Var Byte[5]
I     var byte
Add   var byte
Add=0

Main:
Goto Main

Grabando:
 for I=0 to 4
  write i+add,mpos[i]
  pause 10
 Next I
 add=add+5
 if add>=256 then add=0  'limite de direccion de memoria
Return
 
Última edición:
Es con contador de 7 segmentos........para paso peatonal.......y con 2 semaforos tipo vehicular.....el codigo seria dificilll???

se pueden realizar con cualquier pic??
 
Muchas gracias muchachos ya lo pongo en prueba y les comento en un rato...saludoss

PD:Me acabo de fijar en algo la variable MPOS1 son independientes ya que las uso para la sentencia de pulsout de cada servo motor alli es donde coloco el valor de la suma según el valor del adc asignado es este.

PULSOUT M1,MPOS1 'Envia un pulso a M1 con duracion de MPOS1 en msg donde m1 es el servomotor
PAUSE 10 'Pausa de 10 msg

y el valor de MPOS1 lo obtengo de:

ADC0:

ADCIN 0, SM1 'Lee la entrada adc 0 y guarda su valor en H
IF SM1 <= 400 THEN 'Si SM1 es menor o igual a 400 entonces
MPOS1 = MPOS1 - 2 'MPOS1 es igual a MPOS1 - 2
IF MPOS1 <= 55 THEN MPOS1 = 55 'Si MPOS1 es menor o igual a 55 entonces MPOS1 es igual a 55
ENDIF 'Finaliza la condicion

IF SM1 => 600 THEN 'Si SM1 es mayor o igual a 600 entonces
MPOS1 = MPOS1 + 2 'MPOS1 es igual a MPOS1 - 2
IF MPOS1 => 250 THEN MPOS1 = 250'Si MPOS1 es menor o igual a 250 entonces MPOS1 es igual a 250
ENDIF 'Finaliza la condicion
RETURN 'Retorna


Espero ahora este algo mas claro la situación, lo mismo se repite con adc1, adc2...m1,m2...MPOS1, MPOS2.

En total son 5 motores controlados según el valor de MPOS1 que se decrementa o incrementa según el valor obtenido en el adc.
 
Última edición:
Si te funciono el post anterior que puse, puede que te sirva asi:

Código:
MPos  Var Byte[5]
I     var byte
Add   Var byte
SM    Var Byte

Add=0

Main:
 PulsOut PortA.0,MPos[I]
 Pause 10 
 Gosub ADC_X
 Gosub Rec_Mem
Goto Main

ADC_X: 
 For I=0 to 4
  ADCIn I, SM 
  If SM <= 400 Then  
   MPos[i] = MPos[I] - 2 
   If MPos[I] <= 55 Then MPos[I] = 55 
  EndIf 
  If SM => 600 Then
   MPos[I] = MPos[I] + 2 
   If MPos[I] => 250 Then MPos[I] = 250
  EndIf 
 Next I
Return 

Rec_Mem:
 For I=0 to 4
  Write I+Add,MPos[I]
  Pause 10
 Next I
 Add=Add+5
 If Add>=256 Then Add=0  'limite de direccion de memoria
Return
 
Última edición:
lubeck interesante el codigo me puse analizarlo y resulta que puedo lograr leer todos los adc segun veo pero lo que no estoy seguro es si lograre mover los 5 servomotores ya que estan en distintos pines del pic por lo cual quedaria la duda si usar otro for next para ir alternandolo de salida, por otro lado aun no entiendo bien lo de porque usar una variable tipo byte estoy algo confundido con eso ya que creía que tenia que ser de tipo word para el adc?
 
lo que no estoy seguro es si lograre mover los 5 servomotores ya que estan en distintos pines del pic por lo cual quedaria la duda si usar otro for next para ir alternandolo de salida,

yo tambien tengo esa duda :D

no se si segun el pic se pueda...

en lugar de poner
PulsOut PortA.0,MPos

poner ....
for I=0 to 4
PulsOut I,MPos
next I
no creo que funcione... :D voy a investigar si se puede o hay alguna alternativa...

por otro lado aun no entiendo bien lo de porque usar una variable tipo byte estoy algo confundido con eso ya que creía que tenia que ser de tipo word para el adc?

bueno eso depende de la resolucion que ocupes en el ADC algunos los puedes configurar de 8bit y otros de 10bits si lo usas de 8 pues esta bien tipo byte si los usas de 10 pues lo pones tipo word...

eso se define con la instruccion...DEFINE ADC_BITS 8 ' Set number of bits in result
 
Hola lubeck logre avanzar pero no mucho aun no logro que funcione, el codigo que logre hacer es el siguiente:

FOR I = PORTD.0 TO PORTD.3
PulsOut I,150
Pause 10
NEXT I

Donde I debe de ir desde PORTD.0 hasta PORTD.3 enviando un pulso de 1,5 milisegundos, PBP lo compila pero al tratar se simularlo no envía los pulsos...Que crees que pueda ser?
 
Que crees que pueda ser?

:unsure: no creo que funcione...

que pic estas usando?



no rey....

no es posible con un for...next....
porque cuando lo ensambla lo pone asi sin el for next...

PULSOUT?TC _PORTB??5, 096h lo rojo es el puerto donde va hacer el pulso

y con el for... next lo ensambla asi...
MOVE?CB 005h, _i
PULSOUT?BC _i, 096h

para que funcionara deberia ensamblarlo asi...
MOVE?CB _PORTB??5, _i
PULSOUT?BC _i, 096h

lo que quizas el ensamblador no lo reconozca....

asi que lo tienes que hacer separado...

osea
pulseout portD.0,mpos[0]
pulseout portD.1,mpos[1]
pulseout portD.2,mpos[2]
pulseout portD.3,mpos[3]
 
Última edición:
Ya me estaba emocionando el de haber sido, el codigo de 2 paginas lo hubriera reducido a media o menos...jajaja:LOL: casi, casi, bueno ya desisto de igual forma sigo con el proyecto aun no lo termino de armar es un brazo con 6 servos, esta quedando algo grande para lo que estime pero lo importante es que funcione a penas lo termine subo un video muchas gracias por tu tiempo amigo lubeck...:apreton:
 
:unsure:

algo no me cuadra :D

lo unico que no se puede hacer es el PulsOut con el for next, lo del resto del programa que te puse deberia ser funcional, pero claro... solo tu sabes si te funcionaria... si puedes ( y quieres) sube los archivos que llevas y vemos si se puede depurar....
 
Ok el circuito y el codigo completo, cada motor tiene una funcion, hay dos que se mueven juntos, y uno que se mueve por dos pulsadores y todos los demas cada uno tiene un pot...Para grabar una secuencia de movimiento primero posicionas los motores y luego le das al pulsador grabar y el pin portb.6 se pone a 1 y luego a 0 para indicar que ya grabo esa posicion, luego de grabar varias posiciones le das al boton reproducir y ves como repite los movimientos grabados en los servomotores...cualquier cosa me avisas.

PD: Te dejo un vídeo para que veas como funciona por si acaso, los pot recuerda que son de un joystick por eso hay que estar pendiente de retornar el pot a 50%.

Gracias D@rio, corrijo:

 

Adjuntos

  • BRAZO ROBOT POT FINAL.rar
    39.2 KB · Visitas: 181
Última edición:
Ok el circuito y el codigo completo, cada motor tiene una funcion, hay dos que se mueven juntos, y uno que se mueve por dos pulsadores y todos los demas cada uno tiene un pot...Para grabar una secuencia de movimiento primero posicionas los motores y luego le das al pulsador grabar y el pin portb.6 se pone a 1 y luego a 0 para indicar que ya grabo esa posicion, luego de grabar varias posiciones le das al boton reproducir y ves como repite los movimientos grabados en los servomotores...cualquier cosa me avisas.

PD: Te dejo un vídeo para que veas como funciona por si acaso, los pot recuerda que son de un joystick por eso hay que estar pendiente de retornar el pot a 50%.

http://www.youtube.com/my_videos_upload

amigo rey, te salio mal, el link te lleva a la seccion cargar video. saludosss y muy buen aporte

images


pd:(me robe sin querer un gif de daringa :D )
 
bueno, cambiando un poco de tema y volviendo al tema del wii motion, les cuento que todavia no puedo entablar comunicacion con el bendito ITG3205 y por eso anoche, estuve hasta las 4 y media de la madrugada traduciendo un poco el datasheet del mismo. como soy cabeza dura para entender los documentos escritos, comparto aqui la traduccion que hice valiendome del poco ingles que se y del babel fish para las partes dificiles :D y haber si me ayudan a entender como iniciar correctamente la comunicacion entre pic e ITG :D aca la dejo:

protocolo de comunicaion
condiciones de Start y Stop


La comunicacion en el bus i2c comienza cuando el master pone la condicion de start (S)
en el bus, lo cual es definido como la transicion de alto a bajo de la linea SDA
mientras que la lina SCL esta a nivel alto (ver figura abajo). el bus se considera ocupado hasta
hasta que el master pone una condicion de stop (P) en el bus, esto se define como la transicion
de bajo a alto en la linea SDA mientras SCL esta en alto (ver figura abajo).
ademas el bus sigue estando ocupado si un COMIENZO repetido (sr) se genera en vez de una
condición de DETENCIÓN.

formato de datos y reconocimiento

los bytes de datos son definidos para ser de 8 bits de largo. No hay restricción al número de
bytes transmitidos por transferencia de datos. Cada byte transferido se debe estar seguido
por una señal del reconocimiento (ACK). El reloj para la señal de reconocimiento ACK es
generado por el master, mientras que el receptor genera la señal de reconocimiento actual
tirando abajo SDA y manteniendose este bajo durante la porcion alta deldel impulso de reloj
de reconocimiento.
Si un esclavo está ocupado y no puede transmitir o recibir otro byte de datos hasta que se
haya realizado una cierta otra tarea, puede sostener scl a nivel bajo y asi forzar al master a un estado de espera.
La transferencia de datos normal reasume cuando el esclavo está listo, y relanza la línea del reloj (véase la figura abajo).


comunicaciones

despues de comenzar las comunicaciones con la condicion de start (S), el master envia 7 bits con la direccion de slave
seguida por un octavo bit, el bit de lectura/escritura. el bit de lectura/escritura, indica si el master esta
recibiendo o escribiendo datos en el dispositivo esclavo. entonces el master lanza linea SDA y espera por
la señal de reconocimiento ACK desde el dispositivo esclavo. cada byte transferido debe estar seguido por una
señal de reconocimiento ACK. para el reconocimiento, el dispositivo esclavo tira la linea SDA a nivel bajo y lo mantiene bajo
para el periodo alto de la linea scl. La transmisión de datos es terminada siempre por el master con una condición de Stop (p),
así libera la línea de comunicaciones. Sin embargo, el master puede generar una condición repetida del COMIENZO (sr), y direccionar otro
slave sin generar primero la condicion de stop (p).
la transicion de bajo a alto en la linea SDA mientras SCL es alto, define la condicion de STOP (P)
Todos los cambios de SDA deben ocurrir cuando la linea SCL es baja, con la excepción de las condiciones del comienzo y de parada.

lectura de registros

Para leer los registros internos del dispositivo ITG-3205, el master primero
transmite la condición de Start (s),seguido por la direccion i2c y el bit
de escritura (0). En el 9no el ciclo de reloj (cuando el reloj es alto), el
ITG reconoce la transferencia. El master entonces escribe la dirección del registro
que va a ser leído. Sobre la recepción de la señal ACK del ITG-3205, el master
transmite la señal de start seguida por la direccion de slave y el bit de lectura.
como resultado, el ITG-3205 envía una señal de ACK y los datos. la comunicacion termina
con una señal (NACK) y un bit de stop enviado por el master.la condición NACK se define de manera tal
que la línea de SDA sigue siendo alta en el 9no ciclo de reloj. para leer multiples
bits de datos, el master puede hacer salir una señal de reconocimiento (ACK)
en vez de una señal de no reconocimiento (NACK) En este caso, el ITG-3205 incrementa
automáticamente la dirección del registro y la salida de datos del registro apropiado
Las figuras siguientes muestran las secuencias leídas solas y de dos bytes
saludos y espero puedan ayudarme :) (y)
 
Yo te diria que es exactamente igual a la comunicacion con una memoria 24C o un reloj de tiempo real tipo ds1307, la diferencia es que este tiene unos registros de control y configuración para los ejes x,y,z. Tu has trabajado con memorias i2c y las has logrado leer alguno? Digo ya que no cambia leer en i2c es igual para todos los sistemas colocar la id del dispositivo, colocar la dirección a leer y ya deberías poder leer sin ningún problema tu realizaste la prueba que te sugerí?
 
Yo te diria que es exactamente igual a la comunicacion con una memoria 24C o un reloj de tiempo real tipo ds1307, la diferencia es que este tiene unos registros de control y configuración para los ejes x,y,z. Tu has trabajado con memorias i2c y las has logrado leer alguno? Digo ya que no cambia leer en i2c es igual para todos los sistemas colocar la id del dispositivo, colocar la dirección a leer y ya deberías poder leer sin ningún problema tu realizaste la prueba que te sugerí?
segun lo que yo se, deberia ser asi y no deberia existir ningun problema. y con respecto a la prueba que me sugeriste, no se ¿se puede con el programador jdm? ahora estoy armando un cable para conectar al puerto serie de mi pc y ver si puedo ver los datos en la ventana de comunicacion del microcode :) ahora lo que he visto es que ahi habla del bit de lectura/escritura ¿cual seria este en el comando que estoy enviando? lo que yo hago es esto: I2CREAD sda,scl,%1101000,$1D,[a1] ademas, la direccion i2c tiene 7 bits y no deberia ser de 8 bits? ¿acaso sera este 1 o 0 faltante la causa del problema?
saludosss
 
Última edición:
Atrás
Arriba