Forum: Mikrocontroller und Digitale Elektronik Atmega UART Befehle senden


von Prof. Chaos (Gast)


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

von ?? (Gast)


Lesenswert?

Ja. Sicher. Mit einem Protokoll. Das ist eine Verfahrensweise wie man 
gesendete Daten auswertet.

von Prof. Chaos (Gast)


Lesenswert?

gibt es da aber bereits fertige Codes?

von Bastinator (Gast)


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.
1
 
2
3
#define BUFLEN 128
4
volatile unsigned char buffer[BUFLEN];
5
volatile unsigned char rx_ptr = 0;
6
7
SIGNAL(SIG_UART_RECV)
8
{
9
  buffer[rx_ptr] = UDR;           
10
  if (++rx_ptr >= BUFLEN) rx_ptr = 0;
11
}

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.
1
void main()
2
{
3
  unsigned char temp_buf [BUFLEN];
4
  while(1)
5
  {
6
     // Do some fancy stuff
7
     if (buffer[rx_ptr-1] == '\n')
8
     {
9
        // Kopiere buffer in temp_buf, damit ein erneutes SIGNAL dir den buf nicht zerschießt
10
       // werte temp_buf aus. nen anhaltspunkt ist ein switch()case-Konstrukt
11
     }
12
}

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

von Karl H. (kbuchegg)


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.

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.