problema libreria delay

  • StefA
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa - 12 Anni 7 Mesi fa #1 da StefA
problema libreria delay è stato creato da StefA
come da titolo, facendo uso della suddetta libreria, non riesco ad avere dei ritardi superiori ai 3-4 secondi.
Avevo la versione della vecchia libreria e provando con la "nuova" (cioè aggiungendo delay.c e delay.h al progetto) il risultato è il medesimo.
Utilizzo MPLAB v.8.80 e C18 v.3.40
Ho scritto due righe di codice per provare solo la libreria e non mi funzionano, all'inizio i tempi sono rispettati ma poi sono abbastanza casuali.
Sbaglio qualcosa?..Qualcuno può provarla e dirmi se gli funziona?
Grazie a tutti e scusate se magari ho fatto qualche cavolata gigantesca :)
Code:
#include <p18f4550.h> #include <delay.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 Disabilito il watchdog timer //LVP = OFF Disabilito programmazione LVP //PBADEN = OFF Disabilito gli ingressi analogici void main (void){ // Imposto PORTA tutti ingressi LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi LATB = 0x00; TRISB = 0xFF; // Imposto PORTC tutti ingressi LATC = 0x00; TRISC = 0xFF; // Imposto PORTD tutte uscite LATD = 0x00; TRISD = 0x00; // Imposto PORTE tutti ingressi LATE = 0x00; TRISE = 0xFF; setQuartz (20); // Ciclo infinito while (1) { LATD = 0x00; LATDbits.LATD0 = 1; delay_ms(1000); LATDbits.LATD1 = 1; delay_ms(2000); LATDbits.LATD2 = 1; delay_ms(3000); LATDbits.LATD3 = 1; delay_ms(4000); LATDbits.LATD4 = 1; delay_ms(5000); LATDbits.LATD5 = 1; delay_ms(6000); LATDbits.LATD6 = 1; delay_ms(7000); LATDbits.LATD7 = 1; delay_ms(8000); } }

..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Ultima Modifica 12 Anni 7 Mesi fa da StefA.

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: problema libreria delay
Ciao StefA,

oggi ho compilato il programma ed ho verificato il tuo stesso comportamento "strano "
Come soluzione a breve termine direi che ritardi maggiori di 3 secondi e' bene farli come somma di due ritardi.
per esempio per avere dei ritardi di 5 secondi puoi fare:
Code:
delay_ms (3000); delay_ms (2000);

Mi sembra che i sintomi siano tipici di un overflow della variabile, ma ora non sono fresco di testa e mi sembra tutto corretto.
Tutte le variabili sono corrette anche se si potrebbe evitare qualche casting di troppo.
Quando trovo il problema correggero' la libreria.

Grazie della segnalazione.

Saluti,

Mauro

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

  • StefA
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa #3 da StefA
Risposta da StefA al topic Re: problema libreria delay
Ho riscontrato facendo il debug che nel caso limite, delay_ms(10000) basterebbe un "int value" per contene quel valore, però dopo si ha la variabile "reference" (e di conseguenza "mainDelay") che vale 10000*20 (freq del quarzo) = 200000.
Per contenere questo valore serve una variabile "short long" (considerando che non ci interessano i valori negativi si può utilizzare "unsigned short long" con la possibilità di valori max maggiori).
Però se si cambia il tipo di variabile soltanto per "reference" e "mainDelay" e si lascia "int value", la moltiplicazione con "delay_quartz_frequency_value" risulta errata.
Quindi bisogna dichiarare anche "unsigned short long value", bisogna cambiare anche l'intestazione della funzione nel file h in "void delay_ms (unsigned short long value);".
In questo modo sembra funzioni, ovviamente si paga con il passaggio di alcune variabili da 16 a 24 bit.
Per valori di ritardo in millisecondi inferiori ai 3000 funziona benissimo senza modifiche.

..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: problema libreria delay
Ciao StefA,
ora non e' c'e' piu' dubbio, e' un overflow della variabile interna.
Effettivamente questi sintomi "di tempi o valori anomali" dipendono da un overflow che fa ripartire la variabile da zero.

Ho risolto il problema imponendo di usare delay_ms() fino a 1000 ms, ed ho creato una nuova funzione delay_s() che richiama la funzione delay_ms(1000) n volte.

Grazie per il debug e aver condiviso il risultato!

Questo fine settimana riportero' le correzioni in una nuova release della biblioteca per C18, che ora include i commenti per Doxigen.

Saluti,

Mauro

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

  • StefA
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa #5 da StefA
Risposta da StefA al topic Re: problema libreria delay
grazie a te di dedicare tempo a cose "poco" importanti.

Ste

..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]

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

Moderatori: Mauro LaurentiStefA

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