Forum: Mikrocontroller und Digitale Elektronik Umschalten zw. HW UART und SW UART am ATMEGA 128


von dog (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von David G. (dog)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.