Inoltre con l'interrupt posso usare solo da RB4 a RB7, ho bisogno di usare anche gli ingressi su PORTD E PORTC, come posso modificare il codice per mantenere l'interrupt e far vedere più ingrssi?
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 D0 300
#define BT1 PORTAbits.RA1
#define D5 4000
#pragma config FOSC = HS //OSC = HS Impostato per lavorare ad alta frequenza
#pragma config WDT = OFF //WDT = OFF Disabilitato il Watchdog Timer
#pragma config LVP = OFF //LVT = OFF Disabilitato programmazione LVT
#pragma config PBADEN = OFF //PBADEN = OFF Disabilitato gli ingrassi analogici
#pragma config CCP2MX = ON //CCP2MX = ON il modulo CCP è posto su RC1
void pulsante0 (void); // Dichiaro la funzione del BT0
void pulsante1 (void); // Dichiaro la funzione del BT1
void High_Int_Event (void); //Dichiaro l'istruzione Interrupt
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 tutte uscite
LATD = 0x00;
TRISD = 0x00;
//Imposto PORTE tutti ingrrssi
LATE = 0x00;
TRISE = 0xFF;
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).
INTCONbits.RBIE = 1; // Abilito le interruzioni su PORTB
RCONbits.IPEN = 0; // Abilito modalità standard
INTCONbits.GIE = 1; // Abilito interrupt globale
INTCONbits.PEIE = 1 ; //Abilito Interrupt per periferiche
}//While
}//main
#pragma code high_vector = 0x08
void high_interrupt (void) {
// go to the interrupt handler
_asm GOTO High_Int_Event _endasm
}
#pragma code
#pragma interrupt High_Int_Event
void High_Int_Event (void){
pulsante0 (); //Richiama nel main la funzione pulsante0
pulsante1 (); //Richiama nel main la funzione pulsante1
}//Interrupt
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 (( INTCONbits.RBIF == 1) && (PORTBbits.RB4 == 0)) { //Controllo la pressione di RB0 + Interrupt
for (i=0; i<D0; i++) { //Pausa filtraggio spike (10000 conteggio standard)
}
period = 237; // (232 prova) Imposto una frequenza di 262Hz DO centrale
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
}
}
else{
BT0 = 0;
}
INTCONbits.RBIF = 0; //Resetto il flag
}// if del BT0
}//Pulsante0
void pulsante1 (void) { //Funzione del BT1
if (repeat == REPEATING_FACTOR) {
repeat = 0;
sample++;
}
if (sample > 31) {
sample = 0;
}
if (BT1 == 0){ //Controllo la pressione per assegnare il valore di D0
if ((INTCONbits.RBIF == 1) && (PORTBbits.RB4 == 0)) { //Controllo la pressione di RB0 + Interrupt
for (i=0; i<D5; i++) { //Pausa filtraggio spike (10000 conteggio standard)
}
period = 237; // (232 prova) Imposto una frequenza di 262Hz DO centrale
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
}
}
else{
BT1 = 0;
}
INTCONbits.RBIF = 0; //Resetto il flag
}// if del BT1
}//Pulsante1
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;
}

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)





