mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD Wandler liefert komische Werte


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gleichgesinnte,

ist glaub ich nur ein kleines Problem, aber ich komme trotzdem nicht 
weiter....
Ich les' über den internen AD Wandler von dem Mega163 eine Spannung ein 
und versuch' diese über den sprintf Befehl, den's auf ideser Seite unter 
avrgcc FAQ gibt auf meinem Grafik LCD auszugeben.

Ich denke der Fehler besteht in dem Teil des Programms wo die AD 
Register in ein int zusammengeführt werden sollen - vielleicht kann mir 
jemand sagen warum das nicht hinhaut:

lo_val = inp(ADCL);   /* read low byte first */
hi_val = inp(ADCH);
adc = hi_val;
adc = adc<<8;
adc = adc + lo_val;

Was ist daran falsch????

wenn ich jetzt das int adc in ein char adc_8bit reinlade - wird dann 
automatisch das höherwertige byte in das char adc_8bit reingeladen????

Vielen Dank für eure Unterstützung!!!!

mfg

Christian

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, das lustigste hab' ich euch ja gar nicht gesagt:

wenn ich versuche die int adc Variable in ein unsigned char adc_8bit 
reinzuladen und das am LCD anschaue kommen da teilweise zahlen raus über 
600 - wie kann eine eine 8bit Variable größer als 255 sein?????

Vielen Dank

Christian

Autor: hubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte ebenfalls Spannungen vom ADC einlesen doch ich kriege nur 3 
oder 0 bei ADCH und bei ADCL nur 0 oder 255. Vielleicht kannst Du ja mir 
helfen?????

Gruss
Rolf

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rolf,

hast du AREF, AGND und AVCC wie im Datenblatt beschrieben beschalten???
Nimmst du C oder Assembler???
Post halt mal deinen Code - vielleicht hilfts was.

Bist du ein kleiner Heli fan oder heißt du nur so Hubi???

mfg

Christian

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo - ich bin's schon wieder,

ich hab' zu versuchszwecken das C-Programm so umgeschrieben, dass jetzt 
eine laufender Timerwert am LCD angezeigt wird (haraleit...)
Das mit dem Timer läuft ja ganz gut, aber das mit dem Display wohl 
weniger. Zuerst wird ganz normal gezählt bis 255 und dann wird plötzlich 
unlogisch bis 900 oder so gezählt und dann zählt er wieder normal ab 100 
weiter. Liegt das vielleicht am sprintf???

Die Variblae wird, sobald sie 255 ist wieder auf null gesetzt - warum 
funktioniert das dann nicht????

Vielen Dank

Christian

PS: die LED's an Portb, die das ganze binär mitzählen laufen in Ordnung 
- da scheints zu stimmen.

Autor: hubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Christian
Versuche in C zu Programmieren. Bin ein echter Anfänger betreffend C und 
MC. Deshalb habe ich auch die AREF "vergessen" anzuschliessen. Dachte 
interne Referenzspannung heisst es brauche keine externen Anschlüsse 
mehr.

hubi ist ein Spitznahme, kommt von Huber

mfg
Rolf

Autor: Dirk Kramer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

kann es sein, dass du beim Aufruf von sprintf einen Fehler machst?

Poste doch einfach mal einen Auszug aus dem Quelltext, dann kann dir 
bestimmt besser geholfen werden.

Dirk

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,
vielen Dank für deine Antwort - hier ist der code (ohne #include und 
variablendeklaration)


SIGNAL (SIG_OVERFLOW0)
{
//outp(~led, PORTB); /* write value of led on PORTB */
count++;
if (count==255)
count = 2;
outp(0xFE,TCNT0); /* reload counter with initial value */
}

SIGNAL (SIG_OVERFLOW2)
{
outp(~led, PORTB); /* write value of led on PORTB */

led++;

if (led==255)

led = 0;

outp(0,TCNT2); /* reload timer with initial value */
}

void print_data(void)
{
set_cursor(0,0);  //gibt die x und y Position auf dem LCD an
sprintf(lcd_buffer, "Timerstand: %u", led);
lcd_printstring(lcd_buffer);

set_cursor(0,1);  //gibt die x und y Position auf dem LCD an
sprintf(lcd_buffer, "Counterstand: %u", count);
lcd_printstring(lcd_buffer);

}

int main( void )
{
outp(0xFE, DDRB); /* use all pins on PORTB for output */
outp((1<<TOIE2|1<<TOIE0), TIMSK); /* enables the T/C2 overflow interrupt 
in
the T/C interrupt mask register for */
outp(0, TCNT2); /* start value of T/C2 */
outp(4, TCCR2); /* prescale ck/64 das sollte bei 8Mhz alle 2,048ms einen 
interrupt geben*/
outp(0xFE, TCNT0); /* start value of counter */
outp(6, TCCR0); /* init the T/C as a counter falling edge*/
count = 0;
led = 0;
t6963c_init();
sei(); /* set global interrupt enable */
for (;;)
{
  print_data();
  Delay_10ms(10);
}
}

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh - tut mir leid, jetzt hab' ich ein wenig viel müll mitgepostet - das 
Display soll jetzt den counter und den Timerwert anzeigen (machts ja 
auch bis 255) - eins von beiden hätt' wohl gereicht...

mfg

Christian

Autor: Schmittchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn du die Anzeige nur langsam genug machst, dann siehst du, daß er 
von 0 bis 255 wie gewünscht zählt, danach gehts mit 055 weiter, dann 
155, dann... bis 995, erst danach stimmen die Ausgaben wieder. Gib mal 2 
Leerzeichen nach dem %u in deinem sprintf-Parameter-String aus, dadurch 
werden die übrig gebliebenen Ziffern auf dem Display der letzten Ausgabe 
gelöscht.

Ich mache den "Fehler" auch regelmäßig - Hoffnung auf Besserung habe ich 
bei mir schon aufgegeben.

@Hubi: Vergiss auch nicht den obligatorischen 100nF Keramikkondensator 
zwischen AVCC und AGND...

Schmittchen.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Nachtmensch,

vielen lieben Dank für deine Antwort!! - jetzt funktioniert das mit dem 
Counter einwandfrei!!!!!! Ich hab' noch ein anderes Programm bei dem ich 
mich über die LCD Anzeige geärgert habe. Es soll einen Kompasswert 
(elektronischer Kompass) einlesen und am Display ausgeben. Das hat auch 
nur Müll angezeigt - vielleicht geht's jetzt - wäre wirklich toll (hab' 
jetzt keine Lust mehr das auszuprobieren.....)
Das mit dem ADC haut leider immer noch nicht hin - man sieht jetzt 
allerdings, dass fast immer wieder die selben Zahlen rauskommen.....

Vielen Dank auf jeden Fall - du hast mich wirklich um ein großes Stück 
weitergebracht!!!!!!

Viele Grüße

Christian

PS: so wichtig wird der 100nF zwischen AVCC und GND wohl nicht sein dass 
es deswegen nicht funktioniert, oder??? - hab' nämlich keinen 
Kondensator reingemacht.....

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, jetzt funktioniert jetzt auch der AD Wandler.
Ich weiß zwar nicht so genau was ich gemacht habe, dass es jetzt läuft, 
aber es funktioniert nun einwandfrei!!!

Vielen Dank nochmal an alle (auch an die die das gelesen haben und 
mitgegrübelt haben ;-)

mfg

Christian

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.