Vai al contenuto
PLC Forum


PIC non entra negli interrupts


magnetiman

Messaggi consigliati

Salve tutti e grazie in amticipo a chi abbia la pazienza di darmi qualche lume.

Sto programmando un PIC 12F629 per far si che cambi lo stato di un led sulla porta GPIO2 tutte le volta che si prema il pulsante collegato alla GPIO0 oppure alla GPIO1. I pulsanti sono entrambi in Pull-down.

Sono sicuro che entra nel programma main perchè si accende il led sulla porta 2. Quello che succede è che però se premo uno dei due pulsanti mi aspetterei che il led si spenga e non succede.

 

 

 

Vi metto qui sotto il testo del programma, magari qualcuno mi sa dire dove sbaglio...

Troverete che disattivo tutte le porte con l' IOC e che poi le riattivo. Mi serve perchè nel mezzo inserirò una parte di programma che deve essere eseguita allo start-up senza essere interrotta dagli interrupts.

Anche le variabili che sono in testa al programma non risultano utilizzate, lo so, ma mi serviranno successivamente quando popolerò il programma main.

 

 

 

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // ON  GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)


#define _XTAL_FREQ 4000000 //Specifico la frequenza dell'oscillatore

#include <xc.h> //Header file generico
#include <pic12f6x_legacy.h>


bit pulsante1;
bit pulsante2;
long int i;
int marcia;
long int limitehigh;
long int limitelow;

 

 

__interrupt (high_priority) void conta_tempo () {

    TMR1IF=0;
    if (GPIO0==1){
    
        for (i=0; i<=10; i++){
        TMR1=55000;
            while(!TMR1IF)
            {}
        TMR1=0;
        TMR1IF=0;}
    
    if (GPIO0==1){
    pulsante1=1;
    }
    
    }
    
    if(pulsante1==1)
    {GPIO2=!GPIO2;}
    TMR1IF=0;
    
    
    
    if (GPIO1==1){
    for (i=0; 1<=10; i++){
    TMR1=55000;
        while(!TMR1IF)
        {}
    TMR1=0;
    TMR1IF=0;}
    TMR1=0;
    if (GPIO1==1)
            {
    pulsante2=1;
    }
    }
    
    if(pulsante2==1)
    {GPIO2=!GPIO2;}

    pulsante1=0;
    pulsante2=0;
    TMR1=0;
    TMR1IF=0;
    GPIF=0;
    GPIE=1;
    GIE=1;
    
    //PEIE=1;
    
    
    
}


void main(void) {

 PIE1 = 0b00000001;     // Periphral interrupt enable (EEPROM,A/D,Comparator,TMR1)
 INTCON = 0b11001000;   //interrupt Control Register (enable/flag per global interrupt, peripherals, TMR0, interrupt su porta 2, port change interr.)
 T1CON = 0b00000101;    //Timer1 Control Register (eneble Timer1, clock settings for timer 1)
 PCON = 0b00000011;     //Power Control register (statuses di power on reset, brown-out)
 GPPU=1;                //fa parte di OPTION_REG (enable GPIO Pull-ups)
 INTEDG = 1;            //fa parte di OPTION_REG (interrupt on rising or falling edge)
 IOC = 0b00000000;      //blocco gli interrupt fino a che il servo non è sceso alla prima marcia
 
 TRISIO = 0b00001011;   //GPIO 0-1-3 input, GPIO 2-4-5 output
 WPU = 0b00000000;      //weak pull-up register (pull-up enable on ports)
 //OSCCAL = 0b01111100; //Oscillator Calibration register
 PIR1 = 0b01000000;     //Peripheral Interrupt register (flags per le periferiche settate in PIE1)
 
 
 
 GPIO2=1;
 GPIO5=0;
 
 // qui va il ciclo con l'interrupt bloccato

 
 
 IOC = 0b00000011;  //attivo gli interrupt per le porte GPIO0 e GPIO1
 
 while (1) { 
    
    
    TMR1=0;
    GPIE=1;
    GIE=1;
    TMR1IF=0;
    
}
}

Link al commento
Condividi su altri siti


Prima cosa specifica linguaggio e compilatore.

Poi, domanda banale, ma gli interrupt li hai abilitati?

Link al commento
Condividi su altri siti

A beneficio di tutti ho trovato la soluzione... Il convertitore analogico digitale non era stato disattivato. E'bastato inserire le tre righe

CM0=1;
CM1=1;
CM2=1;

 

e per magia tutto funziona! (poi c'era anche un piccolo refuso: una i era diventata 1 in un ciclo dell'interrupt, ma questo è il meno... :) )

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...