Hallo,
Hier die Version des Empfangsprogramm mit Interrupts...
Kommentare fehlen leider, aber ich hoffe es ist einigermassen verständlich.
Code:
//Empfangen
#include <P18F252.h> //Bibliothek einbinden
int ring; //Variable definieren
void open_serial(void); //Definition der Unterprogramme
void initINT (void); //Definition der Unterprogramme
void InterruptHandler (void); //Definition der Unterprogramme
void InterruptVektor (void); //Definition der Unterprogramme
#pragma code InterruptVektor = 0x08 //Vektor für hohe Priorität
#pragma code
#pragma interrupt InterruptHandler
void main (void)
{
ADCON1 = 7; //PORTA digital
LATA = 0x00;
TRISA = 0x00; //PORTA als Ausgang
TRISB = 0x00; //PORTB als Ausgang
ring = 0;
RCREG = 90; //Anfangswert RCREG
open_serial(); //USART-Modul konfigurieren
initINT(); //Interrupts konfigurieren
while(1)
{
PORTB = 0xFF; //PORTB auf High setzen
}
}
void open_serial()
{
SPBRG = 103; //Baud-Rate
TXSTAbits.BRGH = 0; //Baud-Rate
TXSTAbits.SYNC = 0; //Asynchrone Übertragung
TRISCbits.TRISC6 = 0; //RB6 als Ausgang
TRISCbits.TRISC7 = 1; //RB7 als Ausgang
RCSTAbits.SPEN = 1; //Seriellen Port aktivieren
TXSTAbits.TX9 = 0; //8-Bit Sendung
RCSTAbits.RX9 = 0; //8-Bit Empfang
RCSTAbits.CREN = 1; //Empfänger aktivieren
TXSTAbits.TXEN = 0; //Sender deaktivieren
PIR1bits.PSPIF = 0; //Laut Datenblatt zu löschen
PIE1bits.PSPIE = 0; //Laut Datenblatt zu löschen
IPR1bits.PSPIP = 0; //Laut Datenblatt zu löschen
RCSTAbits.FERR = 0; //Laut Datenblatt zu löschen
RCSTAbits.OERR = 0; //Laut Datenblatt zu löschen
}
void initINT()
{
PIE1bits.TXIE = 0; //Sende-Interrupt deaktivieren
PIE1bits.RCIE = 1; //Empfangs-Interrupt aktivieren
INTCONbits.GIE = 1; //Globale Interrupt-Freigabe
INTCONbits.PEIE = 1; //Periphere Interupts freigeben
RCONbits.IPEN = 1; //High-Priority Interrupts freigeben
INTCONbits.GIEH = 1; //High-Priority Interrupts freigeben
IPR1bits.RCIP = 1; //Empfangs-Interrupt erhält hohe Priorität
}
void InterruptHandler() //Interrupt-Service-Routine
{
INTCONbits.GIE = 0; //Interrupts deaktivieren
PORTB = 0x00; //PORTB löschen (zeigt dass Interrupt ausgelöst wird)
PORTA = RCREG; //Empfnags-Buffer auslesen
PIR1bits.RCIF = 0; //Flag des Empfangs-Interrupt löschen
INTCONbits.GIE = 1; //Interrupts wieder aktivieren
}
void InterruptVektor (void) //Interrupt-Vektor festlegen
{
_asm
goto InterruptHandler
_endasm
}
edit: Zum besseren Verständnis habe ich noch Kommentare hinzugefügt.
Lesezeichen