Dezimalwert(1024) per UART empfangen WinAVR

OP Persönliche Seite #812226
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?
OP Persönliche Seite #812303
Lesenswert?
• ▲
▼
Boah. An dieser Anleitung verzweifel ich wirklich.
Da steht:

int atoi(const char * s)
Convert a string to an integer.
1
//Perfekt genau was ich will^^
The atoi() function converts the initial portion of the string pointed 
to by s to integer
1
//Ok auch verstanden
representation. In contrast to
(int)strtol(s, (char **)NULL, 10);
1
//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.
OP Persönliche Seite #812391
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?
OP Persönliche Seite #812394
Lesenswert?
• ▲
▼
Hier mal mein aktueller Code der nur Dezimalzahlen von 0-255 empfängt.
Nicht dass ihr denkt ich tue nichts :)
1
//Includes der nötigen Libarys 
2
#include <avr/io.h>                //Standard Input/Output-Libary
3
#include <avr/interrupt.h>         //Libary für Interrupts
4
#include <stdint.h>
5

6
//Definitionen
7
#define F_CPU 8000000              //CPU Frequenz
8
#define BAUD 38400                 //Baudrate
9
#define UBRR_VAL ((F_CPU/(BAUD*16UL))-1)
10

11

12
void USART_Init()
13
{
14
  //Baudrate wird ins Register geschrieben
15
  UBRRL=UBRR_VAL;               //Low-Byte
16
  UBRRH=(UBRR_VAL>>8);         //High-Byte
17
  //1 Stop-Bit, Partitiy=none, 8-Bit
18
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  
19
  //Reciver und Transmitter aktivieren
20
  UCSRB |= (1<<RXEN)|(1<<RXCIE);
21
  //Global Interrupts einschalten
22
  sei();
23
}
24

25
ISR(USART_RXC_vect)
26
{
27
    //Variable Temp und A deklarieren
28
  int8_t Temp;
29
  //Empfangene Daten an Temp übergeben
30
  Temp=UDR;
31
  //Empfangene Daten aufs PWM Register ausgeben
32
  OCR1A=Temp;
33
}
34

35
void PWM_Init()
36
{
37
    //10-Bit Phase-Correct-PWM
38
  TCCR1A |= (1<<WGM10)|(1<<COM1A1);
39
  //Kein Prescaler
40
  TCCR1B |= (1<<CS10);
41
}
42

43
int main(void)
44
{
45
  USART_Init();
46
  PWM_Init();
47
  DDRB |= (1<<1);
48
  while(1)
49
  
50
  return(0);
51
}
OP Persönliche Seite #812415
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.
Gast #812420
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...
Gast #812422
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 :-)
Gast #812423
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?
1
var16 = low_byte + (high_byte << 8);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren