Stesso sorgente, pic diverso, diverso risultato...

  • ElleErre
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
14 Anni 2 Mesi fa - 14 Anni 2 Mesi fa #1 da ElleErre
Ho nuovamente bisogno di aiuto e mi cospargo il capo di cenere.

Nel corso C18 di Mauro c'e' un esempio (perfettamente funzionate su 4550) dell'utilizzo dell'interrupt (Cap.8, pag. 173).

Ho provato a ricompilare il tutto per 18F45k20 e, alla pressione del tasto, non vedo cambiare lo stato del led, come invece dovrebbe.

Il led del Timer0, invece, funziona perfettamente.

Secondo me, nonostante i vari settaggi, le porte RB1...RB4 restano analogiche, ma non sono certo di questo.
Preso dal dubbio, ho pure provato con un 45K20 formato DIP - nessuna variazione

Nel datasheet c'e' uan nota: " ... RB port change interrupts also require the individual pin IOCB enables."
Ho provato anche questo, ma nulla.

Questo il sorgente modificato...
Code:
/* settaggi per 18F4550 #include <p18f4550.h> #include <portb.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF */ #include <p18f45k20.h> #include <portb.h> #pragma config FOSC = HS, FCMEN = OFF, IESO = OFF #pragma config PWRT = OFF, BOREN = OFF, BORV = 30 #pragma config WDTEN = OFF, WDTPS = 32768 #pragma config MCLRE = ON, LPT1OSC = OFF #pragma PBADEN = OFF // forzo porte B in digitale #pragma CCP2MX = PORTC #pragma config STVREN = ON, LVP = OFF, XINST = OFF #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF #pragma config CPB = OFF, CPD = OFF #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF #pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF #pragma config EBTRB = OFF void Low_Int_Event (void); void High_Int_Event (void); #pragma code high_vector = 0x08 void high_interrupt (void) { _asm GOTO High_Int_Event _endasm } #pragma code #pragma interrupt High_Int_Event void High_Int_Event (void) { int i; LATDbits.LATD2 = ~LATDbits.LATD2; // aggiunto per test - non cambia stato if (INTCONbits.RBIF == 1 ) { LATDbits.LATD3 = ~LATDbits.LATD3; // aggiunto per test - non cambia stato for (i=0; i<10000; i++){} if (PORTBbits.RB4 == 0) // se porta B4.. allora { LATDbits.LATD1 = ~LATDbits.LATD1; // non cambia stato } INTCONbits.RBIF = 0; } } #pragma code low_vector = 0x18 void low_interrupt (void) { _asm GOTO Low_Int_Event _endasm } #pragma code #pragma interruptlow Low_Int_Event void Low_Int_Event (void) { if (INTCONbits.TMR0IF == 1 ) { LATDbits.LATD0 = ~LATDbits.LATD0; // led funziona INTCONbits.TMR0IF = 0; } } //************************************************************ // main program //************************************************************ void main (void) { unsigned int i; LATA = 0x00; // ports A,B,C all inputs TRISA = 0xFF; LATB = 0x00; TRISB = 0xFF; LATC = 0x00; TRISC = 0xFF; LATD = 0x00; // port D output TRISD = 0x00; LATE = 0x00; // port E input TRISE = 0xFF; EnablePullups(); INTCONbits.RBIE = 1; // interrupt on port B enabled INTCON2bits.RBIP = 1; // high priority T0CONbits.T08BIT = 0; // 16 bit on T0CONbits.T0CS = 0; // internal clock T0CONbits.PSA = 0; // prescaler T0CONbits.T0PS0 = 0; // prescaler 32 T0CONbits.T0PS1 = 0; T0CONbits.T0PS2 = 1; INTCONbits.TMR0IE = 1; // timer 0 interrupt INTCON2bits.TMR0IP = 0; // low priority T0CONbits.TMR0ON = 1; // timer 0 on RCONbits.IPEN = 1; INTCONbits.GIEH = 1; INTCONbits.GIEL = 1 ; while (1){ } }

... di questo passo, nel mio avatar, al posto del pic ci metto la mia testa :)


Grazie per il vostro aiuto!

ElleErre
Ultima Modifica 14 Anni 2 Mesi fa da admin.

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
14 Anni 2 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Stesso sorgente, pic diverso, diverso risultato...
Ciao,

non ho usato il PIC specifico a cui fai riferimento, ma nel programma di esempio che hai messo non trovo la configurazione del registro IOCB a cui fa riferimento il datasheet.

Saluti,

Mauro

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

  • ElleErre
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
14 Anni 2 Mesi fa - 14 Anni 2 Mesi fa #3 da ElleErre
Cosi' funziona:
Code:
(...) LATA = 0b00000000; LATB = 0b00000000; LATC = 0b00000000; LATD = 0b00000000; LATE = 0b00000000; TRISA = 0b00000011; TRISB = 0b11111111; TRISC = 0b11111100; TRISD = 0b00000000; TRISE = 0b00000000; //************************************************************ // Abilito i pulsanti per le interruzioni ad alta priorita' //************************************************************ // Abilita i resistori di pull-up sulla PORTB EnablePullups(); IOCB = 0b11110000; (...)

ElleErre
Ultima Modifica 14 Anni 2 Mesi fa da admin.

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
14 Anni 2 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Stesso sorgente, pic diverso, diverso risultato...
perfetto,

quindi hai abilitato i resistori di pull-up prima di abilitare le interruzioni sui singoli pin.

Saluti,

Mauro

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

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.

Forum - Ultimi messaggi