mikrocontroller.net

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


Autor: dog (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David Gaisbauer (dog)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#ifdef SUART_RXD
    
    SUART_RXD_DDR &= ~(1<<SUART_RXD_BIT);
    SUART_RXD_PORT |= (1<<SUART_RXD_BIT);
    ETIMSK |= (1<<TICIE3);  //INput Capture Interrupt enable
    etifr |= (1<<ICF3) | (1<<OCF3B); //Timer counter input capture flag, Outputcompare b Match flag
  #else 
    
    ETIMSK &= ~(1<<TICIE3);
  #endif //SUART_RXD

  //Sendeinitlaisierung

  #ifdef SUART_TXD

    etifr |= (1<<OCF3A);
    SUART_TXD_PORT |= (1<<SUART_TXD_BIT);
    SUART_TXD_DDR |= (1<<SUART_TXD_BIT);
    outframe = 0;
  #endif


HW UArt Initialisierung:

//Data Direction für Senden 
    HWUART0_DDR |= (_BV(HWUART0_TXD));
    //Baud berechnen
    BAUDRATE_REG_0_H = (UART_BAUDRATE_MAGIC(baud) >> 8) & 0xFF;
    BAUDRATE_REG_0_L = UART_BAUDRATE_MAGIC(baud) & 0xFF;
    //UART enable + Interrupt enable
    UART_CONTROL_REGISTER_0_B |= _BV(RXCIE0) | _BV(TXCIE0) | _BV(RXEN0) | _BV(TXEN0);
    //Mode einstellung
    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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.