Hallo Zusammen, wollte mal aus Spaß eine Aufgabe lösen und hab da ehrlich gesagt absolut keine Ahnung, was den ADC angeht. Absolut nicht ... Der Mikrocontroller soll mit Hilfe des ADC eine Gleichspannungsmessung durchführen. Dazu soll, gesteuert von einem Timer-Interrupt, der ADC gestartet werden. Das Erfassen der Messwerte geschieht in der Hauptschleife des Hauptprogramms. Die dort eingelesenen Messwerte aus dem ADC sollen in einem Puffer (Länge 10 Messwerte) abgelegt werden. In diesem Puffer soll anschließend immer der älteste Messwert durch einen neuen überschrieben werden (Ringpuffer). Nach jeder neuen Messung soll der Mittelwert aller Messwerte gebildet und mit der Funktion outuint() ausgegeben werden. Hinweise und Hilfen: · Nehmen Sie an, der ADC ist schon initialisiert und der Eingangsmultiplexer ist schon richtig gewählt Der ADC wird gestartet, indem das Bit 6 des Ports ADCSRA gesetzt wird. · Im Hauptprogramm muss gewartet werden, bis das oben genannte Bit 6 nicht mehr gesetzt ist. Dann kann aus den Registern ADCL und ADCH der neue 10Bit Messwert abgeholt werden. ADCL muss zuerst ausgelesen werden und enthält die niederwertigen 8 Bits des Messwerts. · Nehmen Sie an, der Timer-Interrupt sei schon richtig initialisiert. Er ruft die Interrupt-Service-Routine ISR( TIMER) { /* Ihr Programmcode für die ISR */ } auf. · Die Funktion void outuint(uint16_t) wird als vorhanden angesehen. Vielleicht hat jemand ein paar Ideen. Würde mich einfach interessieren, welche Lösungsansetze es da gibt oder wie man da direkt vorgeht ...
in isr: passended Bit zum Starten des ADC setzen in main: auf das Bit warten wenn nicht mehr gesetzt neuen Wert holen ältesten Wert aus puffer löschen neune Wert speichern alle werte im speicher addieren und durch anzahl der werte teilen fertig...
Mike schrieb: > Hallo Zusammen, > wollte mal aus Spaß eine Aufgabe lösen und hab da ehrlich gesagt absolut > keine Ahnung, was den ADC angeht. Absolut nicht ... Brauchst du auch nicht. Steht doch alles in der Angabe deiner Hausübung was du wissen musst. > · Nehmen Sie an, der ADC ist schon initialisiert und der > Eingangsmultiplexer ist schon richtig gewählt Gut > Der ADC wird gestartet, indem das Bit 6 des Ports ADCSRA gesetzt wird. wie setzt man ein Bit? ADCSRA |= ( 1 << 6 ); > · Im Hauptprogramm muss gewartet werden, bis das oben genannte Bit 6 > nicht mehr gesetzt ist. wie fragt man ab, ob ein Bit gesetzt ist? if( ADCSRA & ( 1 << 6 ) ) drehs um, und die hast die Abfrage ob das Bit nicht mehr gesetzt ist. > Dann kann aus den Registern ADCL und ADCH der neue 10Bit Messwert > abgeholt werden. > ADCL muss zuerst ausgelesen werden und enthält die niederwertigen 8 Bits > des Messwerts. Register auslesen wirst du ja auch alleine hinkriegen > Vielleicht hat jemand ein paar Ideen. Würde mich einfach interessieren, > welche Lösungsansetze es da gibt oder wie man da direkt vorgeht ... :-) Wir sind nicht so blöd, wie du denkst. Wir durchschauen dich schon. Mach deine Hausaufgaben selber, da hast du mehr davon. Auf deinem Übungszettel steht eine Menge drauf und offenbar geht es in erster Linie um den Ringbuffer. Der ADC dient nur dazu, um * irgendwelche Werte zu haben, die man in den Ringbuffer stellen kann * du bei der Programmiererei in Übung bleibst.
Hi Mike schrieb: > Vielleicht hat jemand ein paar Ideen. Würde mich einfach interessieren, > > welche Lösungsansetze es da gibt oder wie man da direkt vorgeht ... Immer wieder erstaunlich, diese Fragen. Ich glaub dir nicht, das du dich dafür interessierst, wie MAN da direkt vorgeht, sondern wer deine Arbeit macht. Einen Wert zu lesen hast du bestimmt gelernt, einen Ringpuffer zu beschreiben auch. Den Mittelwert zu berechnen ist Mathe 3. Klasse. Wie man ein Programm schreibt ? Na ganz einfach. Anfangen ein Struktogramm zu malen, Eingabewerte Erfassen, Verarbeiten und Ausgeben. Großschreibung ist hier kein Fehler sondern ein Hinweis auf unsere allseits beliebte "EVA". Na ja, ein wenig Verständnis hab ich denn dann doch noch: das Wetter ist zu schön, um in der Bude zu versauern..... Gruß oldmax
Ich habe doch schon oben geschrieben, dass mich nur interessiert, wie man dabei vorgeht. Ich habe nicht um eine komplettlösung gebeten :-) Der erste Beitrag auf meine Frage hin : ------------------------------- in isr: passended Bit zum Starten des ADC setzen in main: auf das Bit warten wenn nicht mehr gesetzt neuen Wert holen ältesten Wert aus puffer löschen neune Wert speichern alle werte im speicher addieren und durch anzahl der werte teilen --------------------------------------- hilft mir sehr viel weiter. Damit kann ich versuchen den Code aufzustellen und dann bei Fragen nochmal hier zu posten. Eine komplettlösung bringt mich ja nicht weiter, da ich es nicht verstehen würde. Von daher habe ich auch keine Hintergedanken oder sonstige. Und es ist keine Hausarbeit ... mich hat es nur interessiert, da ich zu diesem Thema nie wirklich etwas in der Uni gemacht habe und somit auch nichts in der Hand hab, was mir weiter helfen könnte. Werde mir aber hier auf der webseite das durchlesen zum Thema ADC und dann hier mich nochmals mit einem Programm melden :-)
Mike schrieb: > Ich habe doch schon oben geschrieben, dass mich nur interessiert, wie > man dabei vorgeht. Ich habe nicht um eine komplettlösung gebeten :-) > > Der erste Beitrag auf meine Frage hin : > ------------------------------- > in isr: > passended Bit zum Starten des ADC setzen > > in main: > auf das Bit warten > wenn nicht mehr gesetzt > neuen Wert holen > ältesten Wert aus puffer löschen > neune Wert speichern > > alle werte im speicher addieren und durch anzahl der werte teilen > --------------------------------------- > > > hilft mir sehr viel weiter. Echt? Das ist genau dasselbe was auch in deiner Aufgabe steht. Nur anders angeordnet und überflüssige Füllwörter entfernt.
Wo hast du denn diese Aufgabe her? Sind da noch mehr? Das ist eine interessante Übungsgrundlage, bitte poste doch mal den Link dazu, oder die Angabe wo auch immer die her ist.
Das war eine Übung aus einem Arbeitsblatt hier. Wir arbeiten mit dem AVR und ehrlich gesagt hab ich diese ganze Registersache absolut nicht verstanden. Daher dachte ich, dass diese Übung eine gute Grundlage ist, da hier alles zusammenkommt, Register, schreiben, löschen, FUnktionen etc. ... Nur verstehe ich oft die Aufgabenstellungen nicht wie z.B. ADCL muss zuerst ausgelesen werden und enthält die niederwertigen 8 Bits des Messwerts. Wie lese ich drauß? Einfach den ADCL einer Variablen zuweisen und dann diese Variable zum Vergleichen benutzen?
Mike schrieb: > Nur verstehe ich oft die Aufgabenstellungen nicht wie z.B. ADCL muss > zuerst ausgelesen werden und enthält die niederwertigen 8 Bits > des Messwerts. > > Wie lese ich drauß? Einfach den ADCL einer Variablen zuweisen ganz genau. Für dein C Programm sind die ominösen 'Register' einfach nur eine Art 'vordefinierte Variablen', die du von Haus aus zur Verfügung hast. Welche es gibt und was sie bedeuten steht im Datenblatt des Prozessors. > diese Variable zum Vergleichen benutzen? Fast. Zuerst musst du aus den Werten von ADCL und ADCH einen 16-Bit Wert zusammenbauen. uint8_t lowByte; uint8_t highByte; uint16_t total; lowByte = ADCL; highByte = ADCH; total = 256 * highByte + lowByte; glücklicherweise weiß das aber auch dein Compiler und definiert dafür ein Psuedoregister: ADC total = ADC; und macht dann das zusammensetzen für dich.
Mike schrieb: > Das war eine Übung aus einem Arbeitsblatt hier. Wir arbeiten mit dem AVR > und ehrlich gesagt hab ich diese ganze Registersache absolut nicht > verstanden. Daher dachte ich, dass diese Übung eine gute Grundlage ist, > da hier alles zusammenkommt, Register, schreiben, löschen, FUnktionen > etc. ... Das ist schon zuviel. In einem Register ein Bit setzen, ein Bit löschen, ein Bit abfragen. Das sind die absoluten Grundlagen. Und solange das Schwierigkeiten macht, hat es keinen Sinn schwierigere Dinge in Angriff zu nehmen. Allerdings: deine Aufgabenstellung, so wie sie formuliert ist, setzt die Beherrschung dieser grundlegendden Techniken schon vorraus.
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.