Hallo,
Hier die Version des Empfangsprogramm mit Interrupts...
Kommentare fehlen leider, aber ich hoffe es ist einigermassen verständlich.
edit: Zum besseren Verständnis habe ich noch Kommentare hinzugefügt.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 }







Zitieren

Lesezeichen