Hallo, es sieht so aus wie, wenn ich im interrupt kein Byte sende, immer wieder die interrupt Funktion ausgelöst wird. ich komme aus folgenden Gründen darauf: Ich habe im Main den RE2 blinken -> blinkt nicht, wenn ich das TXREG=ch; auskommentieren Im Timer0 habe ich den RE1 blinken -> blinkt weiter, als kann der PIC sich nicht verabschiedet haben Hat jemand eine Idee? Code auszugsweise: // ich verwende den Hitec compiler eingebunden in MPLAB IDE // ------------- UART einstellen und interrupts einhängen #define RX_PIN TRISC7 #define TX_PIN TRISC6 void COM_Init(unsigned long Baud, unsigned long Fosc, void (*SndInt)(void),void (*RcvInt)(void)) { RX_PIN = 1; // als eingang TX_PIN = 0; // als ausgang ein SPBRG = (int)(Fosc/(16UL * Baud) -1); RCSTA = 0b10010000; // ein, 8bit, async, dauer,adress aus - - - TXSTA = 0b00100100; // 8 bit, Ein, async,Hohe Baudrate, voll, 9.bit 0 if(SndInt!=0) { SetIntComSndFunction(SndInt); GIE = 1; // interrupts freigeben PEIE = 1; // perepherie interupts TXIE = 1; // sende interrupt aktiv } if(RcvInt!=0) { unsigned char x; SetIntComRcvFunction(RcvInt); GIE = 1; // interrupts freigeben PEIE = 1; // perepherie interupts RCIE = 1; // empfangs interrupt aktiv if (RCIF) RcvInt(); // falls register voll ist gleich ausführen } } // ------------- Interrupt functionen einhängen und abarbeiten void SetIntT0Function(void (*NewInt)(void)) { __IntT0 =NewInt; } void SetIntComRcvFunction(void (*NewInt)(void)){ __IntRcv=NewInt; } void SetIntComSndFunction(void (*NewInt)(void)){ __IntSnd=NewInt; } // interrupts abarbeiten void interrupt __Int(void) { if (T0IE && T0IF && __IntT0 !=0) __IntT0(); if (TXIE && TXIF && __IntSnd!=0) __IntSnd(); if (RCIE && RCIF && __IntRcv!=0) __IntRcv(); } // -------------interrupt functionen //aufs mindeste reduziert char ch; void RecInterrupt(void) { ch= RCREG; PORTC=ch; } void SndInterrupt(void) { // TXREG=ch; // sobald das auskommentiert wird ist es vorbei }
Deine Beobachtung ist richtig. Solange das TXREG leer ist wird TXIF sofort nach dem Löschen wieder gesetzt. Man ist gezwungen, nach dem letzten gesendeten Zeichen TXIE zu löschen um nicht dauernd wieder TX Interrupts zu bekommen.
Hallo Werner, danke für die Info. Ich werde, wenn mit dem letzten Zeichen aus der Queue das TXIE auf 0 setzen und beim eintragen des 1. wieder setzen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.