Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

delay_ms e timer

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] delay_ms e timer

Messaggioda Foto Utentempeino » 19 set 2013, 1:22

Sto lavorando a un programma do ve ho bisogno di una temporizzazione di 10ms.

qualcuno potra dirmi che ci sono funzioni tipo delay_ms() ma io voglio provare a usare i timer.
Un amico mi ha suggerito questa funzione:

Codice: Seleziona tutto
void mio_delay(unsigned int ms)
{
   while (ms > 0)
   {
      // esegui un ritardo calibrato di 1ms col timer
      ms --;
   }
}


ma per fare partire il ritardo di 1ms dovrei fare partire il TMR0 nella funzione mio_delay(),
ma questo non si può fare. :(

vi chiedo se ci sono dei modi per aggirare l'ostacolo.

Massimo
Avatar utente
Foto Utentempeino
590 4 10
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 27 mar 2011, 18:21

0
voti

[2] Re: delay_ms e timer

Messaggioda Foto Utentesimo85 » 19 set 2013, 2:30

mpeino ha scritto:qualcuno potra dirmi che ci sono funzioni tipo delay_ms()

Si, esistono le classiche funzioni delay_ms, delay_us etc..

Il nome è convenzionale in quanto può chiamarsi per esempio Delay_ms o diversamente dipendendo dalla unità di misura di tempo. Dipende da quale compilatore stai usando e da come è stata dichiarata nella libreria in uso.

Dal codice che hai riportaro sembra tu voglia ottenere un ritardo sfruttando l' overflow ciclico del timer.
Si, il procedimento è sulla strada giusta ma ricorda che il tempo di incremento e decremento del valore di registro del timer dipende dalla frequenza dell' oscillatore di sistema. Ora è tardi se vuoi e se ne hai bisogno, appena ho un po' di tempo te lo spiego o vedo di cercare qualche riferimento approfondito in qualche articolo del forum.

Tornando alle funzioni delay precompilate, se usi una funzione delay_ms ti devi solo occupare di richiamarla con un argomento valido.
Se per esempio nel tuo firmware usi tale funzione per un ritardo di 1ms scriverai:
Codice: Seleziona tutto
delay_ms(1);

Per il resto fa tutto lei quindi non devi implementare nessun ciclo, a meno che tu voglia ottenere un ritardo più lungo fuori dalla sua singola portata, in quel caso la si richiama N volte all' interno di un ciclo.

Se vuoi usare il timer, devi assegnare un valore al registro del timer (in questo caso il timer 0 TMR0). Il valore del timer viene poi decrementato o incrementato (dipende dall'architettura del microcontrollore) fino a che va in overflow, momento in cui finisce il ritardo. Qui si ritorna al discorso della frequenza di sistema di cui ti ho accennato in precedenza.

Ad ogni modo è preferibile l'uso dei timer perché in questo modo si riduce notevolmente il numero di istruzioni eseguite e di conseguenza l'impiego della CPU, in quanto non si devono usare istruzioni di incremento o decremento dipendendo dalla frequenza dell' oscillatore di sistema come in una funzione come la delay_xx.

Di nuovo, se hai bisogno di un ritardo o una temporizzazione di un tempo non possibile con un solo overflow del timer, ripeti il tutto dentro ad un ciclo come appunto immagino volevi rappresentare con il codice riportato.

In più, mentre il timer è in funzione si può, eventualmente, fare altro, cosa non normalmente possibile con una funzione delay_xx.

Se in aggiunta spieghi con quale microcontrollore stai lavorando, ovviamente si può dire qualcosa di più preciso.

Se c'è qualcosa che no ti è chiaro chiedi pure.

Ciao.
Simo
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9928
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: delay_ms e timer

Messaggioda Foto Utentempeino » 19 set 2013, 9:06

So bene che ci sono le funzioni delay_ms le ho gia usate ma questo progetto preferirei utilizzare i timer.
Codice: Seleziona tutto
#define OUT_PIN PORTB.B0
#define OUT_PIN_DIRECTION TRISB.B0

void interrupt();
void miodelay_ms();

void main() {
OPTION_REG=0b00000001;
INTCON=0b10100000;
OUT_PIN_DIRECTION =0;
TRISA=0;

miodelay_ms();
while (1) {
}
}

void miodelay()
{
TMRO = 8;   //ERRORE
}


void interrupt()
{
  if(T0IF){

  OUT_PIN=OUT_PIN^1;
  INTCON.T0IF=0 ;
}
}


questo codice mi da errore perche non posso attivare il timer0 da una funzione che non sia main()

Come posso aggirare l'ostacolo.

Massimo
Avatar utente
Foto Utentempeino
590 4 10
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 27 mar 2011, 18:21

0
voti

[4] Re: delay_ms e timer

Messaggioda Foto UtenteShockwaver » 19 set 2013, 9:23

??
Ti dispiacerebbe indicare che microcontrollore usi e fare un copia incolla del messaggio di errore?
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[5] Re: delay_ms e timer

Messaggioda Foto Utentempeino » 19 set 2013, 9:41

il PIC è il 16f628

l'errore è:

0 360 Unresolved extern 'miodelay_ms' timer.c
0 360 Unresolved extern 'miodelay_ms' timer.c
0 102 Finished (with errors): 19 set 2013, 09:33:36 timer.mcppi

il codice esposto è completo
il compilatore è il MikroC

ciao e grazie
Massimo
Avatar utente
Foto Utentempeino
590 4 10
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 27 mar 2011, 18:21

1
voti

[6] Re: delay_ms e timer

Messaggioda Foto UtenteShockwaver » 19 set 2013, 9:52

Il problema non è nel timer ma nel fatto che il prototipo e la chiamata a funzione sono definite come miodelay_ms mentre l'intestazione vera e proprio della funzione è miodelay.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[7] Re: delay_ms e timer

Messaggioda Foto Utentesimo85 » 19 set 2013, 12:20

mpeino ha scritto:So bene che ci sono le funzioni delay_ms le ho gia usate (..)

OK, allora dovuto alla tarda ora ho interpretato male.

Scusa..

O_/
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9928
Iscritto il: 30 ago 2010, 4:59

0
voti

[8] Re: delay_ms e timer

Messaggioda Foto Utentempeino » 20 set 2013, 20:15

OK, allora dovuto alla tarda ora ho interpretato male.

anche io se hai notato ho fatto un casino

Scusa..


ma non lo dire nemmeno per scherzo.
Grazie di avermi risposto anche a quell'ora.

ciao Massimo
Avatar utente
Foto Utentempeino
590 4 10
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 27 mar 2011, 18:21

0
voti

[9] Re: delay_ms e timer

Messaggioda Foto Utentempeino » 20 set 2013, 20:21

accidenti ero cosi convinto che non si poteva far partire il timer da una funzione che non sia main()
che non ho guardato il resto pensando che fosse un errore di concetto e invece era un errore di distrazione .

grazie Foto UtenteShockwaver

ciao Massimo.
Avatar utente
Foto Utentempeino
590 4 10
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 27 mar 2011, 18:21


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti