- Messaggi: 583
- Ringraziamenti ricevuti 1
Ingressi rispondono in modo anomalo
12 Anni 7 Mesi 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;
}
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
- Autore della discussione
- Platinum Member
Riduci
Di più
12 Anni 7 Mesi fa #2
da Mauro Laurenti
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.
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.
12 Anni 7 Mesi fa #3
da Guido
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.
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
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024