Pagina 1 di 1

Problema tmr0 PIC 16lf1783

MessaggioInviato: 30 giu 2014, 18:15
da phase
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:

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 0:18
da WALTERmwp
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;" ?

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 1:15
da phase
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

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 1:38
da WALTERmwp
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 ?

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 8:39
da grandegiove
Ciao,

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

O_/

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 9:49
da phase
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
...
...
...

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 10:02
da Paolino
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.

Re: Problema tmr0 PIC 16lf1783

MessaggioInviato: 1 lug 2014, 10:12
da phase
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: