Hi, ich hoffe ich spreche hier kein Thema an dass schon in einem anderen Beitrag erläutert wurde wenn ja bitte mich darauf hinzuweisen, Ich Arbeite mit 4 ATMEGA_128 die alle an einen Bus angeschlossen sind. Ich benötige nun für mein Protokoll sowohl SW als auch HW UART. Seperat habe ich beide getestet -> beide funktionieren und liefern die gewünschten Datem. Wenn ich aber beide hintereinander verwednen möchte(HW - deaktivieren,SW Aktivieren) stoppt der Timer des MAster knoten (Timer 3 als globaler Timer da ich den Input capture von Timer 3 verwednde). Sonderbarerweise läuft der Slave Knoten weiter. Gibt es einen Zusätzlichen Registerwert den ich beachten muss beim Umschalten der beiden UART varianten. mfg dog
dog wrote:
> Ich benötige nun für mein Protokoll sowohl SW als auch HW UART.
Schön für Dich.
Da wir aber nicht wissen, wie Du SW- und HW-UART realisierst, kann man
auch nichts weiter dazu sagen.
Du mußt schon den vollständigen Sourcecode Deiner SW- und HW-UART posten
und wie Du ihn verwendest.
Und welchen Compiler wäre auch nicht schlecht.
Peter
Den ganzen Source code zu Posten wär wohl etwas zu lange. Deshalb beschränke ich mich momentan auf Initialisierungen der Uart Module. SW_UART Initialisierung:
1 | #ifdef SUART_RXD
|
2 | |
3 | SUART_RXD_DDR &= ~(1<<SUART_RXD_BIT); |
4 | SUART_RXD_PORT |= (1<<SUART_RXD_BIT); |
5 | ETIMSK |= (1<<TICIE3); //INput Capture Interrupt enable |
6 | etifr |= (1<<ICF3) | (1<<OCF3B); //Timer counter input capture flag, Outputcompare b Match flag |
7 | #else
|
8 | |
9 | ETIMSK &= ~(1<<TICIE3); |
10 | #endif //SUART_RXD
|
11 | |
12 | //Sendeinitlaisierung
|
13 | |
14 | #ifdef SUART_TXD
|
15 | |
16 | etifr |= (1<<OCF3A); |
17 | SUART_TXD_PORT |= (1<<SUART_TXD_BIT); |
18 | SUART_TXD_DDR |= (1<<SUART_TXD_BIT); |
19 | outframe = 0; |
20 | #endif
|
HW UArt Initialisierung:
1 | //Data Direction für Senden
|
2 | HWUART0_DDR |= (_BV(HWUART0_TXD)); |
3 | //Baud berechnen
|
4 | BAUDRATE_REG_0_H = (UART_BAUDRATE_MAGIC(baud) >> 8) & 0xFF; |
5 | BAUDRATE_REG_0_L = UART_BAUDRATE_MAGIC(baud) & 0xFF; |
6 | //UART enable + Interrupt enable
|
7 | UART_CONTROL_REGISTER_0_B |= _BV(RXCIE0) | _BV(TXCIE0) | _BV(RXEN0) | _BV(TXEN0); |
8 | //Mode einstellung
|
9 | UART_CONTROL_REGISTER_0_C |= mode |((1<<UCSZ00)|(1<<UCSZ01)); /* 8-Bit mode*/ |
Der Timer/Counter 3 erledigt das komplette timing (damit nur ein counter für die komplette Protokollstruktur verwendet wir) Die Header befinden sich im Anhang. Ich glaube nur kaum dass man aus diesen Bruchteilen etwas herauslesen kann, darum war meine Frage zuerst Allgemein gefasst ob es einen bekannten Fallstrick gibt den Man unbedingt beachten muss, wie zu Beispiel die Wert im DDR von SW UART TX und RX änderern, dass es hier nicht zu STörungen kommen kann. Desswegen war meine Frage voresrst ohne Sourcecode. Das Komplette Projekt kann ich leider nicht als Anhanh inkludieren. mfg dog PS: Compiler: gcc
David Gaisbauer wrote: > Ich glaube nur kaum dass man aus diesen Bruchteilen etwas herauslesen > kann, Stimmt, das kann man nicht. Du zeigst nirgends den Code, der was mit Timer 3 macht, aber willst Probleme mit Timer 3 geklärt haben. Das geht natürlich nicht. Was soll das überhaupt heißen, UART deaktivieren? Eine UART deaktiviert man normaler Weise nicht, weil sie dann nicht mehr auf das Startbit testen kann. D.h. man läuft Gefahr beim wieder Aktivieren mitten in ein Byte zu springen und nur noch Müll zu empfangen. Warum aktivierst Du nicht einfach alle 3 UARTs nach dem Reset und läßt sie dann an? Peter
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.