hi, ich hab ein Programm zum Spannungsmessen mit bascom geschrieben und nun wollte ich das in C verwirklichen nur spuckt der ADC komische Werte aus. Ich habe das myAVR MK1 board mit dem Atmel Mega 8 momentan übertrage ich nur den gemessenen Wert auf das LCD hier ist der C-code #include <lcd.h> #include <avr\io.h> #include <delay.h> #include <delay_basic.h> #include <stdio.h> #include <lcd.c> main (void) { int i=0, x=0; float volt; char Buffer[16]; char wert; lcd_init(); wait_ms(10); lcd_home(); lcd_write_s("Voltmeter"); ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); ADMUX |= (0<<REFS1) | (1<<REFS0); ADMUX=0x40; do { for (;;) { ADCSRA |= (1<<ADEN); wait_ms(10); ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC)){} ADCSRA &= ~(1<<ADEN); x = ADCW; volt = x*5; volt = volt/1024; sprintf(Buffer, "%d", x ); lcd_goto(2,1); lcd_write_s(Buffer); } } while(true); } danke fuer eure hilfe!
Dir ist klar, dass der sprintf momentan das Ergebnis linksbündig in das Buffer Array schreibt, und das bei der Ausgabe der vorhergehnde Wert nicht notwendigerweise vollständig überschrieben wird? Bsp. angenommen der jetzige Messwert ist 1000 dann steht auf dem Display 1000 nun sei der nächste Messwert 999, da 999 aber nur aus 3 Ziffern besteht, werden auch nur 3 Ziffern ausgegeben. Diese überschreiben die 1000, aber eben nur die ersten 3 Ziffern. Im Display steht dann 9990 Ist es das was du mit 'komischen Werten' meinst?
hoechstwahrscheinlich! ;) dann werd ich mich mal um ne alternative bemühen! danke erstmal!
ich habe jetzt sprintf(Buffer, "%d", x ); durch itoa( x, Buffer, 10 ); ersetzt. Doch leider habe ich immer noch das gleiche Problem. am anfang werte zwischen 0 und 1023... so wie es sein soll und dann nur noch Werte zwischen 1023 und 9000.
>so wie es sein soll und dann nur noch Werte >zwischen 1023 und 9000. Lösch das Display bevor du neue Werte ausgibst!
Hab ich getan. Außer dem werden doch die Werte permanent aktualisiert!
>Hab ich getan. Außer dem werden doch die Werte permanent aktualisiert!
Aber nicht vor JEDER Ausgabe.
Versuch mal
sprintf(Buffer, "% 4d", x );
lcd_goto(2,1);
lcd_write_s(Buffer);
alles klar! Danke schön! Dann war das nur ein Darstellungsfehler. und um das ganze jetzt als gleitkommazahl darzustellen muss ich das mal Vref und durch 1024 dividieren, richtig? double volt=0; x = ADCW; volt = x*5; volt = volt/1024; sprintf(Buffer, "% 4d", volt ); lcd_goto(2,1); lcd_write_s(Buffer); so bekomme ich bei einer batterie die 1.22V hat (gemessen) einen wert von -16384
flwr wrote: > sprintf(Buffer, "% 4d", volt ); Du solltest dich mal intensiv mit den Kürzeln im Formatstring bei printf beschäftigen. Insbesondere ist d die Angabe, das an der betreffenden Stelle in den Argumenten zu printf ein int steht. Du hast aber keinen int, du hast einen double. Und das Kürzel für double ist nun mal f und nicht d http://www.mikrocontroller.net/articles/FAQ#Formatierungen_mit_printf Spätestens jetzt ist der Hinweis auf ein vernünftiges Buch über C angebracht. Wie du gesehen hast warten da einige Überraschungen, die man nicht mit der Methode 'Versuch und Irrtum' rausfinden kann.
ja du hast recht. Ich hab bevor ich das gepostet hab nach platzhalter gegooglet. ich werd mich mal um ein buch bemühen! danke schön trotz dem.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.