Hallo
ich hab nen keleines Problem und es wäre super wenn mir jemand weiter
helfen könnte:) , danke im vorsus für jede Hilfe
ich verwende den PIC18F46K20. Der PIC soll einen Interrupt auslösen wenn
ein Byte über die USART enpfangen wird. Das Problem ist dass der
Interrupt in einer Endlosschleife ausgeführt wird trotz dass das Flagbit
gelöscht wird.??
Das Byte sende ich vom PC aus. Die USART und die kommunikation mit dem
PC funktioniert. Hat von euch jemand ne idee was ich falsch mache?
hier der code
> Das Problem ist dass der> Interrupt in einer Endlosschleife ausgeführt wird trotz dass das Flagbit> gelöscht wird.??
Also auf jeden Fall steht auf Seite 243 des Datasheet:
"The RCIF interrupt flag bit is read-only, it cannot be set or cleared
by software."
(gleich am Anfang der Seite)
Der Code scheint momentan in der ISR nichts weiter zu machen, vielleicht
MUSS man das Byte lesen oder den Interrupt anders resetten?
Es gibt auch einen Buffer Overrun, vielleicht schlägt der zu?
Ansonsten ist die ISH ja eine allgemeine Routine und nicht nur für den
USART, vielleicht passiert da ja noch was anderes wie ein Timer
Interrupt?
Konrad hat recht, steht auch auf Seite 112:
> bit 5 RCIF: EUSART Receive Interrupt Flag bit> 1 = The EUSART receive buffer, RCREG, is full (cleared when RCREG is> read)> 0 = The EUSART receive buffer is empty
Du musst RCREG lesen, dann erledigt sich die Sache von selbst. Das ist
eines der wenigen Falgs, das man nicht manuell löschen muss.
Nachtrag:
Falls du später vor hast Daten zu senden; auch da gibts ne Falle. Dann
löst das Interrupt immer aus, wenn der Buffer (TXREG) leer ist. Also
auch dann, wenn du gar nichts senden willst. Daher musst du das erste
Byte manuell in TXREG kopieren, Interrupt einschalten und den Rest
kannst du dann im Interrupt erledigen. Hast du keine Daten zum senden
mehr, so musst du das Interrupt wieder ausschalten.
Danke für deine Hilfe,
habs im Datenblatt auch gelesen, aber
in einem Example von der C18 lib steht das zwar auch so:D
1
....
2
/* 66 */*/
3
/* 67 */putsUSART(data[10]);
4
/* 68 */
5
/* 69 *//* Display value received on LEDs */
6
/* 70 */PORTB=c;
7
/* 71 */}
8
/* 72 */
9
/* 73 *//* Clear the interrupt flag */
10
/* 74 */PIR1bits.RCIF=0;
11
/* 75 */}
naja löschen lässts sich jedenfalls nicht
Konrad G. schrieb:> vielleicht> MUSS man das Byte lesen
jo muss man :)
jetzt funktioniert es, danke für die Hilfe
mgf