Curso de programación de PIC en PICBasic Pro

Hola gente, tanto tiempo. aqui de nuevo molestando con una consulta jeje... :D
resulta que estoy intentando hacer funcionar un modulo DFPLAYER MINI y he logrado comunicar el pic con el modulo. el unico problema que tengo, es que cuando reproduce la pista que le he ordenado reproducir, en este caso la numero 1, reproduce la ultima pista cargada. y si le cambio el numero de pista, por ejemlo, la 2, no funciona. queria saber si alguno de uds. ha trabajado con pbp y este modulo y me puede orientar un poquito. desde ya, se agradece cualquier idea. aqui les dejo el codigo que escribi, saludosss ;)(y)
PD: (ya vi un ejemplo en este mismo thread, pero no lo puedo entender y ademas no puedo usar el hserout en el micro... :oops:, perdon:oops::oops::oops: )

Código:
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off
define loader_used 1
define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = %00000001         'se programa el puerto A como salida' 
trisb = %00000000         'se programa el puerto B como salida'
trisc = %00000000         'se programa el puerto C como salida'
PORTA=%00000001
PORTB=%00000000
PORTC=%00000000

'*****************************************************************
include "modedefs.bas"



LOOP:
IF PORTA.0=0 THEN 
GOSUB TRANSMITE
ENDIF
PAUSE 100
GOTO LOOP

TRANSMITE: 'PLAY TRACK n-1 
IF PORTA.0=0 THEN TRANSMITE
SEROUT portb.7,t9600,[$7E,$FF,$06,$03,$00,$00,$01,$FE,$F7,$EF] ' play track n.1 
PAUSE 10
RETURN

END
 
Yo tuve ese problema, pero no recuerdo si fue con el dfplayer mini o con otro módulo.
El asunto era que reproducía las pistas por fecha de creación y no por nombre de pista.

¿Renombraste los archivos como 001.mp3, 002.mp3, 003.mp3, etc.?
 
Entonces puede ser que sí sea ese el módulo con el que tuve ese problema.
Posteriormente conseguí un módulo WT5001M02, pero lo olvidé y nunca lo usé.

Prueba cambiando la fecha a los archivos con esta aplicación: SetFileDate
Si cambia el orden de reproducción, entonces se debe a lo que comenté anteriormente.
 
Ok, muchas gracias por tu tiempo amigo D@rkbytes, ya lo logre jeje... solo habia que hacer la siguiente modificacion::D
FOROS EXPLICACION.jpg

Y el codigo quedaria asi:

Código:
@ device  pic16F876A, hs_osc, wdt_off, pwrt_on, lvp_off, protect_off, bod_off
define loader_used 1
define osc 20     ; especifica que se va a utilizar uno de 20 Mhz
'*****************************************************************
adcon1 = 7        'se desactivan entradas analógicas'
cmcon  = 7        'se desactivan los comparadores (I/O digitales)'
trisa = %00000001         'se programa el puerto A como salida escepto A0' 
trisb = %00000000         'se programa el puerto B como salida'
trisc = %00000000         'se programa el puerto C como salida'
PORTA=%00000001
PORTB=%00000000
PORTC=%00000000

'*****************************************************************
include "modedefs.bas"

LOOP:
IF PORTA.0=0 THEN 
GOSUB TRANSMITE
ENDIF
PAUSE 100
GOTO LOOP

TRANSMITE: 
SEROUT portb.0,T9600,[$7E,$FF,$06,$03,$00,$00,$01,$EF] ' play track n.1 
PAUSE 1000
RETURN

END
 
Última edición:
Muy bien. (y) Yo siempre enviaba el checksum.
En un rato que tenga tiempo me daré a la tarea de volver a probar ese módulo sin enviarlo.

Por ahora estoy bastante ocupado realizando una interfaz para el ELM327
Y aunque en el mercado ya existen, la que estoy realizando es bastante especial.
 
Muy bueno. hoy ya vienen con comunicacion al celular, pero habemos personas que tenemos un autito viejito a las que nos vendria muy bien algo asi jeje... se le podria aumentar un modulo bluetooth para conectar a una aplicacion del celular jeje...
 
Buenas amigos del foro, tengo una pregunta, estoy realizando un proyecto de una maquina para embobinar, la idea es que en un display se muestren los mensajes de dichos registros de cada evento, con un teclado matricial se ingresa el numero de vueltas y un sensor de efecto hall se encargara de percibir cuando de una vuelta el motor, mi duda es la siguiente, como hago para guardar 3 digitos en una sola variable, ejemplo, yo ingreso que la maquina va a dar 200 vueltas, cuando digito cada valor en el teclado se guardan cada uno en una misma variable, esa parte no la puedo entender.
 

Adjuntos

  • pic16f877a embobinar.rar
    25.7 KB · Visitas: 37
Si para digito utilizaste una variable, cuando validas los sumas en otra.
ti tienes A, B,C,D como tus variables, utilzas las tres primeras y la suma las guardas en D
Si tienes 128 vueltas, al valida Aserá=1, B será =2 y C será = 8
Ahora que haces, A es unidad de centena por lo tanto multiplicas por 100, B es unidad de decena la multiplias por 10 y C como es unida la dejas tal cual.
ahora haces D=A+B+C en el ejemplo tendras en D almacenado 128 que es lo que te interesa para trabajar
luego haces tu bucle y comparas el valor actual con D y termina cuando son iguales , es una forma o vas decrementando D hasta que sea 0
O haciendo D parte de la variable del bucle "if"
 
Buenas amigos del foro, tengo una pregunta, estoy realizando un proyecto de una maquina para embobinar, la idea es que en un display se muestren los mensajes de dichos registros de cada evento, con un teclado matricial se ingresa el numero de vueltas y un sensor de efecto hall se encargara de percibir cuando de una vuelta el motor, mi duda es la siguiente, como hago para guardar 3 digitos en una sola variable, ejemplo, yo ingreso que la maquina va a dar 200 vueltas, cuando digito cada valor en el teclado se guardan cada uno en una misma variable, esa parte no la puedo entender.

Hace un tiempo hice algo, ahi te comparto lo que yo arme... respecto a como lo hice, te cito algunos fragmentos

Código:
; DECLARACION DE VARIABLES     
a var byte
b var byte
DEG_1  var    Word
DEG_2  var    Word
DEG_3  var    Word
DEG_4  var    Word
DIGITO_1 var   Word
DIGITO_2 var   Word
DIGITO_3 var   Word
DIGITO_4 var   Word
Unidad   var   Word          ;unidad
Decena   var   Word          ;decena
Centena  var   Word          ;centena
Umil     var   Word
dig_VUELTA var word   
cuarteto   var byte
AuxW       var word        ;sayi var word
AuxB_a     var byte        ;tus var byte
AuxB_b     var byte        ;tus_b var byte
Aux1 var byte
aux2 var byte
aux3 var byte
aux4 var byte

inicio:
;****
;****
;****
;****
;****
programar:
;****BOTONES UNIDAD DE MIL********
IF Umil_MAS = 0 THEN
WHILE Umil_MAS = 0 : WEND
Umil=Umil + 1
if Umil > 9 then Umil=9
if Umil < 0 then Umil=0
aux1=umil
ENDIF
IF Umil_Menos = 0 THEN
WHILE Umil_Menos = 0 : WEND
Umil=Umil - 1
if Umil > 9 then Umil=9
if Umil < 0 then Umil=0
aux1=umil
ENDIF
;****BOTONES CENTENA********
;similar a U. de mil
aux2=centena
;****BOTONES DECENA********
;similar a U. de mil
aux3=decena
;****BOTONES UNIDAD********
;similar a U. de mil
aux4 = unidad
ENDIF
pause 10

digito_1 = aux1  
digito_2 = aux2  
digito_3 = aux3  
digito_4 = aux4 
dig_vuelta=digito_1+digito_2+digito_3+digito_4 
auxW=(digito_1*1000)+(digito_2*100)+(digito_3*10)+(digito_4*1)
;****
;****
;****
arranque:
If sensor=0 Then 
dig_vuelta=dig_vuelta-1 
auxw = auxw - 1
endif
If auxw =0 Then  GoTo FIN
pause 150
goto inicio

espero que te sea de ayuda en algo... saludos a todos y todas :cool:
 

Adjuntos

  • ETIbobinadora.rar
    90.6 KB · Visitas: 40
hola soy nuevo en este foro aun no se como funciona o como hacer un seguimiento de los participantes



Buenas amigos del foro, tengo una pregunta, estoy realizando un proyecto de una maquina para embobinar, la idea es que en un display se muestren los mensajes de dichos registros de cada evento, con un teclado matricial se ingresa el numero de vueltas y un sensor de efecto hall se encargara de percibir cuando de una vuelta el motor, mi duda es la siguiente, como hago para guardar 3 digitos en una sola variable, ejemplo, yo ingreso que la maquina va a dar 200 vueltas, cuando digito cada valor en el teclado se guardan cada uno en una misma variable, esa parte no la puedo entender.


hola como estas queria saber si pudiste terminar el bobinador??
 
Última edición:
hola soy nuevo en este foro aun no se como funciona o como hacer un seguimiento de los participantes






hola como estas queria saber si pudiste terminar el bobinador??

De hecho si pude, pero lo tengo en pantalla LCD 16X2, pude resolver el problema de la comparacion de los digitos ingresados del teclado con los del numero de vueltas dados por el motor



Hace un tiempo hice algo, ahi te comparto lo que yo arme... respecto a como lo hice, te cito algunos fragmentos

Código:
; DECLARACION DE VARIABLES     
a var byte
b var byte
DEG_1  var    Word
DEG_2  var    Word
DEG_3  var    Word
DEG_4  var    Word
DIGITO_1 var   Word
DIGITO_2 var   Word
DIGITO_3 var   Word
DIGITO_4 var   Word
Unidad   var   Word          ;unidad
Decena   var   Word          ;decena
Centena  var   Word          ;centena
Umil     var   Word
dig_VUELTA var word   
cuarteto   var byte
AuxW       var word        ;sayi var word
AuxB_a     var byte        ;tus var byte
AuxB_b     var byte        ;tus_b var byte
Aux1 var byte
aux2 var byte
aux3 var byte
aux4 var byte

inicio:
;****
;****
;****
;****
;****
programar:
;****BOTONES UNIDAD DE MIL********
IF Umil_MAS = 0 THEN
WHILE Umil_MAS = 0 : WEND
Umil=Umil + 1
if Umil > 9 then Umil=9
if Umil < 0 then Umil=0
aux1=umil
ENDIF
IF Umil_Menos = 0 THEN
WHILE Umil_Menos = 0 : WEND
Umil=Umil - 1
if Umil > 9 then Umil=9
if Umil < 0 then Umil=0
aux1=umil
ENDIF
;****BOTONES CENTENA********
;similar a U. de mil
aux2=centena
;****BOTONES DECENA********
;similar a U. de mil
aux3=decena
;****BOTONES UNIDAD********
;similar a U. de mil
aux4 = unidad
ENDIF
pause 10

digito_1 = aux1  
digito_2 = aux2  
digito_3 = aux3  
digito_4 = aux4 
dig_vuelta=digito_1+digito_2+digito_3+digito_4 
auxW=(digito_1*1000)+(digito_2*100)+(digito_3*10)+(digito_4*1)
;****
;****
;****
arranque:
If sensor=0 Then 
dig_vuelta=dig_vuelta-1 
auxw = auxw - 1
endif
If auxw =0 Then  GoTo FIN
pause 150
goto inicio

espero que te sea de ayuda en algo... saludos a todos y todas :cool:

Muchas gracias con tus ideas me dio una solución, pensé en esto, usar 3 variables, ejemplo SET1, SET2, SET3 cada una corresponde cuando presiono una tecla, como es de 3 digitos por el momento, cuando presiono un numero se guardar el valor en SET1, cuando presiono otro numero avanza a guardar en SET2 y luego avanza y guarda en SET3, bien ahora salta en una subrutina al bucle donde empieza el motor a girar y a la vez a contar las vueltas que va dando el motor.

Ahora la solucion, cree otras 3 variables, VUELTAS1, VUELTAS2, VUELTAS3 empieza sumando de 0 a 9 VUELTAS3 y cuando es mayor de 9 suma por 1 a VUELTAS2 ahora tendriamos algo asi 010 serian 10 vueltas que a dado el motor, luego 3 condicionales IF para ver si SET1 es igual a VUELTAS1, si SET2 es igual a VUELTAS2 y si SET3 es igual a VUELTAS3, todo dio perfecto asi comparando variable por individual si pudo comparar y decifrar el numero de vueltas para detener el programa. :apreton:



