mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [PIC] Interrupts C18


Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen!

Ich beschäftige mich im Moment mit Interrupts aber ich hänge hier. Ich 
möchte bei einem 18F4550 den Interrupt on Change verwenden an PORTB. 
Leider durchläuft er die Interrupt Schleife dauernd obwohl ich weder 
einen Taster drücke noch sonst was angeschlossen ist. Das PORTD wird 
immer weiter erhöht.
/** I N C L U D E S ********************************/
#include <p18f4550.h>
#include "delay.h"

/** Configuration **********************************/
        #pragma config PLLDIV   = 5         // (20 MHz crystal on PICDEMFS USB board)
        #pragma config CPUDIV   = OSC1_PLL2
        #pragma config USBDIV   = 2         // Clock source from 96MHzPLL/2
        #pragma config FOSC     = HSPLL_HS
        #pragma config FCMEN    = OFF
        #pragma config IESO     = OFF
        #pragma config PWRT     = OFF
        #pragma config BOR      = ON
        #pragma config BORV     = 3
        #pragma config VREGEN   = ON      //USB Voltage Regulator
        #pragma config WDT      = OFF
        #pragma config WDTPS    = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-CircuitDebug/Programming
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
        #pragma config CPB      = OFF
//      #pragma config CPD      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
        #pragma config WRTB     = OFF       // Boot Block Write Protection
        #pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
        #pragma config EBTRB    = OFF

/** F U N C T I O N S ******************************/
void low_isr( void );
void high_isr( void );

/** I N T E R R U P T S ****************************/
/*
 * Bei PIC18 ist der low Interrupt Vector bei 
 * 00000018h.
 */
#pragma code low_vector=0x18
void interrupt_at_low_vector( void )
{
  _asm GOTO low_isr _endasm
}
#pragma code

#pragma interruptlow low_isr
void low_isr( void )
{
  
}

/*
 * Bei PIC18 ist der high Interrupt Vector bei
 * 00000008h.
 */
#pragma code high_vector=0x08
void interrupt_at_high_vector( void )
{
  _asm GOTO high_isr _endasm
}
#pragma code

#pragma interruptlow high_isr
void high_isr( void )
{
  if( INTCONbits.RBIF )    // PORTB Change Interrupt
  {
    INTCONbits.RBIF = 0;  // Wenn ja Interruptflag löschen
    Delay_ms( 750 );
    PORTD += 1;        // PORTD xor Verknüpfen
  }
}

/** D E C L A R A T I O N S ************************/
#pragma code

// **********************************************
//
// Hauptprogramm
//
//
// **********************************************
void main( void ) 
{
// Variablen definieren
int test;

//Einstellen der Ports
// 0 = Output
// 1 = Input
TRISD = 0x00;  //PORTD Ausgang
PORTD = 0x00;

TRISB = 0xFF;  //PORTB Eingang

test = PORTB;

// Interrupt Konfigurieren
INTCONbits.GIE  = 1;        // Interrupts generell erlauben
//INTCONbits.GIEL = 1;        // Peripheral Interrupt enable
INTCONbits.RBIF = 0;        // Interrupt on Change Flag aus
INTCONbits.RBIE = 1;        // Interrupt on Change an den PINs
                  // PORTB(7:4)
//INTCON2bits.RBIP = 0;        // Low Priority

RCONbits.IPEN = 0;          // Interrupt Priority off

while( 1 );
}

LG
Andreas

Autor: D.F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus dem Datenblatt
"
Note: On a Power-on Reset, RB4:RB0 are
configured as analog inputs by default and
read as ‘0’; RB7:RB5 are configured as
digital inputs.
By programming the Configuration bit,
PBADEN (CONFIG3H<1>), RB4:RB0 will
alternatively be configured as digital inputs
on POR.
"

Aus deinem Programm
"#pragma config PBADEN   = OFF
"

Dirk F.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier dürfte viel interessanter sein:

The user, in the Interrupt Service
Routine, can clear the interrupt in the following manner:
a) Any read or write of PORTB (except with the
MOVFF (ANY), PORTB instruction). 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.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beiden Sachen habe ich schon gefunden und eingebaut.
_asm movf PORTB, 0, 0 _endasm
INTCONbits.RBIF = 0;

und
ADCON1 = 0x00;    // Alles Digitale Eingänge

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ADCON1 = 0x00;    // Alles Digitale Eingänge

Das ist auf jeden Fall falsch.
Im Datenblatt steht was anderes um auf digital IO
umzuschalten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.