Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programma contagiri... ****!

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 18 mag 2011, 21:44

Dopo svariati tentativi ha funzionato (solo l'accensione di tutti i led insieme con un programmino semplice) :-) :-) :-) Ero felicissimo tanto che volevo provare anche l'altro programma (contagiri) ma poi ho provato un ultima volta con il programmino semplice! ma non funziona niente!! e ora dopo svariati tentativi di provare a farlo ripartire ancora niente... uff :(
Non è possibile tutte a me! :shock: :? O|
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

[22] Re: Programma contagiri... ****!

Messaggioda Foto UtenteTardoFreak » 18 mag 2011, 23:01

Fai una prova. Seleziona l' oscillatore interno senza PLL e mettici questo programma. E' il tuo, scritto un po' piu' leggibile e con qualche piccola variazione.
Fai partire e dimmi cosa vedi.

Codice: Seleziona tutto
void interrupt (void);    //Funzione ISR (Interrupt Service Routine)

volatile int rpm=0;               //Variavile globale per i giri del motore

void main()
{

  T0PS1_bit=1;             //Imposto il valore di prescale a 1:8
  TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow
  TMR0IF_bit=1;            //Abilita l'interrupt flag quando viene scatenato l'interrupt per overflow da TMR0
  TMR0ON_bit=1;            //Attiva TMR0

  T1SYNC_bit=1;            //TMR1 external clock input do not synchronization
  TMR1CS_bit=1;            //Sorgente di clock esterna per TMR1 dal pin T1CKI
  TMR1ON_bit=1;            //Attiva TMR1

  PCFG3_bit=1;             //Tutta PORTA come I/O digitali
  PCFG2_bit=1;             //Tutta PORTA come I/O digitali
  PCFG1_bit=1;             //Tutta PORTA come I/O digitali
  PCFG0_bit=1;             //Tutta PORTA come I/O digitali

  trisb=0;                 //PORTB tutta come output
  trisa=0;                 //PORTA tutta come output

  TMR0L=0x7A;              //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
  TMR0H=0x6D;
  TMR1L=0x00;              //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
  TMR1H=0x00;

  IPEN_bit=0;              //Disabilita la priorità degli interrupts
  GIE_bit=1;               //Abilita GIE (General Interrupt Enable)
  PEIE_bit=1;              //Abilita PEIE (Peripheral Interrupt Enable)

  while(1)                 //Ciclo infinito
  {
    // Prova per verifca del funzionamento
    rpm = 3;
    // fine prova
    switch (rpm)
    {
      case 0:                //Caso di motore fermo
        LATB = 0;
        LATA = 0;
        break;
      case 1:                //Caso mille giri al minuto
        LATB = 0x80;
        LATA = 0;
        break;
      case 2:                //Caso 2 mila giri al minuto
        LATB = 0xC0;
        LATA = 0;
        break;
      case 3:                //Caso 3 mila giri al minuto
        LATB = 0xE0;
        LATA = 0;
        break;
      case 4:                //Caso 4 mila giri al minuto
        LATB = 0xF0;
        LATA = 0;
        break;
      case 5:                //Caso 5 mila giri al minuto
        LATB = 0xF8;
        LATA = 0;
        break;
      case 6:                //Caso 6 mila giri al minuto
        LATB = 0xFC;
        LATA = 0;
        break;
      case 7:                //Caso 7 mila giri al minuto
        LATB = 0xFE;
        LATA = 0;
        break;
      case 8:                //Caso 8 mila giri al minuto
        LATB = 0XFF;
        LATA = 0;
        break;
      case 9:                //Caso 9 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x20;
        break;
      case 10:               //Caso 10 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x30;
        break;
      case 11:               //Caso 11 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x38;
        break;
      case 12:               //Caso 12 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3C;
        break;
      case 13:               //Caso 13 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3E;
        break;
      case 14:               //Caso 14 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3F;
        break;
    }
  }
}

void interrupt (void)     //Funzione ISR (Interrupt Service Routine)
{
  if (pir1.TMR0IF)         //Interrupt scatenato da timer0?
  {
    pir1.TMR0IF=0;          //Azzero il bit flag interrupt scatenato da TMR0
    rpm=((int)TMR1L*3)/35;  //Valore TMR1 in variabile rpm (moltiplico il valore di TMR1L per 10 e per 60 per trovare gli impulsi in un minuto poi divido per 7, il valore dei poli dell'alternatore, e infine divido per mille per ricavare un numero intero che varia da 0 a 14)
    TMR0L=0x7A;             //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
    TMR0H=0x6D;
    TMR1L=0x00;             //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
    TMR1H=0x00;
  }
}
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[23] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 19 mag 2011, 22:14

:D Wow! ci sono dei segni di vita!! :-) Grazie mille!!
-Allora prima cosa: Come mai il mio non funzionava?! anche lo spostare le impostazioni(es. GIE_bit=1) prima(nel programma) o dopo deve avere una logica per poi funzionare?! perché pure io avevo fatto una prova simile ma senza aver risultati finali...
-Seconda: mi sa che c'è qualche problema per attivare i led... credo che dovrò attivarli uno per volta, all'interno di ogni "case". perché con la variabile rpm=3 accende tutta LATB meno l'ultimo bit di essa! e dovrebbe accendere il 7°,6°e5°... infatti il numero esadecimale è 0xE0 ed il corrispondente in binario è 11100000... questo succede per quale motivo?! :?:
-Terza: Sul contagiri finale posso utilizzare anche l'oscillatore interno?! Io avevo preso questo oscillatore a 12MHz perché un amico mi aveva detto che per riuscire a captare un segnale in entrata a 1400Hz mi serviva almeno un oscillatore da 12MHz... Ma poi ora che ci ragiono sopra è inutile... perché se ho impostato l'ingresso su T1CKI, impostato come contatore asincrono non dovrei aver limiti! Sbaglio?! quindi posso utilizzare anche l'oscillatore interno!?

Grazie mille!!!!!!!!! :-) :-) :-)
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

