Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Limite numero di ingressi

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Limite numero di ingressi

Messaggioda Foto Utenteguidonetto » 24 mar 2012, 15:13

Ciao, esiste un limite massino sul numero di ingrssi che riconosce un Pic18f4550, mi spiego sto progettando una semplice tastiera musicale quando setto come ingressi (pulsanti) da RB0 a RB7 e RD0 e RD1 tutto bene come aggiungo RD2 comincia a suonare (ne devo mettere 12) , ho messo dei resistori di PULL-UP, ho cambiato gli ingressi con RC e RE nulla, avete qualche idea del perche mi succede questo?
Grazie.

Codice: Seleziona tutto
#include <p18f4550.h>
#include <PWM.h>
#include <timers.h>
#include <portb.h>

//Variabili usate per definire i pulsanti e la freq. dei for dei pulsanti
#define BT0 PORTAbits.RA0
#define z0 300

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON


//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilitato il Watchdog Timer
//LVT = OFF Disabilitato programmazione LVT
//PBADEN = OFF Disabilitato gli ingrassi analogici
//CCP2MX = ON il modulo CCP è posto su RC1

void pulsante0 (void); // Dichiaro la funzione del BT0

void set_duty_cycle (int duty_cycle); //void set_duty_cycle (int duty_cycle);

int sine[] = {250,299,346,389,427,458,481,495,500,495,481,458,427,389,346,299,250,201,154,111,73,42,19,5,0,5,19,42,73,111,154,201};
// Repeat the sample for x time
// sampling frequency must be changed to keep analog signal frequency costnat
const unsigned char REPEATING_FACTOR = 1;//3 numero ripetizioni standard

int i; //Variabile usata per creare un conteggio fittizio di pausa

    unsigned char period;  //Periodo del segnale PWM

    static unsigned char sample = 0;
    static unsigned char repeat = 0;

void main (void) {

   //Imposto PORTA tutti ingrrssi

   LATA = 0x00;
   TRISA = 0xFF;
        ADCON1 = 0x0F; // Imposto PORTA come I/O

   //Imposto PORTB tutti ingrrssi

   LATB = 0x00;
   TRISB = 0xFF;

   //Imposto PORTC tutti ingressi ad RC1 come uscita

   LATC = 0x00;
   TRISC = 0b11111101;

   //Imposto PORTD tutti ingrrssi

   LATD = 0x00;
   TRISD = 0xFF;
       
   //Imposto PORTE tutti ingrrssi

   LATE = 0x00;
   TRISE = 0xFF;
        ADCON1 = 0x0F; // Imposto PORTA come I/O

EnablePullups ();  //Abilito resistori di pullups

OpenTimer2 (TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_16 ); //Apro il timer2 per il PWM

while (1) { //Ciclo infinito (Va messo nel main davanti alle funzioni, il programma gira).

pulsante0 (); //Richiama nel main la funzione pulsante0

  }//While
        }//main

void pulsante0 (void) { //Funzione del BT0

if (repeat == REPEATING_FACTOR) {
         repeat = 0;
         sample++;
                }
         if (sample > 31) {
            sample = 0;
         }

if (BT0 == 0){  //Controllo la pressione per assegnare il valore di D0
if (PORTBbits.RB0 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
        period = 237; // Imposto una frequenza di 262Hz DO centrale

if (PORTBbits.RB0 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

   if (PORTBbits.RB1 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 224; // (222) Imposto una frequenza di 277Hz DO #

if (PORTBbits.RB1 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTBbits.RB2 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
        period = 212; // Imposto una frequenza di 294Hz RE centrale

if (PORTBbits.RB2 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }

}
   if (PORTBbits.RB3 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 201; // Imposto una frequenza di 311Hz RE#

if (PORTBbits.RB3 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTBbits.RB4 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 189; // Imposto una frequenza di 330Hz MI

if (PORTBbits.RB4 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTBbits.RB5 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 179; // Imposto una frequenza di 349Hz FA

if (PORTBbits.RB5 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTBbits.RB6 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 169; // Imposto una frequenza di 370Hz FA#

if (PORTBbits.RB6 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTBbits.RB7 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 159; // Imposto una frequenza di 392Hz SOL

if (PORTBbits.RB7 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTDbits.RD0 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 151; // Imposto una frequenza di 415Hz SOL#

if (PORTDbits.RD0 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTDbits.RD1 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 134; // Imposto una frequenza di 466Hz LA

if (PORTDbits.RD1 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTDbits.RD2 == 0)    {  //Controllo la pressione di RB
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 142; // Imposto una frequenza di 440Hz LA#

if (PORTDbits.RD2 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

else{
    BT0 = 0;
    }
}// if del BT0

}//Pulsante0


void set_duty_cycle (int duty_cycle) {

   CCPR2L = (unsigned char) (duty_cycle >> 2);

   if (duty_cycle & 0x0001)
      CCP2CONbits.DC2B0 = 0x0001;
   else
      CCP2CONbits.DC2B0 = 0x0000;

   if (duty_cycle & 0x0002)
      CCP2CONbits.DC2B1 = 0x0001;
   else
      CCP2CONbits.DC2B1 = 0x0000;
}
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[2] Re: Limite numero di ingressi

Messaggioda Foto UtentePaolino » 24 mar 2012, 15:19

guidonetto ha scritto:...come aggiungo RD2 comincia a suonare...

Puoi precisare meglio questa frase, per piacere?
Grazie.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[3] Re: Limite numero di ingressi

Messaggioda Foto Utenteguidonetto » 24 mar 2012, 20:18

Ciao, si come aggiungo un altro pulsante, in questo caso RD2 entra in una specie di loop e dato che sto progettando una tastiera incomincia a suonare una nota, non capisco il perche, come ho scritto non dipende dal PORTD dato che ho provato con PORTC e PORTE, se è un difetto del codice non riesco a trovare la causa, mi serve aiuto.
Grazie
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[4] Re: Limite numero di ingressi

Messaggioda Foto Utenteguidonetto » 24 mar 2012, 21:56

Ciao, ho risolto inserendo gli ingressi RE2 e RE1 (prima devo averli collegato male), mi rimane il dubbio perche da RD2 a RD7 e da RC4 a RC7 entra in stallo, potete darmi una risposta?
Grazie
Codice: Seleziona tutto
if (PORTEbits.RE2 == 0)    {  //Controllo la pressione di RE
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 142; // Imposto una frequenza di 440Hz LA#

if (PORTEbits.RE2 == 0)    {  //Controllo la pressione di RE

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}

if (PORTEbits.RE1 == 0)    {  //Controllo la pressione di RE
   for (i=0; i<z0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
       period = 126; // Imposto una frequenza di 494Hz SI

if (PORTEbits.RE1 == 0)    {  //Controllo la pressione di RE

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}
 
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti