Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491

    [C] Pic 16f864 INTERRUPT

    Da qualche giorno sto prendendo dimistichezza con la programmazione dei PIC, già conoscevo il C, quindi ho cominciato da lì. Ho fatto un semplice circuitino con i classici led che si accendono a comando e le prime prove di programmi sono andati benissimo, ora vorrei capire bene come funzionano gli interrupt, ma non capisco perchè questo codice non vada:
    codice:
    #include <htc.h>
    #include "delay.h"             // richiama la routine di ritardo per poter usare le pause
    
    /*Definisce alcune variabili*/
    #define OUTPUT 0
    #define INPUT 1
    #define LED1 0b00000010
    #define LED2 0b00001000
    #define LED12 0b00001010
    #define ASP 1               //definisce il tempo di attesa (ms)
     
    unsigned volatile stat; 
     
    void main(void)
    {
    	//Imposta le porte RB come output e RB4 come input (per intercettare l'interrupt)
    	TRISB=0;
    	TRISB4=1;
    	//Abilita gli interrupt dalla port RB4
    	RBIF=0;				//Kills all unwanted interrupts
    	RBIE=1;				//Enables RB interr
    	GIE=1;				//Enables interrupts
    	//Imposta alternativamente i led attivi RB0 e RB1
    	stat=LED1;
    	while(1){
    		PORTB=stat;
    		DelayS(ASP);
    	}
    }
    
    interrupt  interr( void ) {
    	if(RBIF){
         //L'interrupt proviene da RBIE
    	 if(stat==LED1)stat=LED2;
    	 else stat=LED1;
    	 RBIF=0;				//Kills all unwanted interrupts
    	 RBIE=1;				//Enables RB interr
    	 GIE=1;				//Enables interrupts
    	}
    }
    Cioè compila, ma se metto in tensione il piedino del RB4 non riesco a cambiare led che accendo. Credo che non riesca a gestire bene l'interrupt...
    Help.

    Grazie
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima di tutto ... sei sicuro del modello ?

    16F864 ?

    Mi sa che non esiste ...

  3. #3
    io conosco il 16f84...

  4. #4
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Originariamente inviato da gaetanoTwins
    io conosco il 16f84...
    Ovviamente mi sono sbagliato!
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Xadoom
    Ovviamente mi sono sbagliato!
    E quindi stai lavorando con il 16F84 o il 16F874 ?

  6. #6
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    16f84

    grazie
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    1,003
    This interrupt can wake the device from SLEEP. The
    user, in the Interrupt Service Routine, can clear the
    interrupt in the following manner:
    a) Any read or write of PORTB. This will end the
    mismatch condition.
    b) Clear flag bit RBIF.
    A mismatch condition will continue to set flag bit RBIF.
    Reading PORTB will end the mismatch condition and
    allow flag bit RBIF to be cleared
    .

  8. #8
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Originariamente inviato da tia86
    This interrupt can wake the device from SLEEP. The
    user, in the Interrupt Service Routine, can clear the
    interrupt in the following manner:
    a) Any read or write of PORTB. This will end the
    mismatch condition.
    b) Clear flag bit RBIF.
    A mismatch condition will continue to set flag bit RBIF.
    Reading PORTB will end the mismatch condition and
    allow flag bit RBIF to be cleared
    .
    Scusami ma non capisco cosa vuoi dirmi, in effetti io per uscire dalla subroutine interrupt pongo a zero RBIF, cosa c'è che non và?
    Grazie
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Che devi leggere la porta B nella routine di interrupt ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.