- Messaggi: 1222
- Ringraziamenti ricevuti 104
problema libreria delay
- StefA
-
Autore della discussione
- Moderatore
-
Less
Di più
12 Anni 7 Mesi fa - 12 Anni 7 Mesi fa #1
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
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
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.
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:
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
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
-
Less
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
12 Anni 7 Mesi fa #3
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
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.
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.
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
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
-
Less
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
12 Anni 7 Mesi fa #5
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Re: problema libreria delay
grazie a te di dedicare tempo a cose "poco" importanti.
Ste
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 Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti