hallo, ich habe einen Timerinterrupt wo jede 200µs auslöst. beim senden eines Telegrams mit folgender funktion empfängt der slave nichts. ich vermute das beim senden der timer interrupt immer wieder auslöst. aber bin mir nicht sicher. das senden ist folgendermaßen realisiert for(i=0;i<=bByteAnzahl+7;i++) { USART_SendData(USART1, abTelegram[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } wenn ich ein Delay einfüge funktioniert alles, aber braucht lange for(i=0;i<=bByteAnzahl+7;i++) { USART_SendData(USART1, abTelegram[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); Delay(1); } kann mir jemand helfen?
Hallo! Vielleicht solltest du deinen Aufbau genauer erklären und vlt etwas mehr von deinem Code posten. Aus deiner Angabe heraus kann ich dein Problem nicht nachvollziehen. Danke, lg Franz
bei einem laufenden 200us timer-interrupt ist while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); wohl nicht die geeignetste Methode um UART Daten zu senden. Benutze den UART Interrupt.
und wie verwende ich den usart interrupt zum senden? kenn nur den zum empfangen
Das funktioniert bei mir immer trotz heftiger ISRs im Hintergrund:
1 | void uart_put(uint8_t ch) |
2 | {
|
3 | while ((USART1->SR & USART_FLAG_TXE) < 1) {}; |
4 | USART1->DR = ((uint8_t) ch & (uint16_t)0x01FF); |
5 | }
|
Kannst dem USART höhere Prio verpassen, aber dann sind deine 200us nicht mehr garantiert.
stmler schrieb: > nein funktioniert leider nicht Was funktioniert nicht? Bei mir läuft alle 30 µs ein Timer IRQ (BLDC Steuerung) auf und ich verliere keine Zeichen. Wohlgemerkt hat mein USART Codeschnipsel nichts mit Interrupts zu tun, der läuft aus dem Hauptprogramm.
Matthias Sch. schrieb: > Was funktioniert nicht? Bei mir läuft alle 30 µs ein Timer IRQ (BLDC > Steuerung) auf und ich verliere keine Zeichen. Wohlgemerkt hat mein > USART Codeschnipsel nichts mit Interrupts zu tun, der läuft aus dem > Hauptprogramm. auf der schnittstelle kommt nur müll raus. wenn ich ein delay wie oben beschrieben einfüge, dann erhalte ich die daten auf der schnittstelle
stmler schrieb: > Matthias Sch. schrieb: >> Was funktioniert nicht? Bei mir läuft alle 30 µs ein Timer IRQ (BLDC >> Steuerung) auf und ich verliere keine Zeichen. Wohlgemerkt hat mein >> USART Codeschnipsel nichts mit Interrupts zu tun, der läuft aus dem >> Hauptprogramm. > > auf der schnittstelle kommt nur müll raus. wenn ich ein delay wie oben > beschrieben einfüge, dann erhalte ich die daten auf der schnittstelle Du musst prüfen, ob du senden darfst...
Daniel V. schrieb: > Du musst prüfen, ob du senden darfst... wie überprüf ich das? die anderen teilnehmer senden nicht, da ist nur ein terminal program angeschlossen als empfänger
So funktionierts mit sende ISR in dem Beispiel benutze ich eine FIFO, man kann aber auch die Daten direkt schreiben
1 | void USART1_IRQHandler(void) { |
2 | |
3 | unsigned char tmptail; |
4 | |
5 | if (USART_GetFlagStatus(USART1, USART_FLAG_TXE ) == SET) { |
6 | if (UART1_TxHead != UART1_TxTail) { |
7 | /* calculate and store new buffer index */
|
8 | tmptail = (UART1_TxTail + 1) & UART1_TX_BUFFER_MASK; |
9 | UART1_TxTail = tmptail; |
10 | /* get one byte from buffer and write it to UART */
|
11 | USART_SendData(USART1, UART1_TxBuf[tmptail]); |
12 | } else { |
13 | /* tx buffer empty, disable UDRE interrupt */
|
14 | USART_ITConfig(USART1, USART_IT_TXE, DISABLE); |
15 | }
|
16 | }
|
17 | }
|
18 | |
19 | extern void uart1_putc(unsigned char data){ |
20 | uint8_t tmphead; |
21 | |
22 | tmphead = (UART1_TxHead + 1) & UART1_TX_BUFFER_MASK; |
23 | |
24 | while (tmphead == UART1_TxTail) { |
25 | ;/* wait for free space in buffer */ |
26 | }
|
27 | |
28 | UART1_TxBuf[tmphead] = data; |
29 | UART1_TxHead = tmphead; |
30 | |
31 | /* enable interrupt */
|
32 | USART_ITConfig (USART1, USART_IT_TXE, ENABLE); |
33 | |
34 | }
|
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.