www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega UART Befehle senden


Autor: Prof. Chaos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ist es mit einfachen Mitteln möglich bei einem AVR und über UART 
angeschlossenen PC Befehle zu senden, zum Beispiel um Register zu setzen 
bzw abzufragen?

Gruß
Chaos

Autor: ?? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Sicher. Mit einem Protokoll. Das ist eine Verfahrensweise wie man 
gesendete Daten auswertet.

Autor: Prof. Chaos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es da aber bereits fertige Codes?

Autor: Bastinator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Spass beiseite. Bemüht mann gooooogle oder die forensuche findet man 
hier einiges. Sogar im GCC-Tutorial für den AVR im bereich UART findet 
man entsprechende links.

das einfachste ist, einfach das signal SIG_UART_RECV auswerten.
bzw ne FIFO oder nen Puffer bauen.
 

#define BUFLEN 128
volatile unsigned char buffer[BUFLEN];
volatile unsigned char rx_ptr = 0;

SIGNAL(SIG_UART_RECV)
{
  buffer[rx_ptr] = UDR;           
  if (++rx_ptr >= BUFLEN) rx_ptr = 0;
}


Du definierstt dir einen Puffer, jedesmal, wenn die UART ein Zeichen 
empfängt, hängst du es an den puffer an und inkrementierst den 
Schreibzeiger.
Am besten Pollst du nun oder, wenns nicht zu Komplex ist, bastelst du 
die Auswertung in die SIGNAL ISR mit rein. Pollen kommt aber IMHO 
(wirklich nur meine meinung!) am besten.
Du prüfst nun, ob das zeichen rx_ptr-- == \n (oder was immer du als 
"kommando vollständig" haben möchtest) ist. wenn dies so ist, wertest du 
den Inhalt (abzgl. \n) aus und setzt rx_ptr wieder auf 0.

d.h.
void main()
{
  unsigned char temp_buf [BUFLEN];
  while(1)
  {
     // Do some fancy stuff
     if (buffer[rx_ptr-1] == '\n')
     {
        // Kopiere buffer in temp_buf, damit ein erneutes SIGNAL dir den buf nicht zerschießt
       // werte temp_buf aus. nen anhaltspunkt ist ein switch()case-Konstrukt
     }
}

ich denke, so in etwa müsste es klappen. ich arbeite zwar beruflich viel 
mit c/c++, aber in der uC-Welt bin ich noch nicht allzulange zu hause.
wie gesagt. das meiste findet man bei google......

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastinator schrieb:
> das einfachste ist, einfach das signal SIG_UART_RECV auswerten.
> bzw ne FIFO oder nen Puffer bauen.

Das ist schon gar nicht mal so verkehrt.


>      // Do some fancy stuff
>      if (buffer[rx_ptr-1] == '\n')
>      {

Das geht aber mit Sicherheit schief.

Schlag ihm keinen Ringbuffer vor, wenn du ihn noch nicht beherrscht.
Ein stinknormaler linearer Buffer in dem Zeichen bis zum '\n' gesammelt 
werden (in der ISR) tuts fürs erste auch und ist für den TO leichter zu 
beherrschen.

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.