Hallo zusammen! Habe ein Problem. Wenn ich void Liefere_UI_Paar() aufrufe bekomme ich werte angezeigt, obwohl 0Volt am ADC-Eingang liegen. Benutze ich die andere funktion, die keinen mittelwert bildet, dann bekomme ich 0 angezeigt, wie es sein soll. uint16_t strom; //globale Definitionen uint16_t spannung; Wäre nett, wenn ihr mir helfen könntet. Beste Grüße, David
Ist etwas schwierig..... void Liefere_UI_Paar()... was soll das, was ist das ? Welcher Compiler, welcher ADC, welcher controller.
Die Glaskugel sagt mir... ... das vielleicht eine lokale Hilfsvariable, die zur Mittelwertberechnung verwendet wird, vor dem Aufruf der 'Funktion Liefere_UI_Paar()' nicht zu '0' initialisiert wurde.
Also, damit es nochmal etwas genauer wird: Die Schaltung soll erstmal nur dauernd zwei Spannungswerte namens Spannung (gemessen am ADC-Eingang PF0) und Strom (ADC-Eingang PF1) über die serielle Schnittstelle ausgeben. Ich habe hier nochmal etwas mehr programmcode angehängt. Fakt ist, dass die ADC-Eingänge unbeschaltet sind. Nicht ganz. Also der PF0 ist mir einem Spannungsteiler beschaltet, PF1 geht direkt in den ADC. Nun fällt mir folgendes auf: Wenn ich den PF0-Pin auf Analogmasse lege, dann passiert nichts. WEiterhin wird wirres Zeug angezeigt, aber keine 00000000-Folge. Lege ich jedoch PF1 auf Masse, so zeigen beide WERTE 000000 an, wie es ein soll. Woran kann das liegen?
Der Sourcecode ist kaputt. Da fehlt mindestens eine schließende geschweifte Klammer.
1 | void Liefere_UI_Paar() |
2 | {
|
3 | USART_Init(MEIN_UBRR); |
4 | while(1) |
5 | {
|
6 | |
7 | spannung=LesePortPF(0); |
8 | strom=LesePortPF(1); |
9 | dtostrf( spannung, 8, 0, U ); |
10 | dtostrf( strom, 8, 0, I ); |
11 | uart_puts (U); |
12 | MakeLeerzeichen(4); |
13 | uart_puts (I); |
14 | MakeZeilenende(1); |
15 | ADCStoppen(); |
16 | }
|
17 | |
18 | void ADCStarten(void) |
19 | {
|
20 | ADCSRA |= 0xd7; |
21 | }
|
Was soll das? Was soll das while(1)? Das hier macht wohl auch was anderes als beabsichtigt:
1 | uint16_t LesePortPF(uint8_t n) |
2 | {
|
3 | uint16_t Ergebnis; |
4 | Ergebnis=0; |
5 | |
6 | ADMUX = n; |
7 | |
8 | ADMUX |=0xc0; |
9 | |
10 | ADCStarten(); |
11 | |
12 | while (!(ADCSRA & (1<<ADIF)) ) |
13 | Ergebnis = ADC; |
14 | return Ergebnis; |
15 | |
16 | }
|
(Kommentare der Übersichtlichkeit halber entfernt) Was macht das while? Was geschieht wann mit der darauffolgenden Zeile? Wenn Du Deinen Quelltext anständig formatieren würdest, würdest Du einiges vielleicht auch selber erkennen können.
Definier mal U, I, strom und spannung in der Funktion Liefere_UI_Paar() und nicht global.
Hi! Ja den gesamten Code wollte ich nicht anhängen, weshal ich das wichtigste rauskopiert habe. Dadurch sind die Formatierungen verloren gegangen. while (!(ADCSRA & (1<<ADIF)) ) wartet, bis die AD-Wandlung zuende ist. Das habe ich im AVR-Tutorial gelesen und das hat auch schon ganz gut funktioniert. Das while(1) soll dafür sorgen, dass auf der Seriellen Schnittstelle dauernd die beiden Werte für U und I ausgegeben werden. Eines möchte ich kurz erwähnen. Das Programm hat so schon funktioniert.
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.