Atmega Uart - Sendeplatine - c code

Gast #4729173
Hallo,

habe mal eine Frage, auf YouTube habe ich eine/mehrere Video/s gefunden
die das Senden mit einem ATMega beschreiben.
zB.: https://www.youtube.com/watch?v=3_omxGIL0kw
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?
1
ISR(USART_TX_vect)
2
{
3
  if(serialReadPos != serialWritePos)
4
  {
5
    UDR0 = serialBuffer[serialReadPos];
6
    serialReadPos++;
7
    
8
    if(serialReadPos >= TX_BUFFER_SIZE)
9
    {
10
      serialReadPos = 0;
11
    }
12
  }
13
}

Gruß

Michi
Persönliche Seite #4729256
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).
Gast #4729589
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.
1
addChar(c char)
2
{
3
  serialBuffer[serialWritePos] = c;
4
  if(serialWritePos >= TX_BUFFER_SIZE)
5
    {
6
      serialWritePos = 0;
7
    }
8
  }
9
}

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

Eine eigene Frage? Dieser Thread ist über 10 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.