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


von Michi (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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).

von Michi (Gast)


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.
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

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.