www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Befehl empfangen mit UART und auswerten


Autor: Mimo Abid (mimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich brauche eure Hilfe!
ich habe geschaft bis jetzt ein Zeichnen auf mein Mikrokontroler(type: 
AT90PWM von Atmel) zu empfangen und zu bewerten. Ich möchte jetzt eine 
Zahle von 0 bis 360 empfangen und in einem register im mikro speicher, 
damit wird getzhält bis  zum diesem Zahl.
Bis jetzt löst sich immer der Receive-Interrupte bei Empfang eines 
Zeichen.
Wie kann ich mehrer zeichenempfangen(zm: 3 byte für einen Zahl und 
umwandlen in einem short variable)
ich danke euch voraus!
hier ist der code.

#include <avr/io.h>
#include <inttypes.h>
#include <stdint.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#define uart_baud 9600
#define UART_BAUD_SELECT ((F_CPU / (uart_baud * 16L))-1)


// Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer 
liegen
SIGNAL(SIG_UART_RECV)
{  unsigned char buffer;
  // Daten aus dem Puffer lesen ...
  buffer = UDR;

  switch (buffer)
  {
  case 'a': PORTE = 0x02;break;
  case 'b': PORTE = 0x04;break;
  default : break;
  }
  // ... warten bis der Sendepuffer leer ist ...
  while ( !( UCSRA & (1<<UDRE)) )
    ;
  // ... und gleich wieder zurück schicken
  UDR = buffer;
}

/////////Init///////////////////
void uart_init(void)
{
  UBRRH=(UART_BAUD_SELECT>>8);
  UBRRL=UART_BAUD_SELECT;
  UCSRB |= (1<<RXCIE)|(1<<TXEN) |(1<<RXEN);  //Transmitter Enabled 
,Emfpang enabl
  UCSRC |= (0<<UMSEL)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); 
//Asynchron 8N1
}
/////////////Senden UART---->PC///////////////
void sendeByte(unsigned char data)
{
  while (!(UCSRA & (1<<UDRE)));
  UDR = data;
}

////////////////// SENEDE STRINGE
void put_string(unsigned char *zeiger)
{
  while (*zeiger !=0)
  {  while (!(UCSRA & (1<<UDRE)));
  UDR=*zeiger;
  *zeiger++;
  }
}


int main(void)
{
  DDRE=0xff;
  PORTE=0x00;
  uart_init();
  unsigned char promt[]="Hallo";
  put_string(promt);
  sei();
  while (1);
  return 0;
}

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

Bewertung
0 lesenswert
nicht lesenswert
#define F_CPU 8000000

Beliebter Fehler.

Das ist zu groß für eine int-Konstante, hänge da noch das Suffix L an:
#define F_CPU 8000000L

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

Bewertung
0 lesenswert
nicht lesenswert
Mimo Abid wrote:
> Wie kann ich mehrer zeichenempfangen(zm: 3 byte für einen Zahl und
> umwandlen in einem short variable)

Du fängst mal damit an, dass du die Zeichen in der UART Empfangsroutine
nicht direkt auswertest, sonden in einem Buffer (einem char Array)
zwischenspeicherst. Das machst du solange bis ein vereinbartes
Ende Zeichen (zb. Carriage Return) daherkommt woraufhin du den
Bufferinhalt zur 'vollständigen Zeile' erklärst, dir zb ein
globales Flag auf true stellst und in der Hauptschleife denn
Bufferinhalt abarbeitest

ungefähr so

volatil uint8_t  LineComplete;       // wenn 1: Zeile komplett
char     Buffer[128];                // hier entsteht die Zeile
uint8_t  NextCharInBuffer;           // Char Zähler für den Buffer

ISR( ... )
{
  char c = UDR;

  if( c == '\n' ) {
     // Zeile ist fertig. Mach einen String daraus
     Buffer[NextCharInBuffer] = '\0';
     // mit dem nächsten Zeichen wird wieder vorne angefangen
     NextCharInBuffer = 0;
     // und aller Welt mitteilen, dass im Buffer ein gültiger
     // String existiert
     LineComplete = 1;
   }

   else {
     Buffer[NextCharInBuffer] = c;
     NextCharInBuffer++;
   }
}


int main()
{
   ....

   LineComplete = 0;
   NextCharInBuffer = 0;

   ...

   sei();

   while( 1 ) {

     if( LineComplete ) {   // eine vollständige Zeile empfangen
                            // mach was damit

       ...

       LineComplete = 0;    // Zeile wurde abgearbeitet
     }
   }
}

Obiges enthält noch keine Fehlerbehandlung und auch der
Fall, dass eine Zeile nicht schnell genug abgearbeitet wurde
ehe das nächste Zeichen eintrifft wurde nicht behandelt.
Aber dafür kannst du dir ja selbst was ausdenken.

Autor: Mimo Abid (mimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke leute für den schnell antwort. Bei mir heisst die Interuppt 
Routine : ISR(USART_RXC_vect)
ich bekomme den folgenden warning:

../UART_Senden.c:47: warning: `USART_RXC_vect' appears to be a 
misspelled signal handler

weisst jemanden was das bedeuted?

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

Bewertung
0 lesenswert
nicht lesenswert
'misspelled' heist 'falsche Schreibweise' oder 'Tippfehler'.

Die komplette Fehlermeldung heist also übersetzt:

`USART_RXC_vect' appears to be a misspelled signal handler

'USART_RXC_vect schaut nach einem falsch geschriebenen
Namen für den Handler aus'

Der Compiler hat also erkannt, dass du eine ISR schreiben
willst, allerdings hat er mit dem Namen USART_RXC_vect
nichts anfangen können. Seiner Meinung nach gibt es keine
ISR die so heissen kann.

Und wie wir alle wissen: Der Compiler hat immer recht.

Autor: Mimo Abid (mimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie oder wo bekomme ich den richtigen Namem für mein 
interupt_receive routine?

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mimo Abid wrote:
> und wie oder wo bekomme ich den richtigen Namem für mein
> interupt_receive routine?

Durch Nachschauen in der zugehörigen Dokumentation!

MfG, Heidelbär  ääähhh Blaubär

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.