mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega Uart - Sendeplatine - c code


Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe mal eine Frage, auf YouTube habe ich eine/mehrere Video/s gefunden
die das Senden mit einem ATMega beschreiben.
zB.: Youtube-Video "Learning AVR-C Episode 10: Serial Communication (TX)"
Das ist auch alles weit funktional. Ich betreibe den AT mit einem Akku 
und an ihn hängt eine Sende Platine, die viel Strom verbraucht. Jetzt 
würde ich gerne die Platine mit einem FET vor den senden einschalten. So 
das mein Akku länger hält, doch wie kann das mit dem IRQ-Sende-Routine 
einbauen?
ISR(USART_TX_vect)
{
  if(serialReadPos != serialWritePos)
  {
    UDR0 = serialBuffer[serialReadPos];
    serialReadPos++;
    
    if(serialReadPos >= TX_BUFFER_SIZE)
    {
      serialReadPos = 0;
    }
  }
}

Gruß

Michi

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Sendeinterrupt ist die falsche Stelle dafür, denn vermutlich braucht 
Deine "Sendeplatine" nach dem Einschalten etwas Zeit für sich, bis sie 
aktiv und verwendbar ist.

Der Sendeinterrupt wird für jedes einzelne zu sendende Zeiten 
aufgerufen, Du willst ganz sicher nicht Deine "Sendeplatine" für jedes 
einzelne Zeichen ein- und wieder ausschalten.

Finde in Deinem Programm heraus, wann es der Ansicht ist, Daten 
versenden zu wollen, schalte dort Deine "Sendeplatine" ein, warte, bis 
sie bereit ist (entweder stur Zeit verstreichen lassen oder, sofern 
vorhanden, Statusleitung o.ä. abfragen), und sende dann. Mit einem Timer 
o.ä. verzögerst Du das Abschalten der Sendeplatine, als Dauer kannst Du 
die Übertragungszeit eines Zeichens mit der Anzahl der zu übertragenden 
Zeichen multiplizieren (und noch etwas draufzählen, damit sicher die 
Abschaltung erst dann erfolgt, wenn das letzte Zeichen auch wirklich 
versendet wurde).

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke für die Antwort, ich habe eine Routine die addChar (c char); 
heißt,
diese fügt in den Sende Buffer das Zeichen ein. Und das Senden erfolgt 
somit automatisch ISR.
addChar(c char)
{
  serialBuffer[serialWritePos] = c;
  if(serialWritePos >= TX_BUFFER_SIZE)
    {
      serialWritePos = 0;
    }
  }
}

Da der Controller mehr macht, kann ich somit nicht sagen, wann er 
sendet. Aus diesem Grunde wäre es schön wenn er in ISR automatisch das 
Senden aktiviert und deaktiviert.

Gruß

Michi

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.