spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Elettronica > E. Digitale

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 20-08-2007, 14.40.14
anna.lipari anna.lipari non è collegato
Robottaro senior
 
Data registrazione: 06-06-2007
Residenza: Milano
Messaggi: 34
Potenza reputazione: 52
anna.lipari E' per ora ancora un mistero
Predefinito pic18f452 modulo CCP

Ciao ragazzi, come sono andate le vacanze ??
Io sono già ritornata e ho bisogno del vostro aiuto !!!!
Per favore non mi mandate a quel paese !
Vi volevo sottoporre un il codice che ho scritto che dovrebbe creare un'onda quadra con periodo 20ms e che sta alta per un tempo che decido io mediante la variabile Alto. (come avrete capito devo pilotare un servo :-) )
Purtroppo questo codice non mi funziona. Il periodo di 20ms è giusto ma dovrebbe stare alto 1ms e non lo fa. Mi potete delucidare ???
Cosa sbaglio ????

Codice:
#include <p18f452.h>

#pragma config OSC = HS         // 20Mhz
#pragma config WDT = OFF         // disattivo il watchdog timer
#pragma config LVP = OFF         // disattivo la programmazione LVP

unsigned int Alto;


void High_Int_Event (void); 


#pragma code high_vector = 0x08   

void high_interrupt (void)
{
  _asm goto High_Int_Event _endasm
}

#pragma code
#pragma interrupt   High_Int_Event

void High_Int_Event(void)
{
  if(PIR1bits.TMR1IF)
  {
    PIR1bits.TMR1IF = 0;        // Azzero l' interrupt
     T1CONbits.TMR1ON = 0;        // Blocco il timer1
    TMR1L = 0x30;
    TMR1H = 0xCF;                // carica 20ms nel timer
    CCP1CON = 0;                // resetto il modulo CCP per mandare a 0 l' uscita
    CCPR1L = Alto & 0x00FF;
    CCPR1H = Alto >> 8;
    CCP1CON = 0b00001001;        // 1001 
    T1CONbits.TMR1ON = 1;
  }
}



void main(void)
{
    
    TRISC = 0b11111011;        // RC2 è un'uscita
    PORTC = 0x00;
    
    T3CON = 0b00000000;
    CCP1CON = 0b00001001;
    T1CON = 0b10110001;        // Timer 1, prescaler 1:8, clock interno


    INTCON = 0;                // disattiva tutti gli interrupt
    PIE1bits.TMR1IE  = 1;    // Interrupt quando TMR1 va in overflow    
    INTCONbits.GIE   = 1;      // attiva l'interrupt    
    INTCONbits.PEIE  = 1;     // attiva gli interrupt periferiche

         while(1)
        {
        Alto = 5045;       // 1 ms
        }                    // end while    
}                            // end main
Un bacio

Anna Lipari
Rispondi citando
  #2  
Vecchio 20-08-2007, 16.47.47
Fu Mauro Fu Mauro non è collegato
Robottaro master
 
Data registrazione: 03-07-2006
Residenza: Norimberga (Germania)
Messaggi: 440
Potenza reputazione: 186
Fu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua fama
Predefinito

Ciao,
non ho letto con attenzione il codice quindi non poso dire cosa sia realmente errato ma mi e' saltato agli occhi che hai fatto uso degli interrupt ad alta priorita' (vettore interruzione 0x08) ma non abiliti i bit alta interruzione delle periferiche.

Personalmente visto che comunque hai una sola periferica puoi usare il vettore d'interruzione 0x18 e usare la direttiva #pragma interruptlow invece di #progma interrupt .

In questo modo l'abilitazione delle periferiche e delle interruzioni che hai fatto lavoreranno propriamente.


Ciao,

Mauro
__________________
www.LaurTec.it

Artorius Humanoid Robot, Robot Domotino, C18, USB, PIC, Elettrocardiografo...e molto altro
Rispondi citando
  #3  
Vecchio 20-08-2007, 18.17.07
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Robottaro sostenitore
 
Data registrazione: 18-03-2004
Residenza: Roma
Età : 60
Messaggi: 3,377
Potenza reputazione: 350
astrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da anna.lipari Visualizza messaggio
Purtroppo questo codice non mi funziona. Il periodo di 20ms è giusto ma dovrebbe stare alto 1ms e non lo fa. Mi potete delucidare ???
Non funziona perchè il valore che carichi nel CCP è sbagliato.
Come puoi pensare di ottenere un match se nel timer carichi 0xFC30 (53040), che poi va a salire fino 0xFFFF, mentre il valore di ALTO è solo 5045 ?
Non tenere conto di quello che ha detto Fu Mauro perchè è sbagliato, sui PIC18 di default è attivo l'interrupt ad alta priorità, quello low è inattivo, non devi settare nulla.
Devi preoccuparti dei vari flag low/high solo se vuoi usare tutte e due le priorità, comunque la tua inizializzazione per l'interrupt è corretta.
__________________
Bye
Rispondi citando
  #4  
Vecchio 21-08-2007, 10.43.20
Fu Mauro Fu Mauro non è collegato
Robottaro master
 
Data registrazione: 03-07-2006
Residenza: Norimberga (Germania)
Messaggi: 440
Potenza reputazione: 186
Fu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua fama
Predefinito

Ciao,
Come dice astrobeed ti devi preoccupare dei bit di interrupt soprattutto quando usi i due livelli alta e bassa priorita’ ma questo deriva personalmente da una non snellissima implementazione degli interrupt in C18. Diversamente da quanto ha detto astrobeed gli interrupt ad alto livello sono per i PIC18 disattivi dopo il reset (IPEN vale 0) e questo garantisce la compatibilita’ con i PIC mid-range devices. Come hai potuto vedere nel tuo programma pur mischiando le carte alta priorita’ e bassa priorita’ le cose funzionano....senza che il compilatore dica nulla! Questo a mio avviso e’ un limite del compilatore.
Per alta priorita’ dovresti usare GIEH e GIEL per abilitare gli interrupt. Il programma funziona e non ottieni nessuna warning poiche’ GIEH e GIEL coincidono con GIE e PEIE. Sintatticamente C18 non dice nulla, anche se dovrebbe, poiche’ stai usando i flag bassa priorita’ per controllarne una ad alta precedentemente dichiarata con la direttiva. #pragma interrupt
...puoi provare a cambiare #pragma interrupt con #pragma interruptlow (senza toccare 0x08) e le cose funzionano...! Il compilatore non reclamera’! ...anche se dovrebbe!
Persalmente ritengo che il C18 non dia sufficienti warnig al riguardo...ed infatti usando tutte e due i livelli d’interrupt sei costretta a settare i bit giusti...il compilatore non ti dara’ molti aiuti! Personalmente cambierei la tua inizializzazione poiche’ funziona ma non sintatticamente corretta.... J

Ciao

Mauro
__________________
www.LaurTec.it

Artorius Humanoid Robot, Robot Domotino, C18, USB, PIC, Elettrocardiografo...e molto altro
Rispondi citando
  #5  
Vecchio 21-08-2007, 15.26.12
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Robottaro sostenitore
 
Data registrazione: 18-03-2004
Residenza: Roma
Età : 60
Messaggi: 3,377
Potenza reputazione: 350
astrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da Fu Mauro Visualizza messaggio
...puoi provare a cambiare #pragma interrupt con #pragma interruptlow (senza toccare 0x08) e le cose funzionano...! Il compilatore non reclamera’! ...anche se dovrebbe!
Stai totalmente travisando le cose, i nomi da dare agli interrupt non sono pressegnati, posso benissimo chiamare Pippo quello di alto livello e Ciccio quello di basso livello e non c'è nessun motivo per cui il compilatore deve darrmi una warning.
Chi decide realmente la priorità dell'interrupt nella sua dichiarazione è l'indirizzo fisico del vettore d'interrupt che assegni tramite la pragma code, cioè dai un indirizzo fisico di memoria al seguente nome simbolico, qualunque questo sia.
Il fatto che solitamente si mette high_interrupt, o low_interrupt, anche nella "#pragma code" è solo per chiarezza quando si legge il programma, ma non ne è un must e tantomeno un obbligo.

Citazione:
Personalmente cambierei la tua inizializzazione poiche’ funziona ma non sintatticamente corretta....
L'inizializzazione di Anna è corretta sia sintatticamente che come operazioni eseguite.
__________________
Bye
Rispondi citando
  #6  
Vecchio 22-08-2007, 08.59.41
Fu Mauro Fu Mauro non è collegato
Robottaro master
 
Data registrazione: 03-07-2006
Residenza: Norimberga (Germania)
Messaggi: 440
Potenza reputazione: 186
Fu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua fama
Predefinito

Ciao,
credo ci sia un incomprensione di quanto ho scritto, nel mio testo non ho mai nominato il nome delle funzioni di gestione che naturalmente possono avere qualunque nome in quanto funzioni.

Quello che ho detto e ripeto:

...puoi provare a cambiare #pragma interrupt con #pragma interruptlow (senza toccare 0x08) e le cose funzionano...! Il compilatore non reclamera’! ...anche se dovrebbe!

Che e’ ben diverso! La parola interrupt e interruptlow sono due parole chiave della direttiva pragma come lo e’ la parola code.

Non e’ vero che chi decide il livello di interrupt e’ il vettore d’interruzione. Questo e’ vero a livello hardware ma non in C18. La direttiva #pragma code permette di posizionarti in una posizione di memoria e non e’ usata solo per gli interrupt.
Chi decide se la funzione sara’ ad alta o bassa priorita’ e’ la direttiva #pragma intterrrupt... e #pragma interruptlow....

Se come hai detto cambi #pragma Pippo.... il compilatore funzionera’ ma avrai una warning che dira’ che Pippo non e’ riconosciuto. Il compilatore creerà alla fine l’hex ma in realta’ senza la funzione d’interrupt poiche’ non trovera’ #pragma interrupt o interruptlow.

Dal momento che sono queste due direttive a decidere il livello d’interrupt come ho detto il compilatore dovrebbe avvisare se il vettore d’interruzione non e’ corretto.

Come detto il codice di Anna (che per altro mi sorprende ogni volta con le sue conoscenze) funziona ma come scritto anche dai comment

INTCONbits.GIE = 1; // attiva l'interrupt INTCONbits.PEIE = 1; // attiva gli interrupt periferiche


La seconda linea attiva GIEL e non le periferiche. Questo discende dal fatto che sono attivi gli intterupt alti. C18 a questo proposito non segue completamente il datasheet che dice di settare GIEH e GIEL ( a seconda delle necessita’) anche se poi questi sono equivalenti a GIE e PEIE poiche’ fisicamente gli stessi bit dello stesso registro.

Credo che ora la Anna sia confusa per questo rimanderei alla lettura:

Del paragrafo interrupt del data sheet (solo le prime 2-3 pagine)
La guida Getting started (per la direttiva pragma 2-3 pagine)
User Guide (per seguire i riferimenti della getting Starded 1-2 pagine)

Ciao,

Mauro
__________________
www.LaurTec.it

Artorius Humanoid Robot, Robot Domotino, C18, USB, PIC, Elettrocardiografo...e molto altro
Rispondi citando
  #7  
Vecchio 22-08-2007, 09.53.45
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Robottaro sostenitore
 
Data registrazione: 18-03-2004
Residenza: Roma
Età : 60
Messaggi: 3,377
Potenza reputazione: 350
astrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua famaastrobeed La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da Fu Mauro Visualizza messaggio
Che e’ ben diverso! La parola interrupt e interruptlow sono due parole chiave della direttiva pragma come lo e’ la parola code.
Ok, su questo sono d'accordo.

> Chi decide se la funzione sara’ ad alta o bassa priorita’ e’ la direttiva >pragma intterrrupt... e #pragma interruptlow....

