Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema tmr0 PIC 16lf1783

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Problema tmr0 PIC 16lf1783

Messaggioda Foto Utentephase » 30 giu 2014, 18:15

Ciao a tutti! O_/

Ho un problema con il tmr0 del PIC in oggetto (datasheet).

Il codice che sto utilizzando è questo:

Codice: Seleziona tutto
#include <xc.h>

#pragma config FOSC = INTOSC
#pragma config LVP  = OFF
#pragma config WDTE = OFF

unsigned char blink=1;

#define _XTAL_FREQ 8000000
#define LEDTX PORTAbits.RA0

void Interrupt(void);
void intmr0(void);

void Interrupt(void){
   if(INTCONbits.TMR0IF){
      INTCONbits.TMR0IF = 0;
      TMR0  = 6;
      PORTAbits.RA0 = blink;
      blink = ~ blink;
      INTCONbits.GIE = 1;
   }
}

void intmr0(void){
   OPTION_REG    = 0x81;
   TMR0       = 6;
   INTCONbits.TMR0IF = 0;
   INTCONbits.TMR0IE = 1;
}

void main(void) {
    OSCCON = 0x72;      //sel. clock - 8MHz

    OPA1CON = 0xC0;      //abil. opa1 con ni su RA5

     INTCONbits.GIE = 1;
   INTCONbits.PEIE = 1;
   INTCONbits.INTE = 0;   
   INTCONbits.INTF = 0;   //reg INTCON
   
   
    TRISAbits.TRISA0 = 0;
    TRISAbits.TRISA1 = 0;
    TRISAbits.TRISA5 = 1;   //porta A

    TRISCbits.TRISC3 = 0;   //porta C

    ADCON0bits.ADON = 0;   //abil. ad
   
   PIR1bits.ADIF = 0;      //canc. flag
   PIE1bits.ADIE = 0;      //abil. interrupt on adc

    ADCON1bits.ADCS2 = 0;
    ADCON1bits.ADCS1 = 0;
    ADCON1bits.ADCS0 = 1;   //sel. 1us TAD

    ADCON0bits.CHS4 = 0;
    ADCON0bits.CHS3 = 0;
    ADCON0bits.CHS2 = 0;
    ADCON0bits.CHS1 = 1;
    ADCON0bits.CHS0 = 1;    //sel an3

   intmr0();
   
   LEDTX=0;
   
    while(1){
      PORTCbits.RC3 = 1;
      __delay_ms(1);
      PORTCbits.RC3 = 0;
      __delay_ms(1);
    }
}


Dovrebbe accendere e spegnere un led ogni 1ms... ma non funziona, non entra nella routine di interrupt :oops:
Nel ds non parla del fatto che il tmr0 debba essere accesso... quindi è sempre acceso? C'è qualcosa che mi sfugge? :roll: Grazie per l'aiuto! :ok:
Avatar utente
Foto Utentephase
50 4
New entry
New entry
 
Messaggi: 82
Iscritto il: 23 apr 2013, 16:28

0
voti

[2] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto UtenteWALTERmwp » 1 lug 2014, 0:18

Ciao Foto Utentephase, ma, prima di provare ad interpretare il codice che hai riportato (ammesso di riuscirci), si potrebbe sapere sulla base di che cosa, effettivamente, affermi che ...
phase ha scritto:non funziona, non entra nella routine di interrupt
... ?
Te lo chiedo perche', se ti basi sullo stato del led, non so come puoi apprezzare un on/off di un millisecondo; perche' rimane sempre spento, o perche' rimane sempre acceso ?
Oppure hai stabilito che effettivamente la routine associata all'interrupt non viene processata ?

Saluti

p.s.
... intanto questo ... "PORTAbits.RA0 = blink;" ?
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8985
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[3] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto Utentephase » 1 lug 2014, 1:15

La verifica l'ho effettuata con un oscilloscopio ;-)
Comunque blink è una variabile globale definita come unsigned char. Questa ogni volta che avviene l'interrupt viene posta uguale alla sua negata così da porre il pin uguale a 1 o a 0 ogni volta... :D
Avatar utente
Foto Utentephase
50 4
New entry
New entry
 
Messaggi: 82
Iscritto il: 23 apr 2013, 16:28

0
voti

[4] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto UtenteWALTERmwp » 1 lug 2014, 1:38

phase ha scritto:viene posta uguale alla sua negata
... si, "cosa fa" l'operatore credo di saperlo (un pochino lo conosco il "C"); quello che intanto mi chiedevo e' se l'assegnazione di un "char" possa essere coerente (sul bit e non sul byte della porta).

Saluti

p.s.
Hai verificato con l'oscilloscopio ?
Quindi hai dedotto ?
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8985
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[5] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto Utentegrandegiove » 1 lug 2014, 8:39

Ciao,

potresti postare la dichiarazione di blink. Hai inizializzato la variabile?

O_/
Avatar utente
Foto Utentegrandegiove
1.151 1 4 8
Expert
Expert
 
Messaggi: 517
Iscritto il: 18 ott 2010, 9:59

0
voti

[6] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto Utentephase » 1 lug 2014, 9:49

Quindi l'ho dedotto... si :oops:
In realtà ho provato a fare una sorta di debug manuale vedendo a che punto dava problemi...

Comunque se si assegna un byte ad un pin il byte viene tagliato e viene preso solo il bit più significativo, ha sempre funzionato questa procedura; genera un warning.
La dichiarazione di blink è già nel codice
Codice: Seleziona tutto
#include <xc.h>

#pragma config FOSC = INTOSC
#pragma config LVP  = OFF
#pragma config WDTE = OFF

unsigned char blink=1;

#define _XTAL_FREQ 8000000
#define LEDTX PORTAbits.RA0
...
...
...
Avatar utente
Foto Utentephase
50 4
New entry
New entry
 
Messaggi: 82
Iscritto il: 23 apr 2013, 16:28

2
voti

[7] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto UtentePaolino » 1 lug 2014, 10:02

Foto Utentephase, c'è un errore di battitura e uno concettuale (ininfluente, questo)

Prova con questo codice:
Codice: Seleziona tutto
void interrupt ISR(void){
   if(INTCONbits.TMR0IF){
      INTCONbits.TMR0IF = 0;
      TMR0  = 6;
      PORTAbits.RA0 = blink;
      blink = ~ blink;
//      INTCONbits.GIE = 1;
   }
}


Due cose: ho scritto la funzione interrupt con la i minuscola, e ho dato un nome alla funzione (puoi metterci quello che vuoi). Secondo, ho tolto l'abilitazione GIE. Questo non serve farlo.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[8] Re: Problema tmr0 PIC 16lf1783

Messaggioda Foto Utentephase » 1 lug 2014, 10:12

Ti ringrazio tantissimo!!!! :ok:
Ho capito l'errore... grazie ancora per la vostra disponibilità :D
Avevo messo
Codice: Seleziona tutto
INTCONbits.GIE = 1;

in preda alla disperazione... :oops:
Avatar utente
Foto Utentephase
50 4
New entry
New entry
 
Messaggi: 82
Iscritto il: 23 apr 2013, 16:28


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti