Autor Tema: Una ayudita! por favor  (Leído 3723 veces)

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

Desconectado Helena

  • PIC10
  • *
  • Mensajes: 30
Una ayudita! por favor
« en: 03 de Julio de 2006, 19:46:42 »
Hola,

Este codigo funciona muy bien, quiero hacer lo mismo pero con 4 pulsadores desde rb0 hasta rb3 y 4 salidas desde rb4 hasta rb7 como harìa para hacerlo funcionar?.

Cuando se oprime rb7 se senciende el led en rb4 y cuando se vuelve a oprimir rb7 se apaga rb4, es como un on_off.

Muchas gracias

Besos

Helena :g)


Código: [Seleccionar]
#include <16F84A.h>
#use delay(clock=4000000)
#use fast_io(B)
#fuses HS,NOWDT,NOPUT

//globales
int ap=1;

//Rutinas

void enciende(){
do{  // Hasta que pulsemos RB7
delay_ms(100); //rebote
output_low(PIN_B4);    //zero en la salida, led encendido
}while(input(PIN_B7));
ap=0;  // la proxima pulsacion se va a apaga
}

void apaga(){
do{  // Hasta que pulsemos RB7
delay_ms(100); // rebote
output_high(PIN_B4);    //Uno en la salida, led apagado
}while(input(PIN_B7));
ap=1;  //la proxima pulsacion se va a enciende
}

//Principal, deveria encender y apagar un led en RB4, con un pulsador en RB7
//Elpulsador cuando entra envia +5V al pin 13 (RB7)
//el LED esta con el anodo al + y el catodo al pin 10 (RB4) del 16F84A

void main(){
set_tris_B(0b10001111);    // RB0,1,2,3 y 7 entradas RB4,5 y 6 salidas
output_high(PIN_B4);       // zero la salida, led apagado

while(true){
if(input(PIN_B7)){
if(ap==1)
enciende();
else
apaga();
}
}
}
« Última modificación: 03 de Julio de 2006, 19:49:10 por Helena »

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Una ayudita! por favor
« Respuesta #1 en: 04 de Julio de 2006, 13:37:19 »
La verdad que es bastante facilito lo que pides, veo que no lo has intentado :shock: jeje pero bueno que no valga de precedente, aqui un codigo que hace lo que pides con su respectiva simulacion en proteus:
Código: C
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. //                                                      VsZeNeR'06             
  3. //                                                 04/Julio/06
  4. //
  5. //      Programa:       Boton & led's
  6. //      Version:        0.0
  7. //
  8. //      Dispositivo: PIC 16F84A                 Compilador:      CCS vs3.249
  9. //      Entorno IDE: MPLAB IDE v7.40            Simulador:       Proteus 6.7sp3
  10. //
  11. //      Notas: Este programa se encarga de ver leer la parte baja del puertoB donde estan conectados
  12. //                 unos pulsadores, al pulsar alguno de ellos cambia el estado del led correspondiente:
  13. //                              · Boton 1 PIN_B0 -> led PIN_B4
  14. //                              · Boton 2 PIN_B1 -> led PIN_B5
  15. //                              · Boton 3 PIN_B2 -> led PIN_B6
  16. //                              · Boton 4 PIN_B3 -> led PIN_B7
  17. //
  18. //                 Conexiones:          B0 -> Boton 1                
  19. //                                                      B1 -> Boton 2
  20. //                                                      B2 -> Boton 3
  21. //                                                      B3 -> Boton 4
  22. //                                                      B4 -> Led                              
  23. //                                                      B5 -> Led                
  24. //                                                      B6 -> Led          
  25. //                                                      B7 -> Led      
  26. //////////////////////////////////////////////////////////////////////////////////
  27.  
  28. #include <16f84a.h>                                     //pic a utilizar                       
  29. #fuses XT,NOWDT,NOPROTECT,NOPUT         //ordenes para el programador
  30. #use delay (clock=4000000)                      //Fosc=4Mhz
  31. #use fast_io(b)                                         //definimos forma rapida...
  32. #use fast_io(a)                                         //...de configurar los puertos a y b
  33. #bit RB4=06.4                                           //definicion de...
  34. #bit RB5=06.5
  35. #bit RB6=06.6
  36. #bit RB7=06.7                                           //...pines de la parte alta del puerto b
  37.  
  38. ///PROGRAMA
  39. void main(void)
  40. {
  41.         set_tris_b (0b00001111);                //portb: <0:3>entrada y <4:7>salida
  42.  
  43.         output_b(0x00);                                 //todo los led's off
  44.  
  45.         do{                                     //bucle...
  46.  
  47.                 if(!input(PIN_B0)){                             //¿Se ha pulsado boton 1?             
  48.                         while(!input(PIN_B0));          //SI -> Antirebote
  49.                         RB4=!RB4;                                       //Cambia el estado del led
  50.                 }
  51.                 if(!input(PIN_B1)){                             //¿Se ha pulsado el boton 2?
  52.                         while(!input(PIN_B1));          //SI -> Antirebote
  53.                         RB5=!RB5;                                       //Cambia el estado del led
  54.                 }
  55.                 if(!input(PIN_B2)){                             //¿Se ha pulsado el boton 3?
  56.                         while(!input(PIN_B2));          //SI -> Antirebote
  57.                         RB6=!RB6;                                       //Cambia el estado del led
  58.                 }
  59.                 if(!input(PIN_B3)){                             //¿Se ha pulsado el boton 4?
  60.                         while(!input(PIN_B3));          //SI -> Antirebote
  61.                         RB7=!RB7;                                       //Cambia el estado del led
  62.                 }
  63.                 }while(TRUE);   //...infinito
  64. }

Recomendarte que yo los pulsadores y los led's los pondria al reves, es decir, los pulsadores en la parte alta del puerto b y los led's en la parte baja del puerto b, ¿por que? simplemente tal como esta el programa, siempre el micro esta comprobando si se ha pulsado algun boton(y en caso de haberse pulsado pues procede a encender/apagar el correspondiente led), la verdad que tenemos al micro trabajando innecesariamente 'a toda pastilla', te recomiendo entonces que cambies los pulsadores(los pongas en la parte alta del puerto b <4:7>) y los led's en la parte baja del puerto b <0:3>, asi programaremos podremos aprovechar la interrupcion del puerto b <4:7> y el microcontrolador simplemente esperaria a que se produjera una interrupcion probocada por algunos de dichos pines(al pulsarse cualquier boton) y encenderia/apagaria el led correspondiente....te lo dejo como ejercicio :mrgreen:

PD: Si no te sale me lo dices y te lo posteo :-)


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Una ayudita! por favor
« Respuesta #2 en: 04 de Julio de 2006, 14:10:28 »
Bueno, al final lo voy a postear que ando de formateo y haber si lo pierdo!jeje, aqui esta el programa conectado como te dije en el anterior post, los pulsadores en la parte alta del puerto b y los led's en la parte baja del mismo puerto, al pulsar algun boton, producira una interrupcion e iluminara el led correspondiente:
Código: C
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. //                                                      VsZeNeR'06             
  3. //                                                 04/Julio/06
  4. //
  5. //      Programa:       Boton & led's
  6. //      Version:        1.0
  7. //
  8. //      Dispositivo: PIC 16F84A                 Compilador:      CCS vs3.249
  9. //      Entorno IDE: MPLAB IDE v7.40            Simulador:       Proteus 6.7sp3
  10. //
  11. //      Notas: Este programa se encarga de cambiar los estados de los led's correspondientes a
  12. //                 unos pulsadores, al pulsar alguno de ellos cambia el estado del led correspondiente
  13. //                 produciendo una interrupcion:
  14. //                              · Boton 1 PIN_B4 -> led PIN_B0
  15. //                              · Boton 2 PIN_B5 -> led PIN_B1
  16. //                              · Boton 3 PIN_B6 -> led PIN_B2
  17. //                              · Boton 4 PIN_B7 -> led PIN_B3
  18. //
  19. //                 Conexiones:          B4 -> Boton 1                
  20. //                                                      B5 -> Boton 2
  21. //                                                      B6 -> Boton 3
  22. //                                                      B7 -> Boton 4
  23. //                                                      B0 -> Led                              
  24. //                                                      B1 -> Led                
  25. //                                                      B2 -> Led          
  26. //                                                      B3 -> Led      
  27. //////////////////////////////////////////////////////////////////////////////////
  28.  
  29. #include <16f84a.h>                                     //pic a utilizar                       
  30. #fuses XT,NOWDT,NOPROTECT,NOPUT         //ordenes para el programador
  31. #use delay (clock=4000000)                      //Fosc=4Mhz
  32. #use fast_io(b)                                         //definimos forma rapida...
  33. #use fast_io(a)                                         //...de configurar los puertos a y b
  34. #byte port_b=0x06                                       //declaracion del puerto b
  35. #bit RB0=06.0                                           //definicion de...
  36. #bit RB1=06.1
  37. #bit RB2=06.2
  38. #bit RB3=06.3                                           //...pines de la parte alta del puerto b
  39.  
  40. ///DECLARACION DE VARIABLES GLOBALES
  41. int last_b;                     //variable de almacenar el estado del portb
  42.  
  43. ///LLAMADA FUNCION INTERRUPCION
  44. #int_rb
  45. void rb_isr(){
  46.         byte changes;                                   //variable que almacena que pin a realizado la interrupcion
  47.  
  48.     changes = last_b ^ port_b;          //changes<-pin que genera la interrupcion
  49.  
  50.     last_b = port_b;                            //last_b=como estaba el portb antes de interrupcion
  51.  
  52.     if (bit_test(changes,4 )&& !bit_test(last_b,4))             //¿PIN_B4 genera interrupcion -> boton1?
  53.                 RB0=!RB0;                                                                               //SI -> Actuo sobre led
  54.  
  55.     if (bit_test(changes,5)&& !bit_test (last_b,5))             //¿PIN_B5 genera interrupcion -> boton2?
  56.                 RB1=!RB1;                                                                               //SI -> Actuo sobre led
  57.  
  58.         if (bit_test(changes,6)&& !bit_test (last_b,6))         //¿PIN_B6 genera interrupcion -> boton3?
  59.                 RB2=!RB2;                                                                               //SI -> Actuo sobre led
  60.  
  61.         if (bit_test(changes,7)&& !bit_test (last_b,7))         //¿PIN_B7 genera interrupcion -> boton4?
  62.                 RB3=!RB3;                                                                               //SI -> Actuo sobre led
  63. }
  64.  
  65. ///PROGRAMA
  66. void main(void)
  67. {      
  68.         set_tris_b (0b11110000);                //portb: <0:3>salida y <4:7>entrada
  69.        
  70.         enable_interrupts(INT_RB);              //activamos la interrupcion del puertob <4:7>
  71.         enable_interrupts(GLOBAL);              //damos permiso a las interrupciones
  72.  
  73.         output_b(0x00);                                 //todo los led's off
  74.  
  75.         for(;;);                                                //esperamos a la interrupcion
  76.  
  77. }

Como veras, el micro en este programa no esta continuamente leyendo los pines donde estan conectados los pulsadores, el micro en este programa no hace nada, esta simplemente esperando a que se produzca la interrupcion por algunos de los pulsadores...


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Helena

  • PIC10
  • *
  • Mensajes: 30
Re: Una ayudita! por favor
« Respuesta #3 en: 04 de Julio de 2006, 20:36:33 »
Hola vszener,

Fantàstico, eso era lo que estaba buscando lo intente de varias formas pero como hasta ahora estoy dando mis primeros pinitos se me dificulto un poco, a proposito me puedes recomedar algun tutorial o manual ya qie quiero aprender bien este lenguaje y porque no ayudar a otros como tu lo haces.

De nuevo gracias y espero tus recomendaciones.

Besos

Helena :g)

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Una ayudita! por favor
« Respuesta #4 en: 05 de Julio de 2006, 08:58:03 »
Buenas!!! la verdad que manuales en CCS no he encontrado ninguno...yo te cuento como empece yo en CCS jeje, ya sabia programar en C, asi que las sentencias de control y los bucles me eran familiares ya, y con el manual del compilador CCS, el proteus y la protoboard pues ir haciendo pruebas!!! lo que te puedo recomendar para que empieces a programar en c con CCS en menos de una semana y vayas cogiendo nivel, es lo que ya sabes(por orden de fecha de publicacion):

1. Microcursillo en C
2. Ejemplitos en C para 16F648A
3. Ejemplitos 16F876A: Indice de contenidos.

Si te haces todos los programas de los enlaces que te he puesto, sabras programar y manejar el CCS

Si estas empezando en C y no tienes claro los bucles ni las entencias de control, pasate por los manuales de la web del Rincon del C y centrate en estudiar como se declaran las sentencias if-else, bucle for, bucle while, bucle do-while, sentencia switch....

Y ten siempre en manual del compilador CCS a mano!!!


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte


 

anything