No chi lo decide è l'hardware, dal punto di vista del compilatore non esiste nessuna differenza tra interrupt low e high, per lui sono solo due funzioni diverse, sarà poi il micro a decidere quale invocare a seconda dell'interrupt attivato.
Il motivo per cui anche scrivendo interruptlow al posto di high il compilatore non da nessun errore o warning è molto semplice, nulla vieta di riposizionare i vettori di interrupt, come avviene nel caso di un bootloader, pertanto il compilatore non ha alcun modo di sapere a cosa corrisponde esattamente l'indirizzo fisico utilizzato.

Esempio pratico di codice con interrupt riallocato.

/* ridefinizione vettori di interrupt spiazzati a 0x2000 */
#pragma code _HIGH_INTERRUPT_VECTOR = 0x002008
void _high_ISR (void)
{
_asm
goto ComRTxDat // jump to interrupt routine
_endasm
}

#pragma code
#pragma interrupt ComRTxDat // definisce ComRTxDat come ISR

Codice che uso regolarmente nei mieri programmi quando ho un bootloader presente, in questo caso l'indirizzo iniziale è 0x2000.

Ora dimmi come può il compilatore dire a priori che la #pagma interrupt fa riferimento ad un indirizzo sbagliato ?
Ovviamente nel caso in questione si presuppone che in qualche modo all'interno dei reali indirizzi per i due vettori di interrupt vi siano dei salti ai nuovi indirizzi.


Citazione:
Come detto il codice di Anna (che per altro mi sorprende ogni volta con le sue conoscenze) funziona ma come scritto anche dai comment
INTCONbits.GIE = 1; // attiva l'interrupt
INTCONbits.PEIE = 1; // attiva gli interrupt periferiche

La seconda linea attiva GIEL e non le periferiche.

Non credo proprio, la seconda linea attiva tutti gli interrupt di periferica, questo proprio perchè sono attivi solo gli interrupt HIGH, diventa GIEL, come operativitò, quando viene attivata la modalità a due livelli, cioè con IPEN = 1, però per default è 0 sia all'accensione che in seguito ad un reset.
Se preferisci possiamo pure dire che con IPEN=0 è disattivata la modalità a due interrupt e si è in modalità compatibile con la serie 16, però tale modalità in realtà, come dice la stessa Microchip nei suoi seminari, corrisponde alla modalità interrupt high da un punto di vista hardware.
__________________
Bye
Rispondi citando
  #8  
Vecchio 22-08-2007, 10.02.41
Fu Mauro Fu Mauro non è collegato
Robottaro master
 
Data registrazione: 03-07-2006
Residenza: Norimberga (Germania)
Messaggi: 440
Potenza reputazione: 186
Fu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua famaFu Mauro La sua reputazione è oltre la sua fama
Predefinito

Ciao,
La warning non e' un errore e' come per il cast...
alcune volte fai la divisione fra interi per perdere i decimali. La warning ti avverte che forse qualcosa potrebbe non andare.

Il fatto dei bootloader e' ok.

Le warning sono spesso a discrezione della societa' che fa il compilatore.

Per i GIEH e GIEL abbiamo solo due punti di vista diversi nella scrittura del codice.

...ma credo che ora siamo sulla stessa barca!

Ciao,

Mauro
__________________
www.LaurTec.it

Artorius Humanoid Robot, Robot Domotino, C18, USB, PIC, Elettrocardiografo...e molto altro
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Modulo GSM. Ziko Comunicazione 2 18-01-2013 17.37.16
Modulo LCD Alan100 Arduino 7 28-12-2012 18.21.38
PIC18F452 come Voltometro digitale AloneInTheDark Elettronica 0 20-05-2009 09.48.29
pic18f452, seriale software, hitec picc18 lucapgt E. Digitale 0 19-06-2007 13.29.05
problema con porta pic18f452 Marco P. in C, C++ 5 29-01-2003 13.21.00


Tutti gli orari sono GMT. Adesso sono le: 02.44.57.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB