Hallo liebe Community, ich bin neu hier, habe mit µC nicht soviel Erfahrung und komme mit meinem Programm nicht weiter:( Verwende einen ATMEGA8. Das Programm soll folgendes machen: Eine Spannung messen und an zwei 7-Segment-LED-Anzeigen wiedergeben. Dieses funktioniert auch... Als Zusatzfunktion soll der µC eine Spannung am ADC3 Kanal messen und z.B. mit einem anderen Kanal es vergleichen. Am ADC3 Kanal kommt von meinem Temp.Sensor eine DC Spannung (ca. 2,2V bei Umgebungstemp.) Ich möchte dem µC sagen dass, wenn die Spannung am ADC3 eine bestimmte Schwelle erreicht hat, soll er am PinC4 auf High bzw. Low schalten. Wie kann ich es am einfachsten programmieren? Wäre echt nett wenn Ihr mir Helfen könntet. Vielen Dank im Voraus mfg tasso
Hi
>Wie kann ich es am einfachsten programmieren?
Mit dem Analogkomparator.
MfG Spess
C-Quelltext hat die Endung .c, nicht .txt. Du brauchst eine Schleife, die periodisch ADC-Werte aufnimmt und immer schaut ob der interessante Wert überschritten wurde. Sowas wie Interrupts für bestimmte ADC-Pegel können die meisten uCs eher incht.
Ja ich weis hab das programm einfach in einer txt datei kopiert. Ich probier es mal mit dem Analog Komparator. Der 2. adc ist doch in der schleife oder? (While). Ich hab irgendwo einen Fehler in meinem Quellcode. Wenn ich es jetzt mit dem Ad Komparator mache dann brauche ich quasi nur einen adc wert auslesen und den dann mit dem ad komparator vergleichen oder?
Ich würde dafür den ADC und nicht den analog Comparator verwenden, da biste viel flexibler was Schaltschwelle und Hysterese angeht...
Ja habe auch grad gesehen die zwei pins für den komparator sind schon belegt. Könntet ihr mir sagen wo mein fehler ist in meinem Programm? Ab der Temperaturmessung funktioniert es nicht richtig. :(
ADMUX = 0x03; // Kanal wählen(ADC3) ADMUX |= (1<<REFS0) | (1<<REFS1); // interne Referenzspg. 2,56V temp=0; ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten temp += ADCW; //Gemessenen Wert aus ADCW auslesen // Vergleichspannung am ADC6 messen ADMUX = 0x06; // Kanal wählen(ADC6) ADMUX |= (1<<REFS0) | (1<<REFS1); // interne Referenzspg. 2,56V vergleich=0; ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten vergleich += ADCW; //Gemessenen Wert aus ADCW auslesen if (temp > vergleich) { PORTC = (1<<PC4); } else { PORTC = (0<<PC4); } Dieser Programmauschnitt funktioniert nicht :( Muss ich den ADC zwischendurch immerwieder deaktivieren? da sonst der gemessene Wert nicht stimmt?
Tasso schrieb: > Könntet ihr mir sagen wo mein fehler ist in meinem Programm? Das Programm wird richtig sein - deine Erwartungshaltung wird falsch sein, weil du etwas anderes programmiert hast. Tasso schrieb: > Ab der Temperaturmessung funktioniert es nicht richtig. :( Ich habe selten eine so "klare" Fehlerbeschreibung gesehen.
Also ich messe direkt am Mikrocontroller die Spannung und es tut sich nichts egal wierum ich es programmier. Also normal sollte am PC4 ein High Pegel stehen, tuts aber nicht bleibt immer auf 0.
Tasso schrieb: > Also normal sollte am PC4 ein High Pegel stehen, tuts aber nicht > bleibt immer auf 0. Einer Blackbox mit nur einem Bit Ausgangsinformation ist nur schwer anzusehen, was tief in ihrem Inneren vor bzw. schief geht. Bevor du den Vergleich machst, solltest du erstmal gucken, was du vergleichst und dir dabei sicher sein, dass die Werte auch dein Eingangssignal abbilden. Vielleicht hat der Analogteil vor dem ADC nach der Kanalumschaltung nicht genug Zeit, um dem Signalpegel zu folgen. Das hängt von deinem restlichen Programm und der Hardware ab. Warum schraubst du eigentlich immer an der Referenzspannungswahl rum?
Ich möchte schauen ob mein Programm läuft darum spiel ich bissle rum. Ich weis das später die schwelle bei ca. 3V liegen muss.
Tasso schrieb: > Ich möchte schauen ob mein Programm läuft darum spiel ich bissle rum. Das tut es nicht. Blindes Rumspielen überlässt das Ergebnis dem Zufall.
Bei mir gab es schon Probleme, weil ich die Umrechnung des ADC Wertes falsch erledig habe bzw. in flascher Reihenfolge die Register ausgelesen habe. Dann wird der Wert nicht mehr aktualisiert und deine Abfrage ergibt immer false. Im Datenblatt steht explizit "When an ADC conversion is complete, the result is found in these two registers. When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted and no more than 8-bit precision is required, >it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH" Ich weiß jetzt nicht, wie das dein ADCW macht, aber versuch mal die Register einzeln hintereinander auszulesen. Bei mir hats geholfen
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.