Difficoltà a far funzionare codice

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #1 da Guido
Difficoltà a far funzionare codice è stato creato da Guido
Salve ho scritto e simulato il codice di Pag. 168 della guida Step by Step, il problema che riscontro è che il led che lavora col timer non lampeggia, rimane spento, mi date dei consigli per farlo funzionare?
Uso Pic 18f4550
Allego codice:
Code:
#include <p18f4550.h> #include <portb.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF //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 void Low_Int_Event (void); // Prototipo di funzione per bassa priorità void High_Int_Event (void); // Prototipo di funzione per alta priorità // Impostazione e Gestione priorità alta // #pragma code high_vector = 0x08 void high_interrupt (void) { _asm GOTO High_Int_Event _endasm //Salto x la gestione dell'interrupt alta priorità } #pragma code #pragma interrupt High_Int_Event void High_Int_Event (void) { // Funzione x la gestione dell'interruzione ad alta priorità int i; // indice x il ciclo di pausa if (INTCONbits.RBIF == 1 ) { //Controllo che l'interrup sia stato generato da PORTB for (i=0; i<10000; i++) { // Pausa filtraggio spike } if (PORTBbits.RB4 == 0 ) { // Controllo la pressione di RB0 LATCbits.LATC1 = ~ LATCbits.LATC1 ; // Accendo il led } INTCONbits.RBIF == 0; //Resetto il flag x permettere nuove interuzioni } } #pragma code low_vector = 0x18 void low_interrupt (void) { _asm GOTO Low_Int_Event _endasm //Salto x la gestione dell'interrupt bassa priorità } #pragma code #pragma interrupt High_Int_Event void Low_Int_Event (void) { // Funzione x la gestione dell'interruzione ad alta priorità if (INTCONbits.TMR0IF == 1 ) { //Controllo che l'interrup sia stato generato da Timer0 LATCbits.LATC2 = ~ LATCbits.LATC2 ; // lampeggia il led INTCONbits.TMR0IF == 0; //Resetto il flag } } void main (void){ unsigned int i; //variabile usata per creare un conteggio fittizio // Imposto PORTA tutti ingrassi ADCON1 = 0x0F; // Imposto tutti ingressi digitali PORTA = 0x00; LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi PORTB = 0x00; LATB = 0x00; TRISB = 0xFF; //Imposto PORTC tutti ingressi ed RC1 come uscita PORTC = 0x00; LATC = 0x00; TRISC = 0b11111101; // Imposto PORTD tutti ingressi PORTD = 0x00; LATD = 0x00; TRISD = 0xff; // Imposto PORTE tutti ingressi PORTE = 0x00; LATE = 0x00; TRISE = 0xFF; EnablePullups (); //Abilito resistori di pullups INTCONbits.RBIE = 1; //Abilito le interruzioni su PORTB INTCON2bits.RBIP = 1; //Abilito le interruzioni su PORTB come alta priorità T0CONbits.T08BIT = 0; // Modalità a 16 bit T0CONbits.T0CS = 0; // Clock interno T0CONbits.PSA = 0; // Abilito Prescaler T0CONbits.T0PS0 = 0; // T0CONbits.T0PS1 = 0; // Prescaler T0CONbits.T0PS0 = 1; // TMR0H = 0xF0; // preset for Timer0 MSB register TMR0L = 0x40; // preset for Timer0 LSB register INTCONbits.TMR0IE = 1; //Abilito le interruzioni del timer0 INTCON2bits.TMR0IP = 0; //Abilito le interruzioni del timer0 come bassa priorità T0CONbits.TMR0ON = 1; // Abilito il Timer0 RCONbits.IPEN =1; //Abilito modalità interruzione a due livelli alta e bassa INTCONbits.GIEH = 1; //Abilito gli interrups ad alta priorità INTCONbits.GIEL = 1; //Abilito gli interrups a bassa priorità // Ciclo infinito while (1) { } //end for } // end main

Grazie
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.

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

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
14 Anni 1 Mese fa #2 da Guido
Risposta da Guido al topic Re: Difficoltà a far funzionare codice
#pragma interruptlow Low_Int_Event

void Low_Int_Event (void)

Ho sbaglito ad assegnare il nome a queste istruzzioni, le ho corrette ma il led rimane ancora spento.

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #3 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Difficoltà a far funzionare codice TIMER
Ciao Guido,

Il programma che hai postato e´ un po´ modificato rispetto a quello presentato nel testo "C18 Step by Step". In particolare vedo che hai cambiato la posizione del LED.

Non ho visto i dettagli di ogni cambiamento ma il led per come imposti la PORTC e´ il bit 1 e non 2.
Ricontrolla il registro TRISC e le righe:
Code:
LATCbits.LATC1 = ~ LATCbits.LATC1 ; // Accendo il led
Code:
LATCbits.LATC2 = ~ LATCbits.LATC2 ; // lampeggia il led


sono in conflitto con quanto definito nel registro TRISC
Code:
TRISC = 0b11111101;

Questo errore giustifica malfunzionamenti sul LED.

Saluti,

Mauro
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.

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

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
14 Anni 1 Mese fa #4 da Guido
Chiedo umilmente scusa hai ragione .

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
14 Anni 1 Mese fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Difficoltà a far funzionare codice
Ciao Guido,

non devi certo chiedere scusa.
Credo che aver compreso l'errore ti ha certamente portato un passo avanti.

E' dunque molto importante che il registro TRIS di ogni porta del PIC sia propriamente impostato al fine di far funzionare correttamente i LED. In particolare questo è vero anche per le periferiche interne del PIC.

Nel caso di ingressi analogici oltre al registro TRIS bisogna impostare anche i registri relativi alla configurazione del modulo ADC. Altre periferiche potrebbe sovrascrivere il valore del registro TRIS mentre altre richiedono che il registro TRIS sia propriamente impostato.

Bisogna sempre fare riferimento al datasheet, al paragrafo della porta che si sta usando e anche al paragrafo delle periferiche d'interesse.

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