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
/** 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;
}
}
}