mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dezimalwert(1024) per UART empfangen WinAVR


Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

hab da ein Problem was die Bandbreite von RS232 angeht.
Ich habe bereits ein Programm geschrieben welches Dezimalzahlen am UART 
empfängt und an OCR1 ausgibt. Funktioniert auch soweit ganz gut.
ABER: Wenn ich z.B. den 10-Bit PWM Mode benutze bekomme ich den Wert 
1024 nicht in einem Stück vom PC zum µC. Wie mache ich das am besten?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1024 brauchst du ja auch nicht :-)
Sende es einfach als Ascii-Zeichen und setz es im MC wieder zu einem 
Binärwert zusammen - wo ist das Problem?

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crazy horse wrote:
> 1024 brauchst du ja auch nicht :-)
> Sende es einfach als Ascii-Zeichen und setz es im MC wieder zu einem
> Binärwert zusammen - wo ist das Problem?

Das Problem liegt im ASCII Zeichen zusammensetzen :)
Weiß nämlich net wie das geht. Aber ich guck nochmal im gcc-Tutorial.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atio ist dein Freund in diesem Fall.
Kannst es aber auch "zu Fuss" Zeichen für Zeichen machen.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atoi latürnich :-)

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo finde ich den die Syntax zu diesem Befehl?
Gibts irgendwo ne komplette gcc-Referenz?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal auf deinem Rechner geschaut?
->Pfad/zu deinem/winavr/doc/...

Da steht alles was man wissen muss (zu winavr zumindest) ;)
hth. Jörg

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boah. An dieser Anleitung verzweifel ich wirklich.
Da steht:

int atoi(const char * s)
Convert a string to an integer.
//Perfekt genau was ich will^^
The atoi() function converts the initial portion of the string pointed 
to by s to integer
//Ok auch verstanden
representation. In contrast to
(int)strtol(s, (char **)NULL, 10);
//Wasn das nu? Ich dachte es geht um atoi!
this function does not detect overflow (errno is not changed and the 
result value is
not predictable), uses smaller memory (flash and stack) and works more 
quickly.

Ich kann Englisch aber das check ich mal garnicht.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei ich gerade gemerkt habe das ich diese atoi Funktion nicht brauche 
ich kann einfach vom Empfangenen Wert z.B. 50, 48 Abziehen dann habe ich 
ASCII(2). Aber ich weiß immernoch nicht wie ich die empfangenen Zeichen 
z.B. 1,0,2,4 zu 1024 zusammensetze.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie wäre es mit 4+2*10+0*100+1*1000? Abgesehen davon dürfte dei Höchster 
Wert 1023 sein. 1024 sind schon 11 Bit.

MfG Spess

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry aber ich muss meine Frage mal neu Formulieren:

1. ASCII(0-1023) wird vom PC gesendet.     //Kann ich :)
2. µC soll z.B. 5,1,2  Empfangen           //Wie nacheinander 
abspeichern?
3. µC soll 5,1,2 zusammensetzen            //Kann ich auch nicht :(
4. Jetzt würde ich mich freuen^^

Also es können sowohl 3 stellige z.B. 512 wie auch 4 stellige Zahlen 
sein z.B. 1023.
Wie mache ich es das er die Zahlen in jeweils einer Variable abspeichert 
und am Ende zu einer zusammefügt?
Und wie erkennt er das kein weiteres Zeichen mehr kommt?

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal mein aktueller Code der nur Dezimalzahlen von 0-255 empfängt.
Nicht dass ihr denkt ich tue nichts :)
//Includes der nötigen Libarys 
#include <avr/io.h>                //Standard Input/Output-Libary
#include <avr/interrupt.h>         //Libary für Interrupts
#include <stdint.h>

//Definitionen
#define F_CPU 8000000              //CPU Frequenz
#define BAUD 38400                 //Baudrate
#define UBRR_VAL ((F_CPU/(BAUD*16UL))-1)


void USART_Init()
{
  //Baudrate wird ins Register geschrieben
  UBRRL=UBRR_VAL;               //Low-Byte
  UBRRH=(UBRR_VAL>>8);         //High-Byte
  //1 Stop-Bit, Partitiy=none, 8-Bit
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  
  //Reciver und Transmitter aktivieren
  UCSRB |= (1<<RXEN)|(1<<RXCIE);
  //Global Interrupts einschalten
  sei();
}

ISR(USART_RXC_vect)
{
    //Variable Temp und A deklarieren
  int8_t Temp;
  //Empfangene Daten an Temp übergeben
  Temp=UDR;
  //Empfangene Daten aufs PWM Register ausgeben
  OCR1A=Temp;
}

void PWM_Init()
{
    //10-Bit Phase-Correct-PWM
  TCCR1A |= (1<<WGM10)|(1<<COM1A1);
  //Kein Prescaler
  TCCR1B |= (1<<CS10);
}

int main(void)
{
  USART_Init();
  PWM_Init();
  DDRB |= (1<<1);
  while(1)
  
  return(0);
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Zum Bleistift wenn generell 4 ASCII-Zeichen gesendet werden.

MfG Spess

Autor: Johnny Maxwell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum muss es unbedingt ASCII sein? Du kannst die Daten auch einfach 
binär übertragen. Da sparst du dir viel Aufwand.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johnny Maxwell wrote:
> Warum muss es unbedingt ASCII sein? Du kannst die Daten auch einfach
> binär übertragen. Da sparst du dir viel Aufwand.

Da haste im Grunde genommen recht. Aber da ist immernoch das gleiche 
Problem mit den Zusammensetzen. Weils nicht mit einmal übertragen 
ankommt. Geht ja wie gesagt nur 8 Bit zu übertragen.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Sting vom PC ist i.d.R. dann zuende, wenn man "Enter" drückt.
Von Terminalprogrammen wird dieses Zeichen auch übertragen.
Die einfachst Möglichkeit, ASCII-Zahlen einzulesen ist:

(Pseudocode)

ISR_USART_RECV
{
  temp = UDR;
  if ((temp>='0') && (temp<=9))
   {
     Zahl = Zahl * 10 + (temp-'0');
   }
   else
   zahlkomplett = true;
}

in der main fragt man dann "einfach" ab, ob zahlkomplett == true ist, 
und speichert sie zwischen, setzt zahlkomplett = false und setzt Zahl = 
0.
Oder behandelt die Sache noch irgendwie anders...
Man kann natürlich auch erst mal alle Ziffern einlesen und dann itoa 
drüberschicken...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Dann halt 'Wert>>8' und 'Wert and $FF'.

Wenn ihr Programmieren von Unten an gelehrt hättet (Assembler), würden 
solche Fragen übehaupt nicht aufkommen.

MfG Spess

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Binärübertragung hinkt immer ein wenig, da alle Bytes vorkommen können.
Damit wird es schwierig, eindeutige Informationen zu übermitteln (geht 
natürlich trotzdem, wenn ein Protokoll drüberliegt)
Mit Ascii ist das alles einfacher auf der Übertragungsstrecke (nebenbei 
kann man noch im Klartext mit einem Terminalprogramm mitlesen), 
effektive Datenrate halbiert sich allerdings in etwa. Aber das ist ja 
hier nicht das Problem :-)

Autor: Johnny Maxwell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da haste im Grunde genommen recht. Aber da ist immernoch das gleiche
> Problem mit den Zusammensetzen. Weils nicht mit einmal übertragen
> ankommt. Geht ja wie gesagt nur 8 Bit zu übertragen.

Problem beim Zusammensetzen?
var16 = low_byte + (high_byte << 8);

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.