Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programma contagiri... ****!

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

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

Messaggioda Foto UtenteTardoFreak » 20 mag 2011, 22:47

Alura,
Io non so cosa sta capitando perche' a distanza non ho mai lavorato. Rinnovo il suggerimento di andare per gradi quindi, se sei partito da un programma che fa accendere un LED aggiungi un blocco alla volta.
Riparti da zero.
Poi ci metti il case su una variabile qualsiasi e verifichi che funzioni.
Poi fai un altro programma per la base tempi che ti accende e spegne un' uscita ogni volta che la routine di interrupt viene chiamata.
Infine aumenti la complessita' fino ad arrivare al risultato.

Insomma qui ci sono sostanzialmente 3 moduli da verificare uno alla volta:
- Un sistema di visualizzazione che dipende dal valore di una variabile fatto intorno a questo benedetto "switch". Sviluppalo, provalo fino a quando sarai sicuro che funziona.
- Un' interrupt ciclica che genera la base tempi. Fai un programma per vedere se riesci a farla funzionare correttamente. Di solito si mette un istruzione che fa commutare un bit di uscita ogni volta che l' interrupt viene chiamata. con un oscilloscopio puoi verificarne sia il funzionamento che la tempistica e metterli a punto.
- Un timer usato come contatore. Metti a punto questa funzionalita' magari sfruttanto il blocco di visualizzazione per vedere se funziona correttamente.
Quando avrai provato le tre cose distintamente allora, e solo allora, potrai permetterti di metterle insieme.

Di piu' non riesco a fare, dovrei avere il circuito sotto mano, sarebbe questione di pochi minuti. Che vuoi che di ti dica? Sono all' antica, avrei bisogno dell' oggetto e di metterci le mani sopra. :?

I did my best.
"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

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

Messaggioda Foto Utentecrestus » 21 mag 2011, 12:37

cosa magari banale.... ma se non ricordo male quando si scrivono nomi dei registri bisogna scriverli maiuscoli perché il compilatore li interpreta in quella maniera...

quindi pir1.TMR0IF --> PIR1.TMR0IF

però mi chiedo anche questo... se prima definisci GIE_bit per indicare un bi di un registro,
perché poi mi definisci PIR.TMR0IF per indicare quello specifico bit?
non è che c'è un problema di sintassi incorretta?

p.s. sono d'accordissimo con TardoFreak comunque... un pezzo alla volta....e magari uno schema per capire come funziona non sarebbe male...
...:::Pivello allo sbaraglio:::...

MY WEBSITE! come and see... ;) <-- Di nuovo online... spiacente per i problemi tecnici!
Avatar utente
Foto Utentecrestus
1.295 2 7 13
Expert EY
Expert EY
 
Messaggi: 478
Iscritto il: 3 ott 2008, 10:28
Località: studente al politecnico di torino

1
voti

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

Messaggioda Foto UtenteDeMonio83924EL » 21 mag 2011, 15:43

TardoFreak ha scritto:I did my best.
Certo e ti ringrazio tantissimo!! :-) Comunque si ora provo... ma dalle prove che ho fatto fin ora il circuito ed il programma dell'accensione funzionano perfettamente! :-) Ora provo quello dell'interrupt se riesco! :-)
Comunque grazie mille TardoFreak!!
P.S. Concordo con te che è difficile lavorare, risolvere problemi virtualmente!

crestus ha scritto:quindi pir1.TMR0IF --> PIR1.TMR0IF

Provo subito! Grazie!

crestus ha scritto:però mi chiedo anche questo... se prima definisci GIE_bit per indicare un bi di un registro,
perché poi mi definisci PIR.TMR0IF per indicare quello specifico bit?
non è che c'è un problema di sintassi incorretta?

Può essere perché è il mio primo esperimento con i PIC quindi gli errori sono all'ordine del giorno! :-)

Comunque se desideri vedere lo schema per capire di cosa si tratta, lo puoi trovare come allegato sulla prima pagina (di questo argomento) insieme al programma! e ci sono pure delle foto postate!

Grazie dell'interessamento!
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

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

Messaggioda Foto UtenteDeMonio83924EL » 21 mag 2011, 17:27

Ecco ho problemi all'interrupt... no anzi al tmr0 che non mette a 1 il relativo flag quando va in overflow! :( come mai? non va il timer? ho provato con questo semplice programmino. il tmr0 non pone a 1 l'interrupt flag? come è possibile?

Questo è il semplice programmino:
Codice: Seleziona tutto
void interrupt (void);     //Dichiarazione della funzione per la gestione dell'interrupt

volatile int x=0;          //Dichiarazione variabile globale x-->x=0

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

  LATB=0;                  //Tutta LATB a valore sui pin 0
  trisb=0;                 //Tutta LATB come output

  TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow
  T0PS0_bit=0;             //Prescaler 1:2
  T0PS1_bit=0;             //Prescaler 1:2
  T0PS2_bit=0;             //Prescaler 1:2
  PSA_bit=1;               //Prescaler non assegnato
  T0SE_bit=0;              //Incrementa in transizione da basso ad alto dal pin T0CKI
  T0CS_bit=0;              //Sorgente del clock interna (Fosc/4=31,25KHz/4=7,8125KHz)
  T08BIT_bit=0;            //Timer a 16 bit
  TMR0L=0;                 //Tempo rimanente all'interrupt=(1/(Fosc/4))*65536=128uS*65536=8,388608S
  TMR0H=0;                 //Tempo rimanente all'interrupt=(1/(Fosc/4))*65536=128uS*65536=8,388608S
  TMR0ON_bit=1;            //Attiva TMR0
 
  while (1)                //Ciclo infinito
  {
    RB1_bit=x;             //Accensione di RB1 in funzione del valore di x
  }

}

void interrupt (void)      //Gestione interrupt
{
  if (TMR0IF_bit==1)           //L'interrupt è generato dal TMR0?
  {
    TMR0IF_bit=0;          //Poni a 0 la segnalazione di avvenuto overflow
    x=1;                   //Assegna valore 1 alla variabile x
    TMR0L=0;               //Azzera il TMR0
    TMR0H=0;               //Azzera il TMR0
  }
}


Credo sia scritto bene il programma quindi dovrebbe funzionare...

Aggiungo una cosa... se pongo io a 1 l'interrupt flag (TMR0IF_bit=1;) prima dello switc il tutto funziona!
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

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

Messaggioda Foto Utentec1b8 » 22 mag 2011, 12:02

Semplice curiosità, non uso MikroC, ma ha provato così?
Codice: Seleziona tutto
    volatile int x=0;          //Dichiarazione variabile globale x-->x=0

    void interrupt ()      //Gestione interrupt
    {
      if (TMR0IF_bit==1)           //L'interrupt è generato dal TMR0?
      {
        TMR0IF_bit=0;          //Poni a 0 la segnalazione di avvenuto overflow
        x=1;                   //Assegna valore 1 alla variabile x
        TMR0L=0;               //Azzera il TMR0
        TMR0H=0;               //Azzera il TMR0
      }
    }


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

      LATB=0;                  //Tutta LATB a valore sui pin 0
      trisb=0;                 //Tutta LATB come output

      TMR0IE_bit=1;            //Abilita l'interrupt su TMR0 quando avviene l'overflow
      T0PS0_bit=0;             //Prescaler 1:2
      T0PS1_bit=0;             //Prescaler 1:2
      T0PS2_bit=0;             //Prescaler 1:2
      PSA_bit=1;               //Prescaler non assegnato
      T0SE_bit=0;              //Incrementa in transizione da basso ad alto dal pin T0CKI
      T0CS_bit=0;              //Sorgente del clock interna (Fosc/4=31,25KHz/4=7,8125KHz)
      T08BIT_bit=0;            //Timer a 16 bit
      TMR0L=0;                 //Tempo rimanente all'interrupt=(1/(Fosc/4))*65536=128uS*65536=8,388608S
      TMR0H=0;                 //Tempo rimanente all'interrupt=(1/(Fosc/4))*65536=128uS*65536=8,388608S
      TMR0ON_bit=1;            //Attiva TMR0
     
      while (1)                //Ciclo infinito
      {
        RB1_bit=x;             //Accensione di RB1 in funzione del valore di x
      }

    }


Probabilmente non cambia nulla, ma volevo solo togliermi un dubbio...
Fammi sapere...
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

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

Messaggioda Foto UtenteDeMonio83924EL » 22 mag 2011, 13:48

Vi informo che ci sono riuscito!

Il problema era nel TMR0 utilizzato come timer 16bit... allora ho risolto il problema utilizzando la modalià 8bit :ok: l'ho provato e l'interrupt funziona!! ora non resta che provare il TMR1 se funziona!

Grazie mille a tutti!! non ce l'avrei mai fatta senza di voi!! Grazie!!!!!!!! ^_^
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

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

Messaggioda Foto UtenteDeMonio83924EL » 22 mag 2011, 13:56

c1b8 ha scritto:Probabilmente non cambia nulla, ma volevo solo togliermi un dubbio...
Fammi sapere...


Allora ho provato così ma non funziona! comunque grazie dell'interessamento! :-)
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

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

Messaggioda Foto UtenteTardoFreak » 22 mag 2011, 13:57

No, il problema non e' quello. Non ha senso che Timer0 funzioni a 8 bit e non a 16. Puo' essere un problema di tempi. Per andare in overflow con 8 bit bastano 256 conteggi, a 16 bit ne servono 65536, quindi 256 volte tanto.
Dimmi due cose importanti:
- Che sorgente di clock utilizza (Tcy o cosa)?
- A quanto e' impostato il prescaler?
"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

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

Messaggioda Foto UtenteDeMonio83924EL » 22 mag 2011, 14:03

TardoFreak ha scritto:- Che sorgente di clock utilizza (Tcy o cosa)?
- A quanto e' impostato il prescaler?

Utilizza il ciclo interno e il prescaler era 1:1... comunque avevo fatto delle prove scrivendo:
Codice: Seleziona tutto
while (1)                //Ciclo infinito
  {
    if (TMR0L>1)         //Verifica che il timer conti
    RB1_bit=1;             //Accensione di RB1
  }

E così contava! ma quando ho scritto anche il bit alto niente più!

Codice: Seleziona tutto
while (1)                //Ciclo infinito
  {
    if (TMR0H>1)
    RB1_bit=1;             //Accensione di RB1
  }


Comunque ora è impostato come 8 bit con prescaler 1:4 e funziona perfettamente l'interrupt! :-)
Avatar utente
Foto UtenteDeMonio83924EL
78 3 7
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 24 ott 2009, 23:02

0
voti

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

Messaggioda Foto UtenteTardoFreak » 22 mag 2011, 14:09

Insisto che non ha senso tutto questo quindi delle tre una:
- C'e' qualcosa che sfugge nel programma
- E' un baco di mikroC
- E' un baco nel silicio.
"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

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti