TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: DuguSF en 31 de Enero de 2013, 15:38:15
-
Hola muy buenas, soy nuevo en este foro y me he registrado porque no encuentro ayuda ninguna en toda la red para realizar este proyecto.
La idea consiste en el típico juego de casino de la ruleta francesa, que consta de 36 números. He pensado utilizar 3 pic16f84 interconexionados de tal forma que cada uno controle 12 LED. De este modo cuando el primer pic termine con la secuencia de los LED de la ruleta que le corresponde, es decir, aparezca un 1 lógico
en la última patilla que controla el último LED, active el segundo pic y lo mismo ocurriría con el tercero cuando el segundo termine su trabajo.
Este es mi principal problema, no se como conexionar los pic para que esto suceda. Leyendo libros de texto he llegado a la conclusión de que debería usar la patilla MCLR del pic pero no se muy bien cual es su funcional y mucho menos como utilizarla de la forma óptima.
El segundo problema que se me presenta es el siguiente:
La ruleta empezaría a girar a una velocidad constante mientras mantengamos un pulsador presionado, de manera que al soltarlo la velocidad empiece a descender hasta que finalmente quede detenida la secuencia de luces en un único número. Había pensado hacerlo programando varios ciclos, uno para el momento en que a la entrada del primer pic haya un 1 lógico (pulsador activado) utilizando delays constantes; otro para cuando el nivel lógico de la entrada pase a 0 se siga un ciclo en el que el retardo entre el paso de un led y el siguiente vaya aumentando de forma exponencial hasta que finalmente parase. Pero no se muy bien cómo lograr que estas etapas tengan lugar a la vez en los 3 Pic...
Si alguien me puede echar un cable con ambas dudas muchas gracias de antemano, es escasa la ayuda que tengo para el desarrollo del proyecto y me qudan 3 semanas para entregarlo, al menos si alguien me resuelve estas dudas tendría una base sobre la que empezar a trabajar de forma experimental. Gracias de antemano ;-)
P.D. comentar también que mis conocimientos del tema de microcontroladores son demasiado básicos, la programación en C no se me da bastante bien y no tengo grandes conocimientos electrónicos, simplemente conozco conceptos básicos.
-
yo emplearía un solo micro y circuito 74hc595 mira el datasheet
puedes ampliar salidas facil y economicamente.
-
Hola muy buenas, soy nuevo en este foro y me he registrado porque no encuentro ayuda ninguna en toda la red para realizar este proyecto.
La idea consiste en el típico juego de casino de la ruleta francesa, que consta de 36 números. He pensado utilizar 3 pic16f84 interconexionados de tal forma que cada uno controle 12 LED. De este modo cuando el primer pic termine con la secuencia de los LED de la ruleta que le corresponde, es decir, aparezca un 1 lógico
en la última patilla que controla el último LED, active el segundo pic y lo mismo ocurriría con el tercero cuando el segundo termine su trabajo.
Este es mi principal problema, no se como conexionar los pic para que esto suceda. Leyendo libros de texto he llegado a la conclusión de que debería usar la patilla MCLR del pic pero no se muy bien cual es su funcional y mucho menos como utilizarla de la forma óptima.
No lo hagas así hombre, eso es una barbaridad, y más teniendo en cuenta que solo tienes que tener encendido un led a la vez.
Puedes usar una matriz filas-columnas con el PIC y un ULN2803, o incluso solo con el PIC puedes conectar los LED en contraposición y con solo 7 pines puedes encender hasta 42 led.
Fíjate en este esquema, con 5 pines y un PIC12F se controlan 20 leds, con 6 pines podrías controlar 30 leds, y con 7 pines encenderías 42 leds. Eso si, con este conexionado, solo se puede encender un led a la vez, lo cual en tu caso es perfecto, aunque si se barren con rapidez puede parecer que hay varios encendidos al mismo tiempo, como se puede apreciar en el video de abajo.
(http://img259.imageshack.us/img259/8882/ledscontraposicion.jpg)
En este video puedes ver el circuito en funcionamiento, es una especie de estrella de Navidad:
-
El caso es que tengo que hacerlo utilizando ese integrado, el PIC16F84...
estoy mirando el datasheet del 74HC595, a ver se cómo usarlo.
Gracias
-
El caso es que tengo que hacerlo utilizando ese integrado, el PIC16F84...
Eso es lo de menos, obviamente no has captado la esencia de mi post, en el que te estoy diciendo como controlar decenas de leds con tan solo unos pocos puertos, conectando los led en contraposición. Si prefieres liarla con 3 pic o con varios registros de desplazamiento, no llegarás a ninguna parte, y mucho menos con un nivel de conocimientos tan básico.
-
No lo hagas así hombre, eso es una barbaridad, y más teniendo en cuenta que solo tienes que tener encendido un led a la vez.
Puedes usar una matriz filas-columnas con el PIC y un ULN2803, o incluso solo con el PIC puedes conectar los LED en contraposición y con solo 7 pines puedes encender hasta 42 led.
Fíjate en este esquema, con 5 pines y un PIC12F se controlan 20 leds, con 6 pines podrías controlar 30 leds, y con 7 pines encenderías 42 leds. Eso si, con este conexionado, solo se puede encender un led a la vez, lo cual en tu caso es perfecto, aunque si se barren con rapidez puede parecer que hay varios encendidos al mismo tiempo, como se puede apreciar en el video de abajo.
(http://img259.imageshack.us/img259/8882/ledscontraposicion.jpg)
/quote]
Ese circuito parece bastante ingenioso, pero personalmente creo que no funcionara todo lo bien que se desea. Me explico, tengo entendido que los PIC's no tienen salidas en triestado, por tanto solo pueden estar a 1, o a 0. Partiendo de ahi, supongamos que solo esta a 1 el pin 2 de ese esquema y el resto de salidas esta a 0, tendriamos entonces encendidos al mismo tiempo los led's 1,9,13 y 19, ya que todos ellos tienen el anodo a la linea del pin 2 y su catodo a distintas lineas que estan a 0.
La unica opcion que se me ocurre para evitar lo anterior, seria poner todas las lineas no implicadas en cada momento como entradas.
Por otro lado el esfuerzo en generar un programa que tenga en cuenta todo eso, no compensa el ahorrarse un simple registro de desplazamiento, maxime cuando los hay ya de potencia que no requieren siquiera transistores para controlar la carga.
Saludos.
-
Ese circuito parece bastante ingenioso, pero personalmente creo que no funcionara todo lo bien que se desea.
Para muestra el video, y además lo tengo probado personalmente.
Me explico, tengo entendido que los PIC's no tienen salidas en triestado, por tanto solo pueden estar a 1, o a 0.
Se queda en flotación, si lo defines como entrada. El puerto si que es triestado (nivel alto, bajo y flotación).
Por otro lado el esfuerzo en generar un programa que tenga en cuenta todo eso, no compensa
((:-))
el ahorrarse un simple registro de desplazamiento, maxime cuando los hay ya de potencia que no requieren siquiera transistores para controlar la carga.
Cinco chips para encender 36 led, eso si que no compensa, cuando se puede hacer por software "fácilmente". ;-)
-
Ese circuito parece bastante ingenioso, pero personalmente creo que no funcionara todo lo bien que se desea.
Para muestra el video, y además lo tengo probado personalmente.
Me explico, tengo entendido que los PIC's no tienen salidas en triestado, por tanto solo pueden estar a 1, o a 0.
Se queda en flotación, si lo defines como entrada. El puerto si que es triestado (nivel alto, bajo y flotación).
Por otro lado el esfuerzo en generar un programa que tenga en cuenta todo eso, no compensa
((:-))
el ahorrarse un simple registro de desplazamiento, maxime cuando los hay ya de potencia que no requieren siquiera transistores para controlar la carga.
Cinco chips para encender 36 led, eso si que no compensa, cuando se puede hacer por software "fácilmente". ;-)
Ese circuito parece bastante ingenioso, pero personalmente creo que no funcionara todo lo bien que se desea. Me explico, tengo entendido que los PIC's no tienen salidas en triestado, por tanto solo pueden estar a 1, o a 0. Partiendo de ahi, supongamos que solo esta a 1 el pin 2 de ese esquema y el resto de salidas esta a 0, tendriamos entonces encendidos al mismo tiempo los led's 1,9,13 y 19, ya que todos ellos tienen el anodo a la linea del pin 2 y su catodo a distintas lineas que estan a 0.
La unica opcion que se me ocurre para evitar lo anterior, seria poner todas las lineas no implicadas en cada momento como entradas.
Por otro lado el esfuerzo en generar un programa que tenga en cuenta todo eso, no compensa el ahorrarse un simple registro de desplazamiento, maxime cuando los hay ya de potencia que no requieren siquiera transistores para controlar la carga.
Por favor si citas mis comentarios, deberias ser imparcial. Como puedes ver lo que remarque en negrita, ya lo decia yo en mi comentario, pero tu, muy sutilmente lo eliminaste, para hacerlo tuyo.
Por otro lado yo solo doy mi opinion, que sigue siendo la misma y cada cual decidira si se decanta por tus argumentos, por los mios o simplemente nos ignora a ambos.
Saludos.
-
No os peleis estamos para ayudar, el que debe de elegir es DuguSF, él eligirá un método u otro, o alguno que aqui no hemos citado, aqui estamos para aprender todos y ayudar, supongo.
-
Hola muy buenas, soy nuevo en este foro y me he registrado porque no encuentro ayuda ninguna en toda la red para realizar este proyecto.
La idea consiste en el típico juego de casino de la ruleta francesa, que consta de 36 números. He pensado utilizar 3 pic16f84 interconexionados de tal forma que cada uno controle 12 LED. De este modo cuando el primer pic termine con la secuencia de los LED de la ruleta que le corresponde, es decir, aparezca un 1 lógico
en la última patilla que controla el último LED, active el segundo pic y lo mismo ocurriría con el tercero cuando el segundo termine su trabajo.
Este es mi principal problema, no se como conexionar los pic para que esto suceda. Leyendo libros de texto he llegado a la conclusión de que debería usar la patilla MCLR del pic pero no se muy bien cual es su funcional y mucho menos como utilizarla de la forma óptima.
El segundo problema que se me presenta es el siguiente:
La ruleta empezaría a girar a una velocidad constante mientras mantengamos un pulsador presionado, de manera que al soltarlo la velocidad empiece a descender hasta que finalmente quede detenida la secuencia de luces en un único número. Había pensado hacerlo programando varios ciclos, uno para el momento en que a la entrada del primer pic haya un 1 lógico (pulsador activado) utilizando delays constantes; otro para cuando el nivel lógico de la entrada pase a 0 se siga un ciclo en el que el retardo entre el paso de un led y el siguiente vaya aumentando de forma exponencial hasta que finalmente parase. Pero no se muy bien cómo lograr que estas etapas tengan lugar a la vez en los 3 Pic...
Si alguien me puede echar un camble con ambas dudas muchas gracias de antemano, es escasa la ayuda que tengo para el desarrollo del proyecto y me qudan 3 semanas para entregarlo, al menos si alguien me resuelve estas dudas tendría una base sobre la que empezar a trabajar de forma experimental. Gracias de antemano ;-)
P.D. comentar también que mis conocimientos del tema de microcontroladores son demasiado básicos, la programación en C no se me da bastante bien y no tengo grandes conocimientos electrónicos, simplemente conozco conceptos básicos.
Hola DuguSF.
Podrias hacer una matriz de 6 x 6 (36 leds) y un registro de desplazamiento como te han indicado. De esta forma solo utilizarias 1 solo puerto del pic.
Saludos.
-
Placa de pruebas montada por mi hace un par de años (si no recuerdo mal), con 18 leds en contraposición, un PIC18F26K20 y las correspondientes resistencias limitadoras para los led, sin necesidad de usar ningún chip más. Código fuente para la prueba en ensamblador, en C todavía es más sencillo.
Aunque en la prueba se están usando 9 puertos (RA0-5, RC1-3), con 5 hubiera funcionado exactamente igual. Con 5 puertos puedes controlar hasta 20 LED, con 6 puertos hasta 30 LED, con 7 puertos hasta 42 LED, con 8 puertos hasta 56 LED, etc...
(http://img198.imageshack.us/img198/8408/ledsencontraposicion.jpg)
;***********************************************
;**** PROGRAMA PRINCIPAL ***********************
;***********************************************
bucle
;-- Puerto A -----
;-- LED 1
movlw b'11111010' ; 0=salida, 1= entrada
movwf TRISA
movlw b'00000100'
movwf LATA
rcall Pausa200ms
;-- LED 2
movlw b'00000001'
movwf LATA
rcall Pausa200ms
;-- LED 3
movlw b'11111100' ; 0=salida, 1= entrada
movwf TRISA
movlw b'00000010'
movwf LATA
rcall Pausa200ms
;-- LED 4
movlw b'00000001'
movwf LATA
rcall Pausa200ms
;-- LED 5
movlw b'11111001' ; 0=salida, 1= entrada
movwf TRISA
movlw b'00000010'
movwf LATA
rcall Pausa200ms
;-- LED 6
movlw b'00000100'
movwf LATA
rcall Pausa200ms
;-- LED 7
movlw b'11100111' ; 0=salida, 1= entrada
movwf TRISA
movlw b'00010000'
movwf LATA
rcall Pausa200ms
;-- LED 8
movlw b'00001000'
movwf LATA
rcall Pausa200ms
;-- LED 9
movlw b'11001111' ; 0=salida, 1= entrada
movwf TRISA
movlw b'00100000'
movwf LATA
rcall Pausa200ms
;-- LED 10
movlw b'00010000'
movwf LATA
rcall Pausa200ms
;-- LED 11
movlw b'11010111' ; 0=salida, 1= entrada
movwf TRISA
movlw b'00001000'
movwf LATA
rcall Pausa200ms
;-- LED 12
movlw b'00100000'
movwf LATA
rcall Pausa200ms
movlw b'11111111' ; 0=salida, 1= entrada
movwf TRISA
;-- Puerto C -----
;-- LED 13
movlw b'11110101' ; 0=salida, 1= entrada
movwf TRISC
movlw b'00001000'
movwf LATC
rcall Pausa200ms
;-- LED 14
movlw b'00000010'
movwf LATC
rcall Pausa200ms
;-- LED 15
movlw b'11111001' ; 0=salida, 1= entrada
movwf TRISC
movlw b'00000100'
movwf LATC
rcall Pausa200ms
;-- LED 16
movlw b'00000010'
movwf LATC
rcall Pausa200ms
;-- LED 17
movlw b'11110011' ; 0=salida, 1= entrada
movwf TRISC
movlw b'00001000'
movwf LATC
rcall Pausa200ms
;-- LED 18
movlw b'00000100'
movwf LATC
rcall Pausa200ms
movlw b'11111111' ; 0=salida, 1= entrada
movwf TRISC
bra bucle
;----------------------------
;---- Subrutina pausa ------
;----------------------------
Pausa200ms
movlw 15h
movwf COUNT1
movff COUNT1, COUNT2
Loop1
decfsz COUNT1, F
bra Loop1
setf COUNT1
decfsz COUNT2, F
bra Loop1
return
end
-
Este sistema sí que funciona. No hay más que buscar en google por CHARLIEPLEXING.
Lo estoy utilizando para un vu-metro y manejando los tiempos de encendido y apagado se consiguen hasta diferentes niveles de luminosidad para los leds.
http://www.electro-tech-online.com/microcontrollers/40253-boostc-charlieplexed-pwm-32-a.html
La idea la saqué de este proyecto. De esta forma podrías hacer efectos luminosos con la ruleta.
-
Muchas gracias por todas vuestras sugerencias. La idea que me convence es la de utilizar el registro de entrada serie salida paralelo, aunque no se muy bien como hacerlo funcionar creo que la idea que tengo es la correcta, si me equivoco y no funcionaría como yo digo por favor, corríjanme:
La cosa sería conectar cada salida de uno de los puertos del PIC a la entrada DS del registro, conectando también la salida de reloj del PIC a la entrada de reloj del registro. De esta forma podría controlar los tiempos que dura cada led encendido por medio de programación, y utilizando varios registros hasta obtener 36 salidas en total. El problema surge cuando quiera hacer que al soltar el pulsador la ruleta descienda de velocidad de "giro", ya que pienso yo que los led irían descendiendo de velocidad de 8 en 8, (programándolo con delays diferentes para cada salida del pic...) no se como solucionar este problema. He de hacerlo con el PIC 16F84 si o si, está así especificado. Si me podéis ayudar a comprender como utilizar el registro me sería de muchísima ayuda ;)
De nuevo muchas gracias a todos por vuestro interés, no pensaba que fuera a tener tan buena acojida en un foro de esta temática :D
-
Hola, seguramente, el programa funcionará dentro de un loop, que va activando las salidas... alli mismo, colocas un par de contadores, que se incrementaran con cada vuelta... y esos contadores, serán registros que se cargarán en los registros del delay o demora de cada salida :mrgreen:
-
Hola, seguramente, el programa funcionará dentro de un loop, que va activando las salidas... alli mismo, colocas un par de contadores, que se incrementaran con cada vuelta... y esos contadores, serán registros que se cargarán en los registros del delay o demora de cada salida :mrgreen:
Eso es lo que tenía pensado :) sin embargo sigo teniendo la misma duda, dado que cada salida del pic controla en realidad 8 LEDs, la velocidad iría variando en secciones de 8, o me equivoco? si es así, ¿cómo puedo solucionarlo? (Todo ello utilizando el PIC 16f84 y el 74hc595 que me han sugerido por arriba :) )
-
la velocidad iría variando en secciones de 8, o me equivoco?
:mrgreen: lo que yo digo, es una suposición,... porque al no ver tu programa... lo pienso como si yo lo escribo ;-)
Yo lo plantearia, manejando tablas (para el encendido de cada salida) ... por lo que la velocidad, se decrementaria para cada salida en forma uniforme... y no de a 8....
-
La cosa sería conectar cada salida de uno de los puertos del PIC a la entrada DS del registro, conectando también la salida de reloj del PIC a la entrada de reloj del registro. De esta forma podría controlar los tiempos que dura cada led encendido por medio de programación, y utilizando varios registros hasta obtener 36 salidas en total. El problema surge cuando quiera hacer que al soltar el pulsador la ruleta descienda de velocidad de "giro", ya que pienso yo que los led irían descendiendo de velocidad de 8 en 8, (programándolo con delays diferentes para cada salida del pic...) no se como solucionar este problema. He de hacerlo con el PIC 16F84 si o si, está así especificado. Si me podéis ayudar a comprender como utilizar el registro me sería de muchísima ayuda ;)
Hola DuguSF.
¿Que te parece si acompañas lo que estas explicando con algun grafico?.
Estaria bueno que probaras hacer algun programita que haga correr los led de un puerto, asi vas tomando practica.
Si tenes algo ya iniciado seria bueno que lo subas.
Saludos.
-
Este fin de semana si ando con tirmpo subo la partedel programa que tengo pensado, luego necesito ayuda para las temporizaciones del pic pero eso ya no es problema xq lo hablaré con un profesor de lógica digital, aunque toda ayuda es poca para la escasa idea que tengo.
-
El programa que he pensado (aún no lo tengo escrito) consistiría en lo siguiente:
Usando el puerto B del pic para activar los leds controlados por el registro, haría un ciclo que dijera
PortA(entrada)
mientras RA0 =1 se ejecutaría un ciclo a una frecuencia usando el TMR0, ciclo en el que portb haría lo siguiente:
PORTB=0b00000001
PORTB=0b00000000 y así usando diferentes delays o funciones de TMR0, mantendría en ese estado el puerto B hasta que los primeros 8 leds terminen de encenderse (todo sincronizado con temporizaciones, interrupciones y esas cosas que aún no tengo muy claras)
luego PORTB pasaría a 0b00000010 y seguidamente a 0b00000000, pasando a 0b00000100 cuando el segundo registro que conectaré a la segunda RB1 termine de controlar los 8 LED que le corresponden. así hasta encender los 36 LED de la ruleta sincronizando pic y registro mediante el reloj. Esto es lo que no se como hacer, sincronizar todo para que la ruleta no funcione a saltos de 8 leds... sino que vayan seguidos. Otra duda que tengo es lo que ocurriría al desear que se parara la ruleta descendiendo de velocidad, pues me temo que siempre se detendría en uno de los últimos leds de cada registro, eliminando la posibilidad de que caiga por ejemplo en la 2ª salida de un registro...
necesito saber que les parece la idea y que soluciones me podéis dar a los problemas que seguro me surgirán,..
-
Hola, opino que la idea de planeta9999 encaja perfectamente en el funcionamiento que describes en tu ultimo post, haz la prueba nada pierdes.
saludos.
-
Hola, opino que la idea de planeta9999 encaja perfectamente en el funcionamiento que describes en tu ultimo post, haz la prueba nada pierdes.
saludos.
La idea de planeta9999 está muy bien, es sencilla y tal. Pero repito que es IMPRESCINDIBLE utilizar el PIC 16F84.
-
El caso es que tengo que hacerlo utilizando ese integrado, el PIC16F84...
Eso es lo de menos, obviamente no has captado la esencia de mi post, en el que te estoy diciendo como controlar decenas de leds con tan solo unos pocos puertos, conectando los led en contraposición. Si prefieres liarla con 3 pic o con varios registros de desplazamiento, no llegarás a ninguna parte, y mucho menos con un nivel de conocimientos tan básico.
como encuentro la forma de posicionar los LED para que actúe de la forma que yo deseo? y de esta forma podría reducir la velocidad se giro de forma que la velocidad disminuya de forma constante?¿
-
La idea de planeta9999 está muy bien, es sencilla y tal. Pero repito que es IMPRESCINDIBLE utilizar el PIC 16F84.
Con el puerto B tienes para 56 leds, mas que sobrado.
como encuentro la forma de posicionar los LED para que actúe de la forma que yo deseo? y de esta forma podría reducir la velocidad se giro de forma que la velocidad disminuya de forma constante?¿
Fijate en las combinaciones necesarias para lograr el encendido de cada led, el codigo que puso planeta999 esta muy claro, seteas TRIS y las salidas del puerto, el truco esta en las combinaciones.
Para lo de la velocidad es el mismo tema tanto de la manera de planeta como la que te mencionaron de los latchs. Tienes que variar los tiempos segun tus necesidades.
Prueba con 9 leds y veras.
Por lo que veo no tienes mucha experiencia en el uso de los pics, por lo que te recomiendo superes etapas, primero prueba los leds, que te funcionen los que necesitas, y luego pasas a lo de los tiempos, veras que te vas a divertir con este proyecto.
led1 ON
pausa
led2 ON
pausa
led3 ON
pausa
.
.
.
.
led final ON
pausa
led1 ON
pausa
el valor de pausa lo puedes modificar para que se muestre el efecto de variar la velocidad de los leds
saludos!! :)
-
La idea de planeta9999 está muy bien, es sencilla y tal. Pero repito que es IMPRESCINDIBLE utilizar el PIC 16F84.
Con el puerto B tienes para 56 leds, mas que sobrado.
como encuentro la forma de posicionar los LED para que actúe de la forma que yo deseo? y de esta forma podría reducir la velocidatd se giro de forma que la velocidad disminuya de forma constante?¿
Fijate en las combinaciones necesarias para lograr el encendido de cada led, el codigo que puso planeta999 esta muy claro, seteas TRIS y las salidas del puerto, el truco esta en las combinaciones.
Para lo de la velocidad es el mismo tema tanto de la manera de planeta como la que te mencionaron de los latchs. Tienes que variar los tiempos segun tus necesidades.
Prueba con 9 leds y veras.
Por lo que veo no tienes mucha experiencia en el uso de los pics, por lo que te recomiendo superes etapas, primero prueba los leds, que te funcionen los que necesitas, y luego pasas a lo de los tiempos, veras que te vas a divertir con este proyecto.
led1 ON
pausa
led2 ON
pausa
led3 ON
pausa
.
.
.
.
led final ON
pausa
led1 ON
pausa
el valor de pausa lo puedes modificar para que se muestre el efecto de variar la velocidad de los leds
saludos!! :)
Muchas gracias por vuestra ayuda, creo que finalmente lo haré utilizando la idea del preograma que postee anteriormente. Me resulta más sencillo y fácil de comprender. Había pensado utilizar una patilla del pic como salida de reloj que controle el registro(programandolo, ya que no se si el pic tie e la función de reloj externo en alguna de sus patillas), sincronizarlo con las temporizaciones del tmr0. Y el resto sería simplemente ir variando los delays e ir probando. Creen que es buena idea? Se que las habrá más simples pero esta es la forma que más rápido he entendido. Saludos ;-)
-
ok bueno si lo haras con los registros esta bien, finalmente funcionara, pero con mas hardware.
No es necesario pulso externo, el mismo pic te dara el clock necesario para los registros.
Variando el valor del desborde del timer0 lograras el efecto que deseeas, las pausas tendran valores diferentes debes buscar los valores que se adecuen a lo que deseas, si el tmr en si no te da mucho tiempo puedes usar contadores para que logres la pausa correcta.
Dale que ya debes hacer algo de codigo.
saludos
-
bueno pues muchísimas gracias a todos, ya he pedido los componentes, en cuanto me lleguen y saque tiempo me pongo a hacer pruebas. Os mantendré informados ;)
-
Esto es lo que llevo hecho hasta ahora, y tras simularlo he comprobado que funciona y se sale del ciclo en cualquier momento en el que RA0 pase a nivel bajo.
unsigned short i;
unsigned short u;
unsigned long saca(unsigned long num)
{
switch (num)
{
case 1: return 0b00000001;
case 2: return 0;
case 3: return 0;
case 4: return 0;
case 5: return 0;
case 6: return 0;
case 7: return 0;
case 8: return 0;
case 9: return 0b00000010;
case 10: return 0;
case 11: return 0;
case 12: return 0;
case 13: return 0;
case 14: return 0;
case 15: return 0;
case 16: return 0;
case 17: return 0b00000100;
case 18: return 0;
case 19: return 0;
case 20: return 0;
case 21: return 0;
case 22: return 0;
case 23: return 0;
case 24: return 0;
case 25: return 0b00001000;
case 26: return 0;
case 27: return 0;
case 28: return 0;
case 29: return 0;
case 30: return 0;
case 31: return 0;
case 32: return 0;
case 33: return 0b00010000;
case 34: return 0;
case 35: return 0;
case 36: return 0;
}
}
void main ()
{
PORTA=0;
PORTB=0;
TRISA=1;
TRISB=0;
do
{
if (PORTA.F0==1)
{
for (i=1;i<37;i++)
{
if (PORTA.F0==1)
{
PORTB=saca(i);
delay_ms(200);
}
}
}
else
{
for (i=1;i<37;i++)
{
if (PORTA.F0==1)
{
PORTB=saca(i);
delay_ms(200);
}
}
break;
} while (1);
}
Ahora haré cuando tenga tiempo otro ciclo para cuando RA0 sea igual a 0. El ciclo trataría de ir aumentando el delay entre cada salida del puerto b. En este mismo momento en el que RA0 pase a nivel bajo, tendré que configurar una salida del puerto b para que funcione como reloj que va aumentando poco a poco su ciclo de trabajo, de forma que controle de forma sincronizada los registros.
Me surge el siguiente problema (por comentar alguno xD)
No sé como hacer para que cuando cambia de 1 a 0 RA0 empiece a aumentar el valor de los delays desde el valor del puerto b que había antes de cambiar de estado RA0, no se si se entiende... alguna sugerencia?
que os parece lo que tengo hecho hasta ahora? se que se podría hacer mas simplificado pero de esta forma me resulta mas claro.
-
Necesito ayuda urgente con el TMR0
este sería el programa principal
do
{
for (i=1;i<37;i++)
{
if (PORTA.F0==1)
{
PORTB=saca(i);
delay_ms(200);
} else for (j=1;j<6;j++)
{
if (PORTA.F0==0)
{
PORTB=saca(i);
TMR0=conta(j);
}
}
}
} while (1);
TR0=conta(j) se explica de la siguiente forma
unsigned short conta(int pausa)
{
switch(pausa)
{
case 1: return 300;
case 2: return 500;
case 3: return 700;
case 4: return 900;
case 5: return 1100;
}
}
el problema es que no me carga esos valores en el tmr0, lo he estado probando y no aumenta el tiempo en esos valores, solo aumenta en microsegundos (todo esto cuando PORTA.F0=0)
necesito ayuda por favor, no se si hay que inicializar el tmr0, o tengo que utilizar el option_reg o como hacerlo :S tengo que entregarlo el viernes, me urge bastante. Gracias de antemano a quien pueda ayudarme
-
Os dejo aquí todo el programa
unsigned int i;
unsigned int j;
unsigned short conta(int pausa)
{
switch(pausa)
{
case 1: return 300;
case 2: return 500;
case 3: return 700;
case 4: return 900;
case 5: return 1100;
}
}
unsigned long saca(unsigned long num)
{
switch (num)
{
case 1: return 0b00000001;
case 2: return 0;
case 3: return 0;
case 4: return 0;
case 5: return 0;
case 6: return 0;
case 7: return 0;
case 8: return 0;
case 9: return 0b00000010;
case 10: return 0;
case 11: return 0;
case 12: return 0;
case 13: return 0;
case 14: return 0;
case 15: return 0;
case 16: return 0;
case 17: return 0b00000100;
case 18: return 0;
case 19: return 0;
case 20: return 0;
case 21: return 0;
case 22: return 0;
case 23: return 0;
case 24: return 0;
case 25: return 0b00001000;
case 26: return 0;
case 27: return 0;
case 28: return 0;
case 29: return 0;
case 30: return 0;
case 31: return 0;
case 32: return 0;
case 33: return 0b00010000;
case 34: return 0;
case 35: return 0;
case 36: return 0;
}
}
void main ()
{
PORTA=0;
PORTB=0;
TRISA=1;
TRISB=0;
do
{
for (i=1;i<37;i++)
{
if (PORTA.F0==1)
{
PORTB=saca(i);
delay_ms(200);
} else for (j=1;j<6;j++)
{
if (PORTA.F0==0)
{
PORTB=saca(i);
TMR0=conta(j);
}
}
}
} while (1);
}
El ciclo "saca" no es definitivo, ya que únicamente necesito un pulso en la primera patilla del pic, el resto lo controlo colocando los registros de desplazamiento en cascada.
-
Buen dia amigos, queria retomar este proyecto , me gustaria hacer una ruleta con led pero adicionarle dos cosas la imitacion del sonido y el numero aleatorio en el cual se para .
Saludos y feliz dia del trabajador para todos !!