Forum: Mikrocontroller und Digitale Elektronik ASCII einlesen für Port


von Sandra (Gast)


Lesenswert?

Liebe Kollegen!

Ich habe (schon wieder) ein Problem.

Ich möchte über die RS232 24-Bit einlesen und an 2 Ports senden.

Das einlesen funktioniert (habe einen Echo Test gemacht). Ich habe auch 
eine for-Schleife gemacht damit das Unterprogramm genau 3 Werte 
einliest.
1
void set_DAC(void)
2
{
3
   int DAC_value=0;
4
   int j=0;
5
   
6
   text="\r\nEnter Value (e.g. fff)";
7
   if (men==1)SendUSART1(text); //Ausgabe nur wenn Menü eingeschaltet ist
8
   for (j=0;j<3;j++)
9
     {while (!(IFG2 & URXIFG1));
10
      DAC_value=RXBUF1<<j;
11
     }
12
   WR_DAC(DAC_value,0x000);
13
   text="\r\nBeam me up, Scotty";
14
   if (men==1)SendUSART1(text);
15
}


Leider habe ich Probleme mit den Werten. Muss ich die vorher 
konvertieren? Also die Werte 0 bis 9 minus 30 und A bis F minus 51?
Gibt es da eine Funktion?
???

DANKE für Eure Hilfe

Bussi Sandy

von Karl H. (kbuchegg)


Lesenswert?

Sandra schrieb:


> Leider habe ich Probleme mit den Werten. Muss ich die vorher
> konvertieren?

Wenn die Werte dadurch entstehen, dass du auf einer Tastatur die 
entsprechenden Tasten drückst, dann ja.

> Also die Werte 0 bis 9 minus 30 und A bis F minus 51?
> Gibt es da eine Funktion?

Nix fertiges. So eine Funktion ist aber schnell geschrieben.

von Helfer (Gast)


Lesenswert?

>    text="\r\nEnter Value (e.g. fff)";

Aus dem Text "fff" könnte ich nur 12 Bit ziehen. Für 24 Bit wäre eine 
Beispieleingabe in Textform "ABCDEF" oder "A0B1C3", wenn die Eingabe 
hexadezimal (=> Zahlensysteme) sein soll.

von Helfer (Gast)


Lesenswert?

Weil die Eingabe durch einen Benutzer (Irrungen & Wirrungen) erfolgt, 
würde ich auch eine Plausibilitätsprüfung machen und nicht die 
ungeprüfte Eingabe direkt an die DAC senden.

Geprüft werden könnte, dass
# nur Hexadezimale Zeichen eingegeben wurden (0-9A-Fa-f)
# genau sechs Zeichen eingegeben wurden

von Sandra (Gast)


Lesenswert?

Ja, sorry. Natürlich 12 Bit

von Sandra (Gast)


Lesenswert?

Wenn ich die Irrungen mal weglasse würde ich das eingeben
1
void set_DAC(void)
2
{
3
   int DAC_value=0;
4
   int j=0;
5
   
6
   text="\r\nEnter Value (e.g. fff)";
7
   if (men==1)SendUSART1(text);
8
   for (j=0;j<3;j++)
9
     {while (!(IFG2 & URXIFG1));
10
      if (RXBUF1<0x60) DAC_value=RXBUF1-30;
11
      else DAC_value=RXBUF1-51;
12
      DAC_value=DAC_value<<j;
13
     }
14
   WR_DAC(DAC_value,0x000);
15
   text="\r\nBeam me up, Scotty";
16
   if (men==1)SendUSART1(text);
17
}

da kommt aber beim DAC nicht das richtige an.

???

von DirkB (Gast)


Lesenswert?

Zahlenformat-Wirrwarr

'0' = 0x30 = 48
'A' = 0x41 = 65

von Karl H. (kbuchegg)


Lesenswert?

Du kriegst von mir einen Preis für den unverständlichsten und am 
schlechtesten auf Korrektheit prüfbaren Code.

Was ist so schwer daran, sich für eine Standard-Aufgabe eine 
Standardfunktion zu schreiben. Da kann man dann auch gleich noch ein 
paar Sonderfälle (Groß/Kleinbuchstaben) abfangen und zumindest 
rudimentäres Fehlerchecking betreiben
1
uint8_t toValue( char c )
2
{
3
  if( isdigit( c ) )
4
    return c - '0';
5
6
  if( c >= 'a' && c <= 'f' )
7
    return c - 'a' + 10;
8
9
  if( c >= 'A' && c <= 'F' )
10
    return c - 'A' + 10;
11
12
  return 0;
13
}
14
15
char uart_getc()
16
{
17
  while (!(IFG2 & URXIFG1))
18
    ;
19
  return RXBUF1;
20
}
21
22
void set_DAC(void)
23
{
24
   unsigned int DAC_value = 0;
25
   int j=0;
26
   
27
   if (men == 1)
28
     SendUSART1( "\r\nEnter Value (e.g. fff)" );
29
30
   for (j = 0; j < 3; j++)
31
   {
32
     DAC_value = (DAC_value << 8) | toValue( uart_getc() );
33
   }
34
35
   {  // Debughilfe
36
     char buffer[20];
37
     sprintf( buffer, "\r\nSetting DAC to 0x%04x", (int)DAC_value );
38
     SendUSART1( buffer );
39
   }
40
41
   WR_DAC( DAC_value, 0x000 );
42
43
   if (men==1)
44
     SendUSART1( "\r\nBeam me up, Scotty" );
45
}

Wo liegt das Problem bei ein bischen Code-Arbeit? Zu lesbar? Nicht 
kryptisch genug?

von Sandra (Gast)


Lesenswert?

Super, danke.

Die Unfreundlichkeit bereden wir nicht da Du mir wirklich sehr geholfen 
hast.

LG
Sandy

von Volkmar D. (volkmar)


Lesenswert?

Einer der Hauptgründe, warum beim DAC nicht das Richtige ankam:

Sandra schrieb:
> if (RXBUF1<0x60) DAC_value=RXBUF1-30;
>       else DAC_value=RXBUF1-51;
>       DAC_value=DAC_value<<j;

Das Zusammensetzen des Wertes ist nicht korrekt. Ohne es jetzt weiter 
aufzudrösseln gehe ich auf den Vorschlag von Karl Heinz ein:

Karl Heinz Buchegger schrieb:
> for (j = 0; j < 3; j++)
>    {
>      DAC_value = DAC_value << 8 | toValue( uart_getc() );
>    }

Deutlich übersichtlicher, man erkennt das der alte Wert um die 
entsprechende Potenz verschoben wird, bevor der neue Wert hinzugefügt 
wird. Leider ein kleiner Tippfehler, da ja mit jedem Tastendruck ein 
Nibble (4 Bit) hinzukommt, muß der Zielwert auch um 4 Bit verschoben 
werden:
1
DAC_value = DAC_value << 4 | toValue( uart_getc() );

von Sandra (Gast)


Lesenswert?

JA, das funktioniert.

Hab auf jeden Fall was gelernt! DANKE

von Karl H. (kbuchegg)


Lesenswert?

Sandra schrieb:
> Super, danke.
>
> Die Unfreundlichkeit bereden wir nicht da Du mir wirklich sehr geholfen
> hast.
>

Das liegt daran, dass ich dir vor über einer Stunde schon geschrieben 
habe: Schreib dir dafür eine Funktion!

Ich warte immer noch auf den ersten Lernenden, der nicht auf die harte 
Tour lernen muss, dass Codeorganisation ein Werkzeug zur 
Fehlervermeidung darstellt und man sich mit möglichst kryptisch eng 
zusammengestauchtem Code nur selbst ein Bein stellt.

von Karl H. (kbuchegg)


Lesenswert?

Volkmar Dierkes schrieb:

> wird. Leider ein kleiner Tippfehler, da ja mit jedem Tastendruck ein
> Nibble (4 Bit) hinzukommt, muß der Zielwert auch um 4 Bit verschoben
> werden:

Ah danke. Das hab ich wirklich übersehen.

Aber durch die Debugausgabe danach (anstelle des völlig sinnlosen "Beam 
me up Scotty") wäre es aufgefallen.

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.