- Messaggi: 583
- Ringraziamenti ricevuti 1
Come far vedere all' inpterrup molte PORT
12 Anni 8 Mesi fa #1
da Guido
Come far vedere all' inpterrup molte PORT è stato creato da Guido
Salve, mi serve sfruttare quasi tutti i pin d'uscita del PIC18f4550, scritto cosi il codice vede solo da RB4 a RB7 come posso aggirare l'ostacolo, mantenedo l' interrupt.
Grazie.
Codice:
#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
#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 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).
//pulsante0 (); //Richiama nel main la funzione pulsante0
//pulsante1 (); //Richiama nel main la funzione pulsante1
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;
}
Grazie.
Codice:
#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
#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 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).
//pulsante0 (); //Richiama nel main la funzione pulsante0
//pulsante1 (); //Richiama nel main la funzione pulsante1
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;
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
12 Anni 8 Mesi fa #2
da inx83
Risposta da inx83 al topic Re: Come far vedere all' inpterrup molte PORT
Ciao, non ho ben capito che tipo di problema hai. Spiega in che senso voi mantenere l interrput. Se intendi averne uno sul cambio di stato di un ingresso puoi usare int0 o int1 se non li usi x altro
Si prega Accedi o Crea un account a partecipare alla conversazione.
- inx83
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 1
12 Anni 8 Mesi fa #3
da Guido
Risposta da Guido al topic Re: Come far vedere all' inpterrup molte PORT
Ciao, attualmete posso adoperare solo DA RB4 a RB7, io vorrei mantenedo l'INTERRUPT sfruttare tutti i PORT di RB e anche RD e RC
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
12 Anni 8 Mesi fa #4
da inx83
Risposta da inx83 al topic Re: Come far vedere all' inpterrup molte PORT
Perdonami ma dimmi se ho capito: tu vuoi ottenere un interrupt su ogni porta configurata come ingresso? Perche se e cosi non lo puoi fsre dato che solo certi pin hanno questa possibilita. Infatti da rb4 a rb7 hai un interrup sul cambio di stato mentre su rb0 e rb1 hai un interrup sul fronte.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- inx83
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 1
12 Anni 8 Mesi fa #5
da Guido
Risposta da Guido al topic Re: Come far vedere all' inpterrup molte PORT
Si, voglio un interrupt su ogni porta configurata come ingresso, nel mio caso voglio inserire anche dei PORT su RC, RD e tutte le RB, hai un idea di come possa fare?
Grazie
Grazie
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.