[24] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 20 mag 2011, 15:21

Niente c'è qualcosa che non va! oggi ho provato tutti i 15 casi... ma il risultato è uguale per tutti! si accende solo LATB escluso il 7°bit!
Cos'è?! tipo una segnalazione di un errore??
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

[25] Re: Programma contagiri... ****!

Messaggioda Foto UtenteTardoFreak » 20 mag 2011, 15:29

Hai provato a selezionare l' oscillatore interno?
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[26] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 20 mag 2011, 16:25

Certo certo! Grazie! :-) infatti si accendono i led ma in maniera "strana"! si accende sempre tutta LATB eccetto il 7°bit di quel LAT e il LATA non da segni di vita (in qualunque "case" in cui si trovi il programma)... ho provato anche ad accendere i led dei bit per bit (senza usare il numero esadecimale) ma comunque da sempre lo stesso risultato... boh... :(

N.B. Con un programmino semplice con solo l'accensione dei led singolarmente e anche con numero esadecimale funziona tutto perfettamente!
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

[27] Re: Programma contagiri... ****!

Messaggioda Foto UtenteTardoFreak » 20 mag 2011, 16:45

OK, controlliamo il "case".
Modifica il programma nel modo seguente:

Codice: Seleziona tutto
void interrupt (void);    //Funzione ISR (Interrupt Service Routine)

volatile int rpm=0;               //Variavile globale per i giri del motore
int pippo;

void main()
{

  T0PS1_bit=1;             //Imposto il valore di prescale a 1:8
  TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow
  TMR0IF_bit=1;            //Abilita l'interrupt flag quando viene scatenato l'interrupt per overflow da TMR0
  TMR0ON_bit=1;            //Attiva TMR0

  T1SYNC_bit=1;            //TMR1 external clock input do not synchronization
  TMR1CS_bit=1;            //Sorgente di clock esterna per TMR1 dal pin T1CKI
  TMR1ON_bit=1;            //Attiva TMR1

  PCFG3_bit=1;             //Tutta PORTA come I/O digitali
  PCFG2_bit=1;             //Tutta PORTA come I/O digitali
  PCFG1_bit=1;             //Tutta PORTA come I/O digitali
  PCFG0_bit=1;             //Tutta PORTA come I/O digitali

  trisb=0;                 //PORTB tutta come output
  trisa=0;                 //PORTA tutta come output

  TMR0L=0x7A;              //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
  TMR0H=0x6D;
  TMR1L=0x00;              //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
  TMR1H=0x00;

  IPEN_bit=0;              //Disabilita la priorità degli interrupts
  GIE_bit=1;               //Abilita GIE (General Interrupt Enable)
  PEIE_bit=1;              //Abilita PEIE (Peripheral Interrupt Enable)

  while(1)                 //Ciclo infinito
  {
    // Prova per verifca del funzionamento
    pippo = 3;
    // fine prova
    switch (pippo)
    {
      case 0:                //Caso di motore fermo
        LATB = 0;
        LATA = 0;
        break;
      case 1:                //Caso mille giri al minuto
        LATB = 0x80;
        LATA = 0;
        break;
      case 2:                //Caso 2 mila giri al minuto
        LATB = 0xC0;
        LATA = 0;
        break;
      case 3:                //Caso 3 mila giri al minuto
        LATB = 0xE0;
        LATA = 0;
        break;
      case 4:                //Caso 4 mila giri al minuto
        LATB = 0xF0;
        LATA = 0;
        break;
      case 5:                //Caso 5 mila giri al minuto
        LATB = 0xF8;
        LATA = 0;
        break;
      case 6:                //Caso 6 mila giri al minuto
        LATB = 0xFC;
        LATA = 0;
        break;
      case 7:                //Caso 7 mila giri al minuto
        LATB = 0xFE;
        LATA = 0;
        break;
      case 8:                //Caso 8 mila giri al minuto
        LATB = 0XFF;
        LATA = 0;
        break;
      case 9:                //Caso 9 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x20;
        break;
      case 10:               //Caso 10 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x30;
        break;
      case 11:               //Caso 11 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x38;
        break;
      case 12:               //Caso 12 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3C;
        break;
      case 13:               //Caso 13 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3E;
        break;
      case 14:               //Caso 14 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3F;
        break;
    }
  }
}

void interrupt (void)     //Funzione ISR (Interrupt Service Routine)
{
  if (pir1.TMR0IF)         //Interrupt scatenato da timer0?
  {
    pir1.TMR0IF=0;          //Azzero il bit flag interrupt scatenato da TMR0
    rpm=((int)TMR1L*3)/35;  //Valore TMR1 in variabile rpm (moltiplico il valore di TMR1L per 10 e per 60 per trovare gli impulsi in un minuto poi divido per 7, il valore dei poli dell'alternatore, e infine divido per mille per ricavare un numero intero che varia da 0 a 14)
    TMR0L=0x7A;             //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
    TMR0H=0x6D;
    TMR1L=0x00;             //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
    TMR1H=0x00;
  }


Ora DEVE funzionare, altrimenti c'e' qualcosa che non va ma non a livello di programma.

Ah, puoi usare il clock interno. Ha precisione piu' che sufficiente per la tua applicazione.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[28] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 20 mag 2011, 17:31

Grazie! Comunque appena provato... niente... da lo stesso identico problema di prima!
Poi ora ho notato che il numero esadecimale di LATA era sbagliato! quindi l'ho modificato con:
Codice: Seleziona tutto
void interrupt (void);    //Funzione ISR (Interrupt Service Routine)

volatile int rpm=0;               //Variavile globale per i giri del motore
int pippo;

void main()
{

  T0PS1_bit=1;             //Imposto il valore di prescale a 1:8
  TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow
  TMR0IF_bit=1;            //Abilita l'interrupt flag quando viene scatenato l'interrupt per overflow da TMR0
  TMR0ON_bit=1;            //Attiva TMR0

  T1SYNC_bit=1;            //TMR1 external clock input do not synchronization
  TMR1CS_bit=1;            //Sorgente di clock esterna per TMR1 dal pin T1CKI
  TMR1ON_bit=1;            //Attiva TMR1

  PCFG3_bit=1;             //Tutta PORTA come I/O digitali
  PCFG2_bit=1;             //Tutta PORTA come I/O digitali
  PCFG1_bit=1;             //Tutta PORTA come I/O digitali
  PCFG0_bit=1;             //Tutta PORTA come I/O digitali

  trisb=0;                 //PORTB tutta come output
  trisa=0;                 //PORTA tutta come output

  TMR0L=0x7A;              //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
  TMR0H=0x6D;
  TMR1L=0x00;              //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
  TMR1H=0x00;

  IPEN_bit=0;              //Disabilita la priorità degli interrupts
  GIE_bit=1;               //Abilita GIE (General Interrupt Enable)
  PEIE_bit=1;              //Abilita PEIE (Peripheral Interrupt Enable)

  while(1)                 //Ciclo infinito
  {
    // Prova per verifca del funzionamento
    pippo = 3;
    // fine prova
    switch (pippo)
    {
      case 0:                //Caso di motore fermo
        LATB = 0;
        LATA = 0;
        break;
      case 1:                //Caso mille giri al minuto
        LATB = 0x80;
        LATA = 0;
        break;
      case 2:                //Caso 2 mila giri al minuto
        LATB = 0xC0;
        LATA = 0;
        break;
      case 3:                //Caso 3 mila giri al minuto
        LATB = 0xE0;
        LATA = 0;
        break;
      case 4:                //Caso 4 mila giri al minuto
        LATB = 0xF0;
        LATA = 0;
        break;
      case 5:                //Caso 5 mila giri al minuto
        LATB = 0xF8;
        LATA = 0;
        break;
      case 6:                //Caso 6 mila giri al minuto
        LATB = 0xFC;
        LATA = 0;
        break;
      case 7:                //Caso 7 mila giri al minuto
        LATB = 0xFE;
        LATA = 0;
        break;
      case 8:                //Caso 8 mila giri al minuto
        LATB = 0XFF;
        LATA = 0;
        break;
      case 9:                //Caso 9 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x01;
        break;
      case 10:               //Caso 10 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x03;
        break;
      case 11:               //Caso 11 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x07;
        break;
      case 12:               //Caso 12 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x0F;
        break;
      case 13:               //Caso 13 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x1F;
        break;
      case 14:               //Caso 14 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3F;
        break;
    }
  }
}

void interrupt (void)     //Funzione ISR (Interrupt Service Routine)
{
  if (pir1.TMR0IF)         //Interrupt scatenato da timer0?
  {
    pir1.TMR0IF=0;          //Azzero il bit flag interrupt scatenato da TMR0
    rpm=((int)TMR1L*3)/35;  //Valore TMR1 in variabile rpm (moltiplico il valore di TMR1L per 10 e per 60 per trovare gli impulsi in un minuto poi divido per 7, il valore dei poli dell'alternatore, e infine divido per mille per ricavare un numero intero che varia da 0 a 14)
    TMR0L=0x7A;             //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
    TMR0H=0x6D;
    TMR1L=0x00;             //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
    TMR1H=0x00;
  }
}


Però mi sorge una domanda... non è che ho sbagliato o addirittura dimenticato qualche impostazione iniziale del PIC che magari non conosco? perché con questo programma funziona perfettamente, il numero esadecimale e i led accesi corrispondono!
Codice: Seleziona tutto
void main()
{
trisb=0;
trisa=0;
latb=0xFF; //tutta latb a livello alto
lata=0x01; //primo bit di lata a livello alto
while(1);
}
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

[29] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 20 mag 2011, 20:10

Dopo molte prove escludendo e poi aggiungendo una ad una le impostazioni (quelle prima dello switch) ho scoperto che funziona con tutto eccetto questa riga di codice:
Codice: Seleziona tutto
TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow

Appena viene inserita non funziona niente... perché???
Stò cercando anche sul datasheet... ho provato anche con mettere l'interrupt con priorità alta ma per il momento niente!
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

[30] Re: Programma contagiri... ****!

Messaggioda Foto UtenteDeMonio83924EL » 20 mag 2011, 21:11

Ora ho capito... Guardando il diagramma dell'abilitazione degli interrupt:
io da stupido ||O , ponevo già l'interrupt flag di TMR0 a 1 quindi andava subito all'interrupt!!! e quindi non funzionava niente credo... però ora c'è qualche problemino nella gestione dell'interrupt... perché ho provato ma non funziona... boh! il programma ora è così:
Codice: Seleziona tutto
void interrupt (void);    //Funzione ISR (Interrupt Service Routine)

volatile int rpm=0;               //Variavile globale per i giri del motore


void main()
{

  TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow
  TMR0ON_bit=1;            //Attiva TMR0

  T1SYNC_bit=1;            //TMR1 external clock input do not synchronization
  TMR1CS_bit=1;            //Sorgente di clock esterna per TMR1 dal pin T1CKI
  TMR1ON_bit=1;            //Attiva TMR1

  PCFG3_bit=1;             //Tutta PORTA come I/O digitali
  PCFG2_bit=1;             //Tutta PORTA come I/O digitali
  PCFG1_bit=1;             //Tutta PORTA come I/O digitali
  PCFG0_bit=1;             //Tutta PORTA come I/O digitali

  LATB=0;
  LATA=0;
  trisb=0;                 //PORTB tutta come output
  trisa=0;                 //PORTA tutta come output

  TMR0L=0x2A;              //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
  TMR0H=0xFC;
  TMR1L=0;              //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
  TMR1H=0;

  IPEN_bit=0;              //Disabilita la priorità degli interrupts
  GIE_bit=1;               //Abilita GIE (General Interrupt Enable)
  PEIE_bit=1;              //Abilita PEIE (Peripheral Interrupt Enable)

  while(1)                 //Ciclo infinito
  {
    // Prova per verifca del funzionamento
    rpm = 6;
    // fine prova
    switch (rpm)
    {
      case 0:                //Caso di motore fermo
        LATB = 0;
        LATA = 0;
        break;
      case 1:                //Caso mille giri al minuto
        LATB = 0x80;
        LATA = 0;
        break;
      case 2:                //Caso 2 mila giri al minuto
        LATB = 0xC0;
        LATA = 0;
        break;
      case 3:                //Caso 3 mila giri al minuto
        LATB = 0xE0;
        LATA = 0;
        break;
      case 4:                //Caso 4 mila giri al minuto
        LATB = 0xF0;
        LATA = 0;
        break;
      case 5:                //Caso 5 mila giri al minuto
        LATB = 0xF8;
        LATA = 0;
        break;
      case 6:                //Caso 6 mila giri al minuto
        LATB = 0xFC;
        LATA = 0;
        break;
      case 7:                //Caso 7 mila giri al minuto
        LATB = 0xFE;
        LATA = 0;
        break;
      case 8:                //Caso 8 mila giri al minuto
        LATB = 0XFF;
        LATA = 0;
        break;
      case 9:                //Caso 9 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x01;
        break;
      case 10:               //Caso 10 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x03;
        break;
      case 11:               //Caso 11 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x07;
        break;
      case 12:               //Caso 12 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x0F;
        break;
      case 13:               //Caso 13 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x1F;
        break;
      case 14:               //Caso 14 mila giri al minuto
        LATB = 0xFF;
        LATA = 0x3F;
        break;
    }
  }
}

void interrupt (void)     //Funzione ISR (Interrupt Service Routine)
{
  if (pir1.TMR0IF)         //Interrupt scatenato da timer0?
  {
    pir1.TMR0IF=0;          //Azzero il bit flag interrupt scatenato da TMR0
    rpm=((int)TMR1L*3)/35;  //Valore TMR1 in variabile rpm (moltiplico il valore di TMR1L per 10 e per 60 per trovare gli impulsi in un minuto poi divido per 7, il valore dei poli dell'alternatore, e infine divido per mille per ricavare un numero intero che varia da 0 a 14)
    TMR0L=0x2A;             //Inizializza TIMER 0 reimposto il valore preindicato per stabilire i 100 mS all'interrupt(Fosc=12 MHz)
    TMR0H=0xFC;
    TMR1L=0;             //Azzera TIMER 1 per conteggio asincrono segnale esterno (onda quadra)
    TMR1H=0;
  }
}


Ho provato a fare dei test... ho provato a mettere rpm=2 all'interno della gestione dell'interrupt... ma niente...

Quindi ora la mia domanda è cos'ho sbagliato nella gestione dell'interrupt?! :?:
Grazie!
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti