Umschalten zw. HW UART und SW UART am ATMEGA 128

Gast #929402
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
#929416
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
#929639
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
Angehängte Dateien:
#929654
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.