magnetiman Inserito: 12 agosto 2022 Segnala Share Inserito: 12 agosto 2022 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 More sharing options...
Livio Orsini Inserita: 12 agosto 2022 Segnala Share Inserita: 12 agosto 2022 Prima cosa specifica linguaggio e compilatore. Poi, domanda banale, ma gli interrupt li hai abilitati? Link al commento Condividi su altri siti More sharing options...
magnetiman Inserita: 12 agosto 2022 Autore Segnala Share Inserita: 12 agosto 2022 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora