Hallo, irgendwie funktioniert mein Code/Schaltung nicht richtig! Ich verwende einen Mega 32. Über ein 50k Poti generiere ich eine Spg. (mit der Spg. ich auch den µP betreibe) die ich an Pin PA0 (ADC0) angeschlossen habe. Gemessen 0 - 5V. Diesen eingelesen Wert möchte ich über das LCD-Display ausgeben. Leider sind das nichtssagende Werte, auch wenn ich das Poti verändere, tut sich gar nichts. Was mache ich falsch. GND (Pin 31 und 30) sind bei mir nicht belegt. Entweder habe ich einen Beschaltungsfehler, oder bei der Konfiguration stimmt etwas nicht! Anbei der Code! Vielleicht kann mir jemand weiterhelfen!? Danke schon Mal vorab Mad Code: int main() { lcd_init(); // LCD initialisieren // *********************************** // Konfigurationen für AD-Wandler // *********************************** ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); ADMUX = 0x00; // Kanal 0 auswählen ADMUX |= (1 << REFS0); // interne Referenzspg. wird benutzt ADCSRA |= (1 << ADSC); // eine ADC-Wandlung while (1) // endlos { ADCSRA |= (1 << ADEN); // ADC einschalten _delay_ms(100); while(ADCSRA & (1 << ADSC)); // Konvertierungsergebnis abwarten AD_Werte(ADCL); // Low-Byte via LCD-Funktion ausgeben _delay_ms(1000); vNeuer_Wert(); // LCD Text ausgeben _delay_ms(1000); AD_Werte(ADCH); // High-Byte via LCD-Funktion ausgeben _delay_ms(1000); ADCSRA &= ~(1 << ADEN); // ADC ausschalten } return 0; }
Madang Madang schrieb: > Hallo, > irgendwie funktioniert mein Code/Schaltung nicht richtig! > Ich verwende einen Mega 32. Über ein 50k Poti generiere ich eine Spg. > (mit der Spg. ich auch den µP betreibe) die ich an Pin PA0 (ADC0) > angeschlossen habe. Das wundert mich weniger - oder versteh ichs falsch: Die Spannung, die du messen willst ich deine Versorgungsspannung? > Gemessen 0 - 5V. Diesen eingelesen Wert möchte ich > über das LCD-Display ausgeben. Leider sind das nichtssagende Werte, auch > wenn ich das Poti verändere, tut sich gar nichts. Was mache ich falsch. > GND (Pin 31 und 30) sind bei mir nicht belegt. Was hindert dich dran, dies zu tun? Wäre uU hilfreich... > Entweder habe ich einen Beschaltungsfehler, oder bei der Konfiguration > stimmt etwas nicht! Oder beides? > Anbei der Code! Nein, nur ein Bruchstück... > Vielleicht kann mir jemand weiterhelfen!? Bestimmt - poste mal deinen Schaltplan/Foto/whatever > Danke schon Mal vorab > Mad Thilo
Madang Madang schrieb: > GND (Pin 31 und 30) sind bei mir nicht belegt. > Entweder habe ich einen Beschaltungsfehler Du musst die Analoge Masse und Versorgung schon anschliessen !
Hier nochmals mein kompletter Code, die LCD Funktion funktioniert! Die analoge Masse und Versorgung werde ich sofort anschliessen! Danke nochmals! vG Mad // Kompletter Code für eine AD-Wandlung! // Gemessener Wert wird digitalisiert und via LCD-Display zur // Anzeige gebracht! #include <avr/interrupt.h> #include <avr/wdt.h> #include <avr/io.h> #include <avr/eeprom.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h> #include <stdbool.h> int main() { lcd_init(); // LCD initialisieren // *********************************** // Konfigurationen für AD-Wandler // *********************************** ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); ADMUX = 0x00; // Kanal 0 auswählen ADMUX |= (1 << REFS0); // interne Referenzspg. wird benutzt ADCSRA |= (1 << ADSC); // eine ADC-Wandlung while (1) // endlos { ADCSRA |= (1 << ADEN); // ADC einschalten _delay_ms(100); while(ADCSRA & (1 << ADSC)); // Konvertierungsergebnis abwarten AD_Werte(ADCL); // Low-Byte via LCD-Funktion ausgeben _delay_ms(1000); vNeuer_Wert(); // LCD Text ausgeben _delay_ms(1000); AD_Werte(ADCH); // High-Byte via LCD-Funktion ausgeben _delay_ms(1000); ADCSRA &= ~(1 << ADEN); // ADC ausschalten } return 0; }
Nach meinem Datenblatt sind sind Pin 30 und 31 beim ATmeega32 die Pins für PA7 und PA6.
50kOhm sind evtl. zu viel, könnte gut sein das die Spannung während der Messung zusammenbrecher. Probier mal 10 kOhm aus. Oder du pufferst die Spannung mit einem Elko 1µF sollte reichen.
Madang Madang schrieb: > ADMUX |= (1 << REFS0); // interne Referenzspg. wird benutzt > ADCSRA |= (1 << ADSC); // eine ADC-Wandlung > > while (1) // endlos > { > ADCSRA |= (1 << ADEN); // ADC einschalten > _delay_ms(100); sollte genau anders rum sein. Vor der while den ADC einschalten: ADCSRA |= (1<<ADEN); und in der Schleife mit dem Startbit die Wnadlung starten: ADCSRA |= (1<<ADSC); :-)
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.