USART Interrupt funktioniert nicht
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache C  |  USART Interrupt funktioniert nicht « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: USART Interrupt funktioniert nicht  (Gelesen 233 mal)
 
Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« am: Februar 17, 2012, 09:18:43 »

Hallöchen... nach dem ich in der vergangen Nacht bis um 3Uhr programmiert hab und jetzt mit meinem Latein so ziemlich am ende bin hoffe ich doch auf ein klein bissel Hilfe vom Forum. Wenn ein Byte in den USART-Puffer geschrieben wird und auch das entsprechende (PIR1bits.RCIF)gesetzt wurde wird trotzdem kein Interrupt ausgelöst...
Auch ist mir aufgefallen das das INTCONbits.GIE was natürlich in der init gesetzt wird, gelöscht wird sobald etwas im Puffer steht... es wundert mich dann nicht das er nicht in die interrupt routine springt aber ich versteh nicht wo das GIE-bit gelöscht wird... wäre jemand mal so freundlichund würde über den Code gucken...

MPLAB-C18-Compiler
PIC18F2480

vielen Dank

Code:
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "delays.h"                        // für die Warteschleife
#include "usart.h"

/** Configuration ********************************************************/

#pragma config OSC  = IRCIO67 // internet Takt (8MHZ)
#pragma config PWRT = ON
#pragma config WDT = OFF  //Watchdog Timer
#pragma config LVP = OFF  //Low Voltage ICSP
 
#define Power LATAbits.LATA6 //LED grün
#define Daten LATCbits.LATC0 //LED gelb
#define Test LATCbits.LATC1 //LED gelb
#define Fehler1 LATCbits.LATC2 //LED rot
#define Fehler2 LATCbits.LATC3 //LED rot
#define Taster1 PORTCbits.RC4
#define Taster2 PORTBbits.RB4

unsigned char   Wert;

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



 

/************************************************
Interrupt mit niedriger Priorität
************************************************/
 

 
#pragma code
#pragma interruptlow low_isr
void low_isr(void)
{

if (PIR1bits.RCIF == 1)
{
Test = 1; // LED zur optischen Darstellung
Daten = !Daten; // LED ZUR optischen Darstellung
Wert = RCREG; // Auslesesn des USART-Puffers
RCREG = 0; // USART-Puffer löschen ( eigentlich überflüssig
PIR1bits.RCIF = 0; // Puffer-full-bit wieder löschen!
}


}
/* Hierhin springt der PIC beim Auslösen eines
   eines Interrupts mit niedriger Priorität*/
 
#pragma code _LOW_INTERRUPT_VECTOR=0x18
void interrupt_at_low_vector(void)
{
  _asm GOTO low_isr _endasm
}


void main(void)
{

IPR1bits.RCIP = 0;      // LOW priority für USART RECEIVE
RCONbits.IPEN = 0; // keine Prioriät bei Interrupts
INTCONbits.PEIE = 1; // Peripheral Interrupt erlaubt
PIE1bits.RCIE = 1; // EUSART receive interrupt enable bit
OSCCONbits.IRCF2 = 1;   //8MHZ einstellung
   OSCCONbits.IRCF1 = 1; //8MHZ einstellung
   OSCCONbits.IRCF0 = 1; //8MHZ einstellung
   OSCCONbits.SCS1 = 1;
   OSCCONbits.SCS0 = 1;
 
TRISA = 0xBF;
TRISB = 0xF7;
TRISC = 0xB0;

TXSTA = 0x64;  // EUSART senden konfigurieren
      // asysnchron
      // 9-bit
      // high-speed
   RCSTA = 0xF0;  // EUSART empfangen konfigurieren
      // Empfang aktiv
      // Port aktiv
      // 9-bit
   BAUDCON = 0x0A;  // 16-bit Baud-Rate Generator

   SPBRGH = 1;  // 19200bps
   SPBRG = 3;  // 19200bps, 3


   PIE1bits.RCIE=1;    //RX Interrupt enable


Fehler1 = 0; //LED zur sicherheit erst mal löschen
Fehler2 = 0; //LED zur sicherheit erst mal löschen
Daten   = 0; //LED zur sicherheit erst mal löschen
Test    = 0; //LED zur sicherheit erst mal löschen





while(1)
{
INTCONbits.GIE = 1; // Interrupts überhaupt erst mal erlaubt
Delay10KTCYx(1); // Warteschleife
Power = !Power; // Kontroll-LED
if(Wert==0x01)
{
Fehler1 = 1;
}
else
{
Fehler1 = 0;
}
if (Taster1 == 1)
{
Fehler2 = 1;
}
else
{
Fehler2 = 0;
}




}

}
« Letzte Änderung: Februar 17, 2012, 09:35:25 von Herzog » Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #1 am: Februar 17, 2012, 13:24:48 »

Hallo,

du musst INTCON.GIEL und GIEH setzen damit der low level Interrupt ausgelöst.

Gruß
Stefan
Gespeichert

Herzog
Newbie
*
Offline Offline

Beiträge: 31


Profil anzeigen
« Antworten #2 am: Februar 18, 2012, 14:02:21 »

ich habe jetzt GIEH und GIEL auf eins gesetzt und den USART-interrupt die high-priorität verpasst... jetzt geht es ... aber warum geht es denn nicht für  den low-interrupt-Modus
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.038 Sekunden mit 18 Zugriffen.
 
Top! Top!