Datum: 02.04.2008 21:23
Servus, habe folgendes Problem. Mein USART läuft RX/TX Interrupts, beim Senden von mehreren Symbolen, klappt leider immer nur eines. Ich kann ja nicht die Abfrage
while(!(IFG2 & UTXIFG1)); |
machen wann ich was ins TX Sende Register schreiben kann, denn das funktioniert bei INterrupts ja nicht. Daher sende ich über meine funktion SendUSART:
void SendUSART1(char* str) // einen string über die serielle schnittstelle (USART1) senden { for(int zaehl = 0; zaehl < sizeof str; zaehl++) { send_tx[zaehl] = str[zaehl]; } TXBUF1 = send_tx[0]; } |
Und zähle dann in meiner interrupt senderoutine das array durch, und lasse den ersten wert weg. leider funktioniert das nicht ?!?
#pragma vector=UART1TX_VECTOR //Transmitting - Interrupt-Routine __interrupt void usart1_tx (void) { for(int zaehl = 1; zaehl < sizeof send_tx; zaehl++) { TXBUF1 = send_tx[zaehl]; } } |
Datum: 02.04.2008 23:02
Wozu brauchst du denn eigentlich TX Interrupts?
Datum: 03.04.2008 07:56
Kann ja nicht klappen. Du sendest ja alle Zeichen gleich hintereinander weg, wenn du per TX-Int benachrichtigt wurdest, dass du ein Zeichen senden darfst. Wenn schon mit TX-Int, dann musst du dir eine globale volatile Variable anlegen, die die Position im Sende-Array anzeigt, und dann per TX-ISR immer nur ein zeichen senden und diese Variable hochzählen. Aber warum TX-ISR? Hast du in der Zwischenzeit so viel anderes mit der CPU zu tun?
Datum: 03.04.2008 07:58
Übrigens noch ein 2. Fauxpas: Du sendest, abgesehn von dem Fehler, den ich beschrieben habe, immer das gesamte Array, egal wieviele Zeichen die USART_Send reingeschrieben hat.
Datum: 13.05.2008 17:02
Hi, ich versteh nich so ganz warum deine Funktion mit nem Pointer arbeitet, wenn du ihn nie verwendest. So wie deine Funktion ausschaut kannste einfach mit dem Pointer arbeiten. z.B so:
void SendUSART1(char* str) // einen string über die serielle schnittstelle (USART0) senden { while (*str != 0) { while (!(IFG2 & UTXIFG1)); // warten, bis USART0 TX-buffer sendebereit TXBUF1 = *str++; //senden des aktuellen wertes, auf dem der Pointer zeigt und anschliessend addieren um 1 (naechster wert) } } |
und als test, lässt du ueber dein ISR von der URXD immer was ausgeben. z.b.:
#pragma vector = UART1RX_VECTOR __interrupt void usart1_rx(void) { sendUSART1("Ich bin ein UART1RX_ISR"); } |
so läuft das meiner meinung nach wunderbar :) mfg
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel