hagbart06
12.01.2011, 17:59
Hallo,
habe eine Schaltung mit einem PIC16F628. Er soll einfach nur Daten empfangen und in einer Variable speichern. Bisher habe ich das ganz einfach mit Pooling in der Main-Schleife gemacht. Weil der PIC jetzt aber noch ein paar andere Sachen machen soll, wollte ich das RX einen Interrupt auslöst sobald Daten eingehen
Das ist der Code zum initialisieren der Schnittstelle:
void InitUSART(void)
{
GIE=1; // Global Interrupts erlauben
BRGH=1; // High Speed einstellen
SPBRG=129; // 9600 baud @ 20MHz
SPEN = 1; // Asynchrone Pins aktivieren
SYNC = 0; // Asynchroner Modus einstellen
TX9 = 0; // 8bit TX einstellen
RX9 = 0; // 8bit RX einstellen
CREN = 1; // RX einschalten
TXEN = 0; // TX ausschalten
RCIE=1; // RX Interrupt erlauben
}
Und so sieht die Interrupt Routine aus:
interrupt InterruptRoutine(void) // Interruptroutine
{
int_save_registers // W, STATUS (und PCLATH) retten
if (RCIF) //Schauen ob Interrupt von RX kommt (RCIF = 1 wenn Daten in RCREG vorhanden sind)
{
einlesen(); //Rufe Funktion zum speichern von RCREG in der Variable auf
}
int_restore_registers // W, STATUS (und PCLATH) Wiederherstellen
}
Das einzige was ich noch mache ist InitUSART(); nach dem anschalten in der Main aufzurufen. Der Rest des Programms funktioniert nach wie vor ohne Probleme.
Hoffe es hat jemand noch eine Idee. Wie gesagt die Daten kommen/kamen am PIC richtig an. Muss also etwas mit der Einstellung vom Interrupt zu tun haben!?
Einen schönen Abend noch...
habe eine Schaltung mit einem PIC16F628. Er soll einfach nur Daten empfangen und in einer Variable speichern. Bisher habe ich das ganz einfach mit Pooling in der Main-Schleife gemacht. Weil der PIC jetzt aber noch ein paar andere Sachen machen soll, wollte ich das RX einen Interrupt auslöst sobald Daten eingehen
Das ist der Code zum initialisieren der Schnittstelle:
void InitUSART(void)
{
GIE=1; // Global Interrupts erlauben
BRGH=1; // High Speed einstellen
SPBRG=129; // 9600 baud @ 20MHz
SPEN = 1; // Asynchrone Pins aktivieren
SYNC = 0; // Asynchroner Modus einstellen
TX9 = 0; // 8bit TX einstellen
RX9 = 0; // 8bit RX einstellen
CREN = 1; // RX einschalten
TXEN = 0; // TX ausschalten
RCIE=1; // RX Interrupt erlauben
}
Und so sieht die Interrupt Routine aus:
interrupt InterruptRoutine(void) // Interruptroutine
{
int_save_registers // W, STATUS (und PCLATH) retten
if (RCIF) //Schauen ob Interrupt von RX kommt (RCIF = 1 wenn Daten in RCREG vorhanden sind)
{
einlesen(); //Rufe Funktion zum speichern von RCREG in der Variable auf
}
int_restore_registers // W, STATUS (und PCLATH) Wiederherstellen
}
Das einzige was ich noch mache ist InitUSART(); nach dem anschalten in der Main aufzurufen. Der Rest des Programms funktioniert nach wie vor ohne Probleme.
Hoffe es hat jemand noch eine Idee. Wie gesagt die Daten kommen/kamen am PIC richtig an. Muss also etwas mit der Einstellung vom Interrupt zu tun haben!?
Einen schönen Abend noch...