Ingressi rispondono in modo anomalo

12 Anni 1 Mese fa #1 da Guido
Ingressi rispondono in modo anomalo è stato creato da Guido
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.

#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;
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido
  • Platinum Member
  • Platinum Member
Di più
12 Anni 1 Mese fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Ingressi rispondono in modo anomalo

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
12 Anni 1 Mese fa #3 da Guido
Risposta da Guido al topic Re: Ingressi rispondono in modo anomalo

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido
  • Platinum Member
  • Platinum Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login