Autor Tema: Sonidos y leds en 16F84A  (Leído 9598 veces)

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

Desconectado LadyMandarine

  • PIC10
  • *
  • Mensajes: 21
Sonidos y leds en 16F84A
« en: 26 de Abril de 2007, 04:47:52 »

Hola me gustaría saber si alguien me puede proporcionar código para hacer lo siguiente:

Tengo un pic16F84A pintado en Proteus con 5 interruptores en el puerto b y 4 leds y un speaker en el puerto a. Por el momento quisiera saber como puedo hacer en c para q cada vez q yo pulso un interruptor, se ilumine un led en ocncreto y suene un sonido por le speaker. Si pulso otro interruptor se ilumine otro led y suene otro sonido, etc...

Muchísimas gracias de antemano. Esto me ayudaría mucho a entender el proceso y poder avanzar con mi proyecto porque llevo mucho tiempo estancada y no emcuentro a nadie que me pueda ayudar. :(

Desconectado josepunki

  • PIC10
  • *
  • Mensajes: 43
Re: Sonidos y leds en 16F84A
« Respuesta #1 en: 26 de Abril de 2007, 07:26:23 »
si tu programa solo consta de los leds, pulsadores y speaker deberias leer continuamente el valor de los pulsadores, si ademas hace otras cosas emplea las interrupciones para no perder ninguna pulsacion en caso de un largo programa.

despues de detectar que han apretado determinado pulsador enciende el LED correspondiente mediante la activacion de la linea a la que lo conectes (seguramente necesitaras usar un driver para dar la corriente que pida el LED) y para generar el sonido solo tienes que hacer que el speaker suene con una frecuencia determinada (por ejemplo para hacer un LA 440Hz: encender- esperar 2.27ms- apagar - esperar 2.27ms )

espero que te sirva para algo
un saludo

Desconectado LadyMandarine

  • PIC10
  • *
  • Mensajes: 21
Re: Sonidos y leds en 16F84A
« Respuesta #2 en: 26 de Abril de 2007, 12:01:11 »
Muchísimas gracias, me ha servido para entender la idea pero soy muy nueva en esto y no se empezar, necesitaría que alguien me ayudase con el código porq la verdad es q no tengo tiempo para aprender mas despacio, si supiera hacer el código para encender un led y hacer un sonido a la vez al pulsar un interruptor creo q sería capaz de entender y pensar por mi misma el resto de lo que tengo q hacer. Gracias mil.Ojalá alguien sepa hacerlo y me pueda ayudar. :(

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Sonidos y leds en 16F84A
« Respuesta #3 en: 26 de Abril de 2007, 12:06:53 »
Podes usar la sentencia switch, de una forma como la que expongo


 leeropcionelegida();
 switch (opcionelegida):
                1 : // Ejecutar rutina Opcion 1
                     break;
                2 : // Ejecutar rutina opcion 2
                    break
              default : break;
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado josepunki

  • PIC10
  • *
  • Mensajes: 43
Re: Sonidos y leds en 16F84A
« Respuesta #4 en: 26 de Abril de 2007, 14:37:16 »
yo es que lo de programar en C no lo conozco. estoy usando ensamblador y se que para hacer esas cosas es facilillo. 

seguro que algun programador de C te puede ayudar.

un saludo y suerte

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Sonidos y leds en 16F84A
« Respuesta #5 en: 26 de Abril de 2007, 16:52:25 »
Ola, yo tuve hace poco esa misma duda y relacionado a todo eso yaq tambien soy nuevo en esto. Pero bien he avanzado y pude lograr justo eso q quieres, solo q todo esta echo para el PIC 18F452, quiza puedas modificarlo x)

Código: [Seleccionar]
/*
Proyecto 1
Descripcion: Prender un led y hacer sonar el buzzer cuando se aprieta el swich B0.
Por: Jeremy LF.
*/

#include <18f452.h>              //El pic a usar.
#fuses XT,NOWDT,NOPROTECT,PUT   //Configuracion de los fusibles del integrado.
#use delay(clock=4000000)      //Megahers del cristal a usar.
#use fast_io(b)               //Entrada y Salida (io) Rapidas (fast) para el puerto B.
#int_rtcc
void handle_rtcc_int()
   {
   //Output_toggle: Cambiar al estado contrario al q esta (1 o 0).
   Output_Toggle(PIN_C2);
   Set_timer0(1000);
   }

//PROGRAMA/////////////////////////////////////////////////////////////////////
void main(void)
   {
   unsigned int i;             //Creo la variable i sin signo, esto es un numero mayor de 0. (Creo)
   unsigned int numero_leds=4;//Creo la variable numero_leds sin signo, esto es un numero mayor de 0. (Creo) (sin uso)

   set_tris_b(0b0000001);       //Defino q pines del Puerto B seran entradas o salidas.
   disable_interrupts(GLOBAL);  //Habilito todas las interrupciones globales.
   output_b(0);                 //Poner 0 voltaje a todos los pines del puerto B.

   while(1)
      {
      //Logica negada ¬¬'
      //CUANDO ESTA PRESIONADO
      if (input(PIN_B0)==0)       //Pregunto si el pin 0 del puerto B es igual a 0, que por logica negada quiere decir q si esta presionado.
         {
         set_tris_b(0);                              //Todos los pines del puerto B seran salidas.
         output_high(PIN_B0);                       //Prendo el pin 0 del puerto B.
         setup_timer_0(RTCC_DIV_16 | RTCC_8_BIT);  //
         enable_interrupts(int_rtcc);             //Habilito las interrupciones...
         enable_interrupts(global);              //Habilito todas las interrupciones globales.
         }

      //CUANDO NO ESTA PRESIONADO
      else                       //Sino......
         {
         set_tris_b(1);                  //todos los pines del puerto B seran entradas.
         disable_interrupts(int_rtcc);  //Deshabilito las interrupciones...
         disable_interrupts(global);   //Deshabilito todas las interrupciones globales.
         }
      }
   }

Lo habia explicado para mi, espero te ayude  :D


salu2 8) 8)

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Sonidos y leds en 16F84A
« Respuesta #6 en: 26 de Abril de 2007, 16:54:24 »
En la sección de ejmeplitos hay un montón de programas con leds para empezar. Creo que muchos de nosotros hemos empezado por ahí y nos ha ido ha bastante bien...

Desconectado LadyMandarine

  • PIC10
  • *
  • Mensajes: 21
Re: Sonidos y leds en 16F84A
« Respuesta #7 en: 26 de Abril de 2007, 17:07:24 »
Hola a todos,

Os agradezco vuestro interés, el problema es el siguiente, yo si que se C, lo que no se es de PICS, es decir:

Se q la idea es hacer el switch, y tras leer q botón has pulsado, iluminar un led u otro y hacer sonar una nota u otra, pero lo q no se es iluminar el led y hacer sonar la nota, no se cual es el código que tiene q ir dentro de leeropcionelegida(), y dentro de case1: etc... .Tb me vendría bien el código en asm, al menos tendría algo por donde empezar a entender. Muchas gracias a todos ojalá me podáis ayudar porque mi situación es bastante desesperada, tengo q hacerlo como sea y no tengo conocimientos suficientes sobre el tema como para poder afrontarlo. Por eso estoy triste. Gracias de nuevo

PD Envío adjunto captura de Proteus para q veáis el diseño q he hecho


Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Sonidos y leds en 16F84A
« Respuesta #8 en: 26 de Abril de 2007, 19:28:56 »
Hola Lady, por aca tienes un desarrollo  (en .asm e ingles), pero te servira para tu desarrollo...

http://www.piclist.com/techref/piclist/simon/index.htm

aqui otro programa en C
/*
    8-6-06
    Copyright Spark Fun Electronics© 2006
    Nathan Seidle
    nathan at sparkfun.com
   
    Example Simon game for PIC 16F688

    Generates random sequence, plays music, and displays button lights.

    Simon tones from Wikapedia
   
    * A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse
    * a (green, upper right, an octave higher than the upper right) - 880Hz - 1.136ms - 0.568ms pulse
    * D (blue, lower left, a perfect fourth higher than the upper left) - 587.33Hz - 1.702ms - 0.851ms pulse
    * G (yellow, lower right, a perfect fourth higher than the lower left) - 784Hz - 1.276ms - 0.638ms pulse

    The tones are close, but probably off a bit. The internal oscillator would very +/-5% between PICs
    making the tones change even if they were calculated correctly.
   
    Timer1 rolls over at 65535 and is reset to 64535 (TMR1IF) so 1000 possible timer values numbers
    64535 + 250 <= 64785 will be button 1
    64785 + 250 <= 65035 button 2
    65035 + 250 <= 65285 button 3
    65285 + 250 <= 65535 button 4
    So each button has an equal chance of being added to the game sequence
    Each timer1 click is every 500ns (8MHz / 4) so the button possibility
    changes every 125us or 8000 times a second
    Not random, but no one can play the same way to within 125us!
    The sequence changes *every* game
   
*/

#include "C:\Global\Code\c\16F688.h"  // device dependent interrupt definitions
#include "C:\Global\Code\c\int16CXX.H"

#pragma config|= 0x31C4 //Internal 8MHz Oscilator, PWRT

//Hardware port definitions
//=================================================
#define BUZZ0 PORTC.4
#define BUZZ1 PORTC.5

#define STATUS_LED  PORTB.4

#define LED_RED    PORTC.2
#define LED_GREEN  PORTC.3
#define LED_BLUE   PORTC.0
#define LED_YELLOW PORTC.1

#define B1 PORTA.0
#define B2 PORTA.1
#define B3 PORTA.2
#define B4 PORTA.3

#define LED_ON  1
#define LED_OFF 0

//=================================================

//Global variable declarations
//=================================================
uns8 data_byte_in;

uns8 game_string[32];
uns8 game_string_position;
//=================================================

//Interrupt Vectors
//=================================================
#pragma origin 4
interrupt serverX( void)
{
    int_save_registers
    //char sv_FSR = FSR;  // save FSR if required

    if(TMR1IF)
    {
        //Reset timer with 65535 - 1000 = 64535 = 0xFC17
        TMR1H = 0xFC;
        TMR1L = 0x17;
       
        TMR1IF = 0;
    }

    //FSR = sv_FSR;               // restore FSR if saved
    int_restore_registers
}
//=================================================

//Function declarations
//=================================================
void boot_up(void);
void delay_ms(uns16);
void delay_us(uns16 x);

void toner(uns8, uns8);
void add_to_string(void);
void play_string(void);
void play_loser(void);
void play_winner(void);

void putc(uns8 nate);
uns8 getc(void);
uns8 bin2Hex(char x);
void printf(const char *nate, int16 my_byte);

//=================================================

void main(void)
{
    uns8 choice;
    uns8 new_button;
    uns8 current_pos;
    uns16 time_limit;
    uns8 old_choice;
   
    boot_up(); //Initialize PIC ports
   
    uns8 x;
   
BEGIN_GAME:

    //delay_ms(3000);
    //Display fancy LED pattern waiting for two buttons to be pressed
   
    //Wait for user to begin game
    while(1)
    {
        LED_RED = 1;
        LED_BLUE = 0;
        LED_GREEN = 0;
        LED_YELLOW = 0;
        delay_ms(100);
        if(B1 == 0 || B2 == 0 || B3 == 0 || B4 == 0) break;

        LED_RED = 0;
        LED_BLUE = 1;
        LED_GREEN = 0;
        LED_YELLOW = 0;
        delay_ms(100);
        if(B1 == 0 || B2 == 0 || B3 == 0 || B4 == 0) break;

        LED_RED = 0;
        LED_BLUE = 0;
        LED_GREEN = 1;
        LED_YELLOW = 0;
        delay_ms(100);
        if(B1 == 0 || B2 == 0 || B3 == 0 || B4 == 0) break;

        LED_RED = 0;
        LED_BLUE = 0;
        LED_GREEN = 0;
        LED_YELLOW = 1;
        delay_ms(100);
       
        if(B1 == 0 || B2 == 0 || B3 == 0 || B4 == 0) break;
    }
   
    //play_winner();

    //Indicate the start of game play
    LED_RED = 1;
    LED_BLUE = 1;
    LED_GREEN = 1;
    LED_YELLOW = 1;
   
    delay_ms(1000);
   
    LED_RED = 0;
    LED_BLUE = 0;
    LED_GREEN = 0;
    LED_YELLOW = 0;

    game_string_position = 0; //Start new game
   
    while(1)
    {
        add_to_string(); //Add the first button to the string
        play_string(); //Play the current contents of the game string back for the player
   
        //Wait for user to input buttons until they mess up, reach the end of the current string, or time out
        for(current_pos = 0 ; current_pos < game_string_position ; current_pos++)
        {
            //Button scanning
            //=======================================
            time_limit = 0; //Run timer while we wait for the user to push a button

            while(1)
            {
                if(B1 == 0 || B2 == 0 || B3 == 0 || B4 ==0) break;

                delay_ms(1);

                time_limit++; //3 second time limit
                if (time_limit > 3000)
                {
                    play_loser(); //Play anoying loser tones
                    goto BEGIN_GAME;
                }
            }

            //Wait for user to release button
            choice = 0;
            while(choice == 0)
            {
                if(B1 == 0) choice = '3'; //Lower left button
                if(B2 == 0) choice = '4'; //Lower right
                if(B3 == 0) choice = '1'; //Upper left
                if(B4 == 0) choice = '2'; //Upper right
               
                toner(choice, 50); //Fire the button and play the button tone
            }
            //=======================================
       
            if (choice != game_string[current_pos])
            {
                play_loser(); //Play anoying loser tones
                goto BEGIN_GAME;
            }

        }//End user input loop
       
        //If user reaches the game length of X, they win!
        if (current_pos == 13)
        {
            play_winner(); //Play winner tones
            goto BEGIN_GAME;
        }
       
        //Otherwise, we need to wait just a hair before we play back the last string
        delay_ms(1000);
    }
   

}//End Main

//Plays the loser sounds
void play_loser(void)
{
    //printf("You failed!\n", 0);
   
    LED_RED = 1;
    LED_GREEN = 1;
    toner('0', 500);

    LED_BLUE = 1;
    LED_YELLOW = 1;
    toner('0', 500);

    LED_RED = 1;
    LED_GREEN = 1;
    toner('0', 500);
}

//Plays the winner sounds
void play_winner(void)
{
    uns8 x, y, z;

    //printf("You win!\n", 0);

    LED_RED = 1;
    LED_YELLOW = 1;
    LED_BLUE = 0;
    LED_GREEN = 0;
   
    for(z = 0 ; z < 4 ; z++)
    {
        LED_RED ^= 1;
        LED_YELLOW ^= 1;
        LED_BLUE ^= 1;
        LED_GREEN ^= 1;

        for(x = 250 ; x > 70 ; x--)
        {
            for(y = 0 ; y < 3 ; y++)
            {
                //Toggle the buzzer at various speeds
                BUZZ1 = 1;
                BUZZ0 = 0;
               
                delay_us(x);
               
                BUZZ1 = 0;
                BUZZ0 = 1;
               
                delay_us(x);
            }
        }
    }
           
}

//Plays the current contents of the game string
void play_string(void)
{
    uns8 string_pos;
    uns8 button;
   
    for(string_pos = 0 ; string_pos < game_string_position ; string_pos++)
    {
        button = game_string[string_pos];

        toner(button, 100);

        delay_ms(150);
    }
   
}

//Adds a new random button to the game sequence based on the current timer elapsed
void add_to_string(void)
{
    uns16 random_timer;
    uns8 new_button;

    random_timer.high8 = TMR1H;
    random_timer.low8 = TMR1L;

    //Timer rolls over at 65535 and is reset to 64535 (TMR1IF) so 1000 possible numbers
    //64535 + 250 = 64785 will be button 1
    //64785 + 250 = 65035 button 2
    //65035 + 250 = 65285 button 3
    //65285 + 250 = 65535 button 4
    //So each button has an equal chance of being added to the game sequence
    //Each timer1 click is every 500ns (8MHz / 4) so the button possibility
    //changes every 125us or 8000 times a second
    //Not random, but no one can play the same way to within 125us!
    //The sequence changes *every* game
   
   
    //64535 to 64785
    if(random_timer < 64785)
        new_button = '1';
    else if(random_timer < 65035)
        new_button = '2';
    else if(random_timer < 65285)
        new_button = '3';
    else
        new_button = '4';
       
    game_string[game_string_position] = new_button;
    game_string_position++;
   
}

//Tone generator
void toner(uns8 tone, uns8 buzz_length)
{
    uns16 buzz_delay;
    uns16 loop_length;
   
    switch (tone)
    {
        case 'z' :
        case '0' :
            //button = ; //Failure Light up all LEDS
            buzz_delay = 300; //1500;
            loop_length = 132;//33;
            break;

        case 'A' :
        case '1' :
            buzz_delay = 227;//1136; //Upper left, Red
            loop_length = 176;//44;
            LED_RED = LED_ON;
            break;

        case 'a' :
        case '2' :
            buzz_delay = 113;//568; //Upper right, Green
            loop_length = 352;//88;
            LED_GREEN = LED_ON;
            break;

        case 'D' :
        case '3' :
            buzz_delay = 170;//851; //Lower left, Blue
            loop_length = 236;//59;
            LED_BLUE = LED_ON;
            break;

        case 'G' :
        case '4' :
            buzz_delay = 127;//638; //Lower right, Yellow
            loop_length = 312;//78;
            LED_YELLOW = LED_ON;
            break;

        //Special noises without LEDs
        case '5' :
            buzz_delay = 150;//300; //Special noise
            loop_length = 300;//167;
            break;

        case '6' :
            buzz_delay = 160;//300; //Special noise
            loop_length = 300;//167;
            break;
    }
   
    //Run buzzer for ~250ms?
    for( ; buzz_length > 0 ; buzz_length--)
    {
        for( ; loop_length > 0 ; loop_length--)
        {
            //Toggle the buzzer at various speeds
            BUZZ1 = 1;
            BUZZ0 = 0;
           
            delay_us(buzz_delay);
           
            BUZZ1 = 0;
            BUZZ0 = 1;
           
            delay_us(buzz_delay);
        }
    }

       
    //Turn off all LEDs
    LED_RED = LED_OFF;
    LED_BLUE = LED_OFF;
    LED_YELLOW = LED_OFF;
    LED_GREEN = LED_OFF;
       
}

//Initializes the various ports and interrupts
void boot_up(void)
{
    OSCCON = 0b.0111.0000; //Setup internal oscillator for 8MHz
    while(OSCCON.2 == 0); //Wait for frequency to stabilize
   
    //Setup Ports
    ANSEL = 0b.0000.0000; //Disable ADC on all pins
    CMCON0 = 0b.0000.0111; //Turn off comparator on RA port

    //Setup Ports
    PORTA = 0b.0000.0000;
    TRISA = 0b.0000.1111;   //0 = Output, 1 = Input (Buttons)

    PORTC = 0b.0000.0000;
    TRISC = 0b.0000.0000;   //0 = Output, 1 = Input (RC7 = UART RX)

    //Sets up the UART for serial comm
    //=============================================================
    //SPBRG = 129; //20MHz for 9600 inital communication baud rate
    //SPBRG = 25; //4MHz for 9600 inital communication baud rate - Not yet tested
    //TXSTA = 0b.0010.0100; //8-bit asych mode, high speed uart enabled
    //RCSTA = 0b.1001.0000; //Serial port enable, 8-bit asych continous receive mode
    //=============================================================

    //Setup interrupts
    //=============================================================
    //TMR1IF = 0;
    T1CON = 0b.0000.1101; //Enable Timer1 with internal osc
    //TMR1H = 0x80; //Preload Timer1 for 1s

    TMR1IE = 1;
    PEIE = 1;
    GIE = 1;
    //=============================================================
}

//Really short delay
void delay_us(uns16 x)
{
    //Calling with 1us returns 11us
    //Calling with 10us returns 56us
    //for ( ; x > 0 ; x--);
   
    //Calling with 1us returns 7.5us
    //Calling with 10us returns 48
    //Calling with 1000us returns 4.5ms
    while(--x);

}

//General short delay
void delay_ms(uns16 x)
{
    //Clocks out at 1006us per 1ms
    uns8 y, z;
    for ( ; x > 0 ; x--)
        for ( y = 0 ; y < 4 ; y++)
            for ( z = 0 ; z < 69 ; z++);
}


 :-/ :mrgreen:

espero te sea de ayuda


Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado LadyMandarine

  • PIC10
  • *
  • Mensajes: 21
Re: Sonidos y leds en 16F84A
« Respuesta #9 en: 27 de Abril de 2007, 04:05:31 »

Hola Norberto,

Estoy sumamente agradecida, de veras. Nunca se me va a olvidar esto, aqui tienes una amiga para siempre. Ojalá yo pudiera hacer algo por ti. Tengo muchas dudas porque como dije no tengo ni idea de PICS por eso pedi ayuda y me gustaría aprender, por ejemplo supongo q tendré q adaptar los puertos a mi dibujo y a mi pic16f84a y no se si voy a saber. Es posible que pregunte algo muy trivial, espero que en ese caso me perdones. ¿Por qué tu código tiene puertoA, puertoB y puertoC?. Otra pregunta, veo que añades las librerias: int16 q supongo q será para las interrupciones y la 16f688 q será la del pic q tu utilizas. He buscado ese pic y veo q efectivamente tiene puerto A y puerto C, pero no tiene puerto b no? y entonces esto no lo entiendo: #define STATUS_LED  PORTB.4. Me gustaría tanto aprender!!!. Espero no aburriros con mis rollos.

Mil gracias. A ver si consigo mi gesta.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Sonidos y leds en 16F84A
« Respuesta #10 en: 27 de Abril de 2007, 04:34:20 »
Amiga LadyMandarine si de verdad quieres aprender realiza paso a paso los ejemplos de este post: http://www.todopic.com.ar/foros/index.php?topic=4530.0

En ellos se va desde encender un simple LED, hasta comunicaciones serie transmitiendo datos obtenidos por el A/D, pasando por el uso de LCD's, display's 7-segs y un largo etc...

Para lo que pretendes hacer tendrías suficiente con leer los 4 primeros ejemplitos. Ahí verás que con un simple output_high(PIN_B1); puedes encender un led conectado al pin B1 y así con el resto de leds... te lo dice uno que hace varios meses sólo sabía C y ahora hace alguna que otra cosa interesantilla con PIC's.

Un saludo!!

Desconectado LadyMandarine

  • PIC10
  • *
  • Mensajes: 21
Re: Sonidos y leds en 16F84A
« Respuesta #11 en: 27 de Abril de 2007, 07:54:18 »
Hola a todos,

Muchas gracias DarkVect por las indicaciones, en cuanto acabe con esto y lo entregue (si lo consigo) me voy a poner desde cero para el examen, que todavía me quedan 4 meses, pero la práctica debo entregarla pronto y no me da tiempo. No me deja acceder a: http://www.piclist.com/techref/piclist/simon/index.htm, alguien tiene ese código?.

Respecto a la adptación del código q me ha proporcionado Norberto, sigo en ello. No acabo de estar segura si basta con cambiar los puertos o hay funciones diferentes para ambos PICS. Muchs gracias a todos de nuevo, me estais siendo de mucha ayuda.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Sonidos y leds en 16F84A
« Respuesta #12 en: 27 de Abril de 2007, 09:52:11 »
Hola, sinceramente creo que acabarás mucho antes leyendo los 4 primeros ejemplos del post que dije y copiando y pegando el código que ahí encuentres (además usa los mismos puertos que tu PIC) que adaptando el código que te han pasado.

De verdad que es mucho más fácil. Fíjate en el primer ejemplo como se declara el PIC a utilizar, la frecuencia del reloj, los puertos y listo para encender leds, así de simple. Luego sólo tienes que leer los botones y seguir encendiendo y apagando leds.

Básicamente sería:

if (input(PIN_B0)==0)   //mirar si se pulsa el botón
{
    output_high(PIN_B1);   //encender led
    delay_ms(500);           //durante medio segundo como mínimo para verlo bien
}
else
{
     output_low(PIN_B1);   //al dejar de pulsar se apaga
}

Para el resto de leds igual. Sólo falta que inicialices el PIC y los puertos y eso lo tienes muy bien explicado en los ejemplos.

Un saludo!!
   

Desconectado paco1980

  • PIC16
  • ***
  • Mensajes: 129
Re: Sonidos y leds en 16F84A
« Respuesta #13 en: 27 de Abril de 2007, 20:50:47 »
hola lady. Como yo también recibo mucha ayuda de este foro, voy a intentar echarte una manita.
te he hecho un programita  rapido para que enciendas el primer led, y hagas sonar el parlante. Para lo demás solo tienes que cambiar el nombre de entradas y saludas y la frecuencia del parlante.

No he probado el programa, porque ya es tarde y apetece poko, pruebalo así primero a ver si te rula bien y luego lo implementas. En caso de que no este bien hecho, no te preocupes que aqui hay gente de sobra con muy buenos conocimientos para corregirme.

Si te da problemas, nos ponemos manos a la obra y lo dejamos ok.

#include <16f84a.h>            //pic a utilizar
#fuses XT,NOWDT,noPROTECT,NOPUT     //ordenes para el programador
#use delay (clock=4000000)  // si tu oscilador es distinto, pues cambias el valor
#use fast_io(b)




void main(void){
int i=0,j=0;

set_tris_b(0b00011111); aqui creo tur entradas (rbo - rb4)

for(;;){
   if(input(pin_b4)){  // al pulsar rb4
   output_high(pin_a0);// enciendes el led de ra0
   do{
      output_high(pin_a4);  // mandas un tren de pulsos al parlante
      delay_us(2250);
      output_low(pin_a4);
      delay_us(2250);
      i++;
      if(i>220){
      i=0;
      j++;
      }
   }while(j<4); /a los 4 segundos aprox. se para el parlante
   i=0;
   j=0;
   output_low(pin_b4); // se apaga el led
}
}}

Un saludo

Desconectado LadyMandarine

  • PIC10
  • *
  • Mensajes: 21
Re: Sonidos y leds en 16F84A
« Respuesta #14 en: 03 de Mayo de 2007, 05:51:57 »
Hola otra vez, sigo con lo mío. Con vuestra ayuda he hecho un pequeño ejemplo:

#include <pic.h>
#include <pic1684.h>           

#define pin_a3 PORTA.3;
#define pin_b4 PORTB.4;
#define pin_b0 PORTB.0;

#define ON 1;
#define OFF 0;

void delay_us(uns16);

void main(void){

int i=0,j=0;
pin_a3=0;
pin_b4=0;
pin_b0=0;

while(1){
   if(pin_a3 == 1)
   { 
   pin_b4=ON;
   do{
      pin_b0=ON; 
      delay_us(2250);
      pin_b0=OFF;
      delay_us(2250);
      i++;
      if(i>220)
      {
         i=0;
         j++;
      }
   }while(j<4);
   i=0;
   j=0;
   pin_b4=OFF;
   }
   }
}

void delay_us(uns16 x)
{
   
    while(--x);

}

y lo he puesto en el proteus en el diseño que envié en otra ocasión y al compilar con picc, me da un montón de fallos que no sé resolver:

básicamente function body expected y expression syntax. Porqué esta mal?. Alguien lo sabe??. Gracias por adelantado. Voy a suspender. No avanzo nada snif!! :(