PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ascii in int



sigbert
31.07.2006, 00:59
hallo

ich habe da ein kleines prob auf das ich gestossen bin

da ich nicht wirklich fit in c bin ... aber zumindest etwas davon rumzubrobieren...

nun habe ich mit dem myavr bord (ATmega8) und dem prog
myavr workpad plus ... es geschafft zei analoge eingänge
zu nutzen und diese aufs diplay anzeigen zu lassen ...

nur leider schmeist er mir ascii werte raus und dabei
hätt ich doch so gerne zahlen zb

adc1 -170.... 170
adc2 -35.... 35

adc laufen beide mit 10bit auflösung

kann mir da wer helfen ???

gruss vom übermüdeten sigbert

simonit
31.07.2006, 01:25
Hallo

Probiers mal mit

char c = 'A';
int i = (int)c; // i enthält jetzt den Wert 65.
oder für deinen Fall vielleicht besser geeignet:


//adc1 ist ja (anscheinend) schon als char deklariert, deshalb:
int hilfsvar=int(adc1);


ASCII-Werte gehen von 0 bis 255, also würde es mich interressieren was es dir für negative Werte welche ASCII-Zeichen ausgibt.

CowZ
31.07.2006, 08:52
Hi,

auch nach der oben genannten Methode wirst du ASCII-Zeichen auf dein Display bekommen. (Die Methoden oben ändern nämlich irgendwie nichts, außer, dass er Probleme bekommen wird, sobald "(adc1 > 127) == true" gilt, da int (hier wohl als 8-bit zu verstehen) nur bis 127 geht.)

Was du brauchst: eine Methode ASCII -> BCD.
Dann addierst du jeweils 48 dazu. Die einzelnen Zahlen gibt's du dann hintereinander auf dem Display aus.

(Für Umwandlungsfunktionen siehe: http://www.avr-asm-tutorial.net/avr_de/rechnen/konversion.html)

Gruß, CowZ

Jahn Kohlhas
31.07.2006, 09:37
Hallo Siegbert,

ich habe mir einfach mal das Beispiel "LCD_Balken" aus dem Workpad genommen und etwas abgeändert:



//---------------------------------------------------------------------------
// Title : Wandelt ein analoges Signal und gibt es auf LCD aus
//---------------------------------------------------------------------------
#define F_CPU 3686400
#include <avr\io.h>
#include <util\delay.h>
#include <stdio.h>

// ...

int main (void)
{
wait_ms(200);
lcd_init();
while (true) // Mainloop
{
char buffer[20]={0};
unsigned int adc;
//.....................
adc=read_ADC(0);
sprintf(buffer,"ADC 0 = %i",adc);
lcd_goto(1,1);
lcd_write(buffer);
//.....................
adc=read_ADC(1);
sprintf(buffer,"ADC 1 = %i",adc);
lcd_goto(2,1);
lcd_write(buffer);
//.....................
wait_ms(200);
}
return 0;
}


Das Beispiel findest du links im Assistenten unter Vorlagen->LCD. Ich denk mal das ist es was du tun wolltest oder?

Gruß Jahn

sigbert
31.07.2006, 16:56
na da schau ich doch gleich mal was ich damit so alles anfangen kann

ich habe auch dden balken genommen und halt etwas verändert und verdoppelt ...
wenn das hinhaut .. bin ich schon ein stk weiter .. und habe vllt noch weitere fragen ...
na da schaun ich jetzt mal was es so alles macht

gruss sigbert

sigbert
31.07.2006, 22:23
hi habe mit dem code jetzt etwas rumspielen können und ich bekomme jetzt tatsächlich das was ich möchte ... zahlen .. juhuuuu

jetzt aber die fragen die sich daraus wieder ergeben haben ...

wenn ich das poti auf maxwert stelle dezimal jetzt 1019 auf meinem display
und dann wieder zurückgehe gibt er mir richtig grosse werte raus
weit über die 8000 auch lässt er sich nicht auf 0 zurückdrehen
wenn ich aber den funktion lcd_clear () mit einbinde ist alles so einstellbar wie ich es erstmal gerne hätte ... nur stört jetzt das flackern bzw der ständige neuaufbau des lcd

dann noch ne kleine frage
da ich ja auch dieses beispiel LCD_BALKEN am verändern und benutzen bin
wo kann ich die abtastrate also die 10bit abtastung verändern
und wie kann ich jetzt mit den werten bevor ich ans lcd gehen rechnen
damit ich meine negatitven werte bekomme

gruss sigbert

Jahn Kohlhas
01.08.2006, 08:37
hallo siegbert,

oh man, mach langsam und lerne auch die C-Grundlagen
klar kannst du rechnen, warum denn nicht...
die adc werte liegen bei 10 bit zwischen 0 und 1023
wenn du symetrische werte um den nullpunkt haben möchtest ziehst du einfach die häfte von 1023(bzw. 1024) ab


...
int adc;
adc=getADCValue();
adc=adc-(1024/2); oder adc=adc-512;
sprintf(buffer,"adc = %i",adc);
lsd_write(buffer);
...


das die darstellung auf dem lcd lso komisch ist liegt daran dass alte ziffern stehen bleiben ohne lcd_clear gehts auch indem einfach ein paar leerzeichen am string hinten dran sind ;-) :



sprintf(buffer,"adc = %i ",adc);


gruß Jahn

sigbert
01.08.2006, 16:50
erstmal ein riesen grossen dank an dich .. habe jetzt mein kleines
projekt fürs display fertig .. und das dank deiner bzw eurer hilfe

das mit dem rechnen da war ich mir nicht ganz sicher wegen dem
umformen der werte ... das man grundsätzlich rechnen kann
weiss ich .... bin halt noch nicht so erfahren ...

aber ich mache weiter und wer weiß vllt kann ich ja auch mal jemandem helfen

viele grüsse und nochmaligen dank sigbert