ATX dijo:
De hecho si pude, pero lo tengo en pantalla LCD 16X2, pude resolver el problema de la comparacion de los digitos ingresados del teclado con los del numero de vueltas dados por el motor





Muchas gracias con tus ideas me dio una solución, pensé en esto, usar 3 variables, ejemplo SET1, SET2, SET3 cada una corresponde cuando presiono una tecla, como es de 3 digitos por el momento, cuando presiono un numero se guardar el valor en SET1, cuando presiono otro numero avanza a guardar en SET2 y luego avanza y guarda en SET3, bien ahora salta en una subrutina al bucle donde empieza el motor a girar y a la vez a contar las vueltas que va dando el motor.

Ahora la solucion, cree otras 3 variables, VUELTAS1, VUELTAS2, VUELTAS3 empieza sumando de 0 a 9 VUELTAS3 y cuando es mayor de 9 suma por 1 a VUELTAS2 ahora tendriamos algo asi 010 serian 10 vueltas que a dado el motor, luego 3 condicionales IF para ver si SET1 es igual a VUELTAS1, si SET2 es igual a VUELTAS2 y si SET3 es igual a VUELTAS3, todo dio perfecto asi comparando variable por individual si pudo comparar y decifrar el numero de vueltas para detener el programa. :apreton:

Aqui les dejo este proyecto como aporte a la comunidad, se que lo pueden mejorar con mas modificaciones pero el principo del programa puede servir de mucho
 

Adjuntos

  • Embobinador finalizado.rar
    27.4 KB · Visitas: 29
Última edición:
No te hacen falta tres variables para contar, no tiene sentido, porque las vueltas o las contas en una sola variable hasta llegar al total(suma de los digitos) o la haces la variable de un fucler for hasta llegar a 0
 
No te hacen falta tres variables para contar, no tiene sentido, porque las vueltas, o las contás en una sola variable hasta llegar al total (suma de los dígitos) o las haces en la variable de un bucle for hasta llegar a 0
Comprendo lo que dices, pero la idea no estuvo mal, funciona igual y creo que es menos programación.
El tuyo es más complejo y la verdad fue lo último que se me ocurrió. :rolleyes:
 
Última edición por un moderador:
Buenas
¿Ya lo probaste en físico?, tu código tiene problemas de estructura, en la simulación de proteus esta desbordando la pila por la instrucción de retorno(stack overflow return instruccion), eso se debe a que una rutina esta anidada dentro de otra(gosub) y no tiene la instrucción de retorno(return)lo que hace que el micro no sepa en que parte del código retornar desbordando así la pila.

bobinadora (2).jpg
 
Buenas
¿Ya lo probaste en físico?, tu código tiene problemas de estructura, en la simulación de proteus esta desbordando la pila por la instrucción de retorno(stack overflow return instruccion), eso se debe a que una rutina esta anidada dentro de otra(gosub) y no tiene la instrucción de retorno(return)lo que hace que el micro no sepa en que parte del código retornar desbordando así la pila.
Sí, ya lo he probado y no da ningún error, es el proteus.
Al programa le corregí unos errores, después del 099 no podía comparar, le agregué unos condicionales IF y ahora sí puede trabajar.



Aquí la mejora del proyecto:
 

Adjuntos

  • final embobinar.rar
    27.8 KB · Visitas: 35
Última edición por un moderador:
Me alegro que lo hayas echo funcionar, pero respecto de lo que dijiste como yo te lo plantee lleva más código, no es así, precisamente esta planteado para utilizar el menor código posible, al utilizar una sola variable para el total, lleva mucho menos código ya que ese proceso lo tenes multiplicado como tantas veces varibles individuales tienes.
En el que yo hice utilice una memoria flash externa para almacenar esa variable, asi si apago la máquina no debo setear todo de nuevo al encenderla, como me sobraban pines le di la posibilidad de utilzar un display LCD o uno basado en 7 segmentos y algunos extras más que no recuerdo
 
Buenas tardes; Alguien tendra por casualidad en sus archivos, algun ejemplo de comunicacion bidireccional con un NRF 24L01 que pueda compartir aqui? No encontre informacion potable y estoy rebotando contra la pared :LOL:
Saludos
 
Atrás
Arriba