Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC 18F252

Ciao a tutti, sono nuovo di questo newsgroup che mi sembra molto
interessante....
Vorrei sapere se c'č qualcuno che puņ aiutarmi nella programmazione in c di
questo tipo di pic.
In particolar modo come funziona l'Interrupt e il Timer0...
Grazie in anticipo...
                                    Gennaro

                                     Gennaro
Ciao!
se vuoi posso aiutarti...cosa dovresti fare?
Mauro

devo prelevare un segnale digitale (e ci sono)... e far fare al pic
un'integrazione numerica di tale segnale ...
ed è quì il problema.... perchè avendo a disposizione questi segnali... non
riesco a gestire ne il tempo....ne riesco ad avre il controllo sugli
interrupt....
come faccio?

 ha scritto nel messaggio 
news:42341ab8$0$32354$5fc...@news.tiscali.it...


 ed č quě il problema.... perchč avendo a disposizione questi segnali...


si il segnale è digitale.....
cmq ora che ci penso...mi ha fatto venire in mente questo....
io ho in'interrupt ogni volta che mi si presenta una variazione di velocità
...e ho circa 200 campioni al secondo....
secondo quello che mi hai fatto notare dovrebbe funzionare così...
t                    velocità                          spazio
0                       0                 = 0*0 =0
: il trespolo è fermo sul punto di partenza
5msec               2 m/sec       = (2-0) * 5E-3 = 1cm
: il trespolo si è mosso e ha percorso 1cm
10msec            1 m/sec        = (1-2) * 10E-3 +1 cm = 1.1cm
: il trespolo si è mosso ancora nello stesso verso di prima ma con velocità
più piccola
15msec            -2m/sec        =(-2-1) * 15E-3 + 1.1cm = -3.4cm          :
il trespolo si è mosso nel verso contrario  e si trova a -3.4cm dal punto di
partenza
20msec            3m/sec        = (3-(-2))*20E-3 + (-3.4)cm = 8.6cm        :
il trespolo si è spostato ancora nel verso contrario al precedente e si
trova a 8.6cm
25msec            0m/sec        = (0-3)*25E-3 + 8.6cm = 11.1cm
: il trespolo si è fermato e si trova a 11.1cm dall'origine
30msec            0m/sec        = (0-0)*30E-3 + 11.1cm
: il trespolo è fermo ad 11.1cm dall'origine
e così via....andrebbe anche bene in teoria e ora provo a metterlo in
pratica....
ti faccio notare che i valori di velocità nn sono tanto coerenti perchè se
in 5 msec ci spostiamo passiamo da 2 a 1 m
/sec vuol dire che la nostra decelerazione è di (1-2)/5E-3 = -20m/(sec2)
=+- 2g .... forse è un pò assurdo....
però l'importante è che il ragionamento funzioni...infatti allo scorrere del
tempo se il brico si ferma o cambia direzione lo spazio percorso viene
aggiustato nel senso corretto...e credo che così ci siamo...
che ne dici?

ok....credo che farò cosi'....
ma il timer lo faccio partire prima o dopo dell'interrupt? o deve essere
sempre attivo?  e quando lo resetto??
oppure devo controllare gli interrupt con il timer?  c'è un legame tra i
due....?

 ha scritto nel messaggio 
news:423445f4$0$32336$5fc...@news.tiscali.it...


scusami ma nn mi tornano i conti...
allora il mio pic ha un clk di 40MHz.... => Tclk = 1/40MHz = 0,025 us => se
nn ho capito male il PIC esegue una istruzione ogni 4 cicli di clk giusto?
=> Tmacchina = 4 * 0,025 =  0,1 usec  => 10.000.000 di istruzioni al sec ...
giusto?
ora... nel programma ho questa stringa....ha dimenticavo che nn conosci il
C18....cmq no problem, in fondo trovi la spiegazione...
OpenTimer0(TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT )
significa che il il timer abilita l'interrupt giusto ( TIMER_INT_ON)?
signifca che utilizza il clock interno e quindi il 40MHz?
significa che conta da 0 a 2^16 ?
/* ----------------------------
void OpenTimer0( unsigned char config );
Arguments: config
A bitmask that is created by performing a bitwise AND operation ('&') with a
value from each of the categories listed below.
Enable Timer0 Interrupt:
    TIMER_INT_ON Interrupt enabled
    TIMER_INT_OFF Interrupt disabled
Timer Width:
    T0_8BIT 8-bit mode
    T0_16BIT 16-bit mode
Clock Source:
    T0_SOURCE_EXT External clock source (I/O pin)
    T0_SOURCE_INT Internal clock source (TOSC)
External Clock Trigger (for T0_SOURCE_EXT):
    T0_EDGE_FALL External clock on falling edge
    T0_EDGE_RISE External clock on rising edge
eccc...
-------- */
poi il fatto che nel pragma code ho la stringa
if(INTCONbits.TMR0IF == 1)
significa che l'interrupt avviene quando il TIMER0 è andato in overflow?
cioè quando ha contato fino a 2^16?
quindi ho un'interrupt ogni 2^16 * Tclk giusto?
quindi tra un'interrupt e l'altro io devo
    - leggere la velocità
    - calcolare lo spazio percorso
    - inviarlo in seriale
e se nn ce la faccio? , c'è un modo per fermare il TIMER all'inizio
dell'elaborazione e farlo ripartire alla fine da dove ha terminato???
cmq...grazie mille...sei un grande....

 ha scritto nel messaggio 
news:42347190$0$6296$5fc...@news.tiscali.it...


        TMR0H=(0xff-1);                // ricordati che conta a ritroso
VALORI CORRETTI
          TMR0L=(0xff-0x35);
          TMR0H=(0xff-0xc);                // ricordati che conta a ritroso


ok ho quasi capito....
quindi il timer non conta in avanti ma indietro....giusto?
il mio prescaler al momento vale 1 e la frequenza del quarzo č 40MHz....
quindi ho abilitato il timer a contare da FFFF a 0000 ogni
(40/4)/1 = 10 MHz --->>> ogni 0.1 usec    giusto?
io voglio che ogni 2msec arriva a 0 quindi 2000/0.1 = 20000(4E20)  giusto?
quindi quando il timer raggiunge lo 0 io ho a disposizione un nuovo
dato....giusto?
forse ho capito....  :)

scusami una domanda teorica.....
se nn ho capito male, la situazione č questa :
il timer0  conta a ritroso da un valore x fino a 0 --->> va in
overflow --->> genera un'interupt che chiama una funzione...
Domanda : questa funzione ha il controllo esclusivo del pic fino a che il
timer0 nn va di nuovo in overflow?  se č cosě sono a cavallo!!!
e nn ci puň essere nulla che la blocchi o subentri al suo posto?
grazie ancora...

ok ci sono...grazie mille....
domani ci provo e ti faccio sapere....!!!!

 ha scritto nel messaggio
news:42344733$0$6309$5fc...@news.tiscali.it...

E' la routine stessa del timer che fa ripartire il timer :
fai partire il timer
arriva l'INT che salta alla routine timer
    analizzi i dato
    se c'è variazione "fai cio che devi fare"
    riarma il timer
E' un idea... il 18F252 lo sto usando da 15 giorni e con i PIC sono in
partenza ora... quindi nn conosco molto i particolari
Ma dalla tua domanda mi viene da suggerirti che:
Il timer ... genera un interrupt che ti fa saltare ad una locazione
specifica se abilitato ovviamente... da li deve partre la tua routine
di cose che devovo essere eseguite allo scadere del timer
Normalmente il  "legame " è così.
poi dipende ache da cosa vuoi fare una volta riconosciuto il segno...
se devi fare un paio di operazioni è OK
se devi fare una serie di cose che sicuramente impiegano piu tempo
dell' arrivo del prossimo Int del timer, è un po piu complesso...
Ciao
ALX