Sehr geehrte Gentleman, Ich bräuchte Hilfe bei einem C-Programm damit ich mir meine Note in Digitaltechnik ausbessern kann und wäre für ihre Hilfre dankbar. Die Angabe von meinen Herr Professor lautet: Entwirf ein C-Programm für den Atmega328P sodass die Spannung am Eingang ADC3 mit 10-bit Auflösung gemessen werden. Das Ergebnis soll immer auf die Variable 'Messung' geschrieben werden. Als Referenzspannung soll die interne Referenzspannung verwendet werden. Der ADC-Clock soll 125kHz betragen. Ich glaube meine ADPS bits sollten auf 111 gesetzt werden damit ich ein Verteilungsfaktor von 128 kriege. Dankeschön
Hallo Epic G. schrieb: > Ich glaube meine ADPS bits sollten auf 111 gesetzt werden damit ich ein > Verteilungsfaktor von 128 kriege. das Datenblatt des Mega328 behauptet das zumindest. Gruß aus Berlin Michael
Hi >Ich glaube meine ADPS bits sollten auf 111 gesetzt werden damit ich ein >Verteilungsfaktor von 128 kriege. Aber nur, wenn der Takt des ATMega328 16 MHz beträgt. MfG Spess
Epic G. schrieb: > und wäre für ihre Hilfre dankbar. Und wobei brauchst du jetzt Hilfe? Ins Datenblatt gucken, ADC richtig konfigurieren, Interrupts konfigurieren und bei ADC-Fertig-Interrupt Daten in Variable schubsen. Ob deine ADPS-Bits stimmen, können wir ohne Angabe des Systemtaktes nicht sagen. Epic G. schrieb: > meine Note in > Digitaltechnik ausbessern Du sollst deine Note aufbessern. Nicht wir ;) Hier gibt es (hoffentlich) höchstens Hilfe zur Selbsthilfe. Also, formuliere ein konkretes Problem und du bekommst eine Antwort. Niemand wird dir deine Hausaufgaben machen und dir fertigen Code liefern, den du dann nicht einmal erklären kannst, wenn dich dein Lehrer danach fragt.
Epic G. schrieb: > Entwirf ein C-Programm für den Atmega328P sodass die Spannung am Eingang > ADC3 mit 10-bit Auflösung gemessen werden. Das Ergebnis soll immer auf > die Variable 'Messung' geschrieben werden. Als Referenzspannung soll die > interne Referenzspannung verwendet werden. > Der ADC-Clock soll 125kHz betragen. Um dir den richtigen Teiler für den ADC-Clock nennen zu können brauchen wir zwingend die Taktrate, mit der der Atmega laufen soll. Auch ist die maximale Mess-Spannung nicht bekannt. Die Beschaltung des Atemgas ist ebenso von Interesse. Der Rest ist Fleißarbeit, kann z.B. so aussehen:
1 | #include <avr/io.h> |
2 | |
3 | uint16_t Messung; |
4 | |
5 | int main(void){ |
6 | ADCSRA |= (1 << ADSP0); |
7 | ADMUX |= (1 << REFS0)|(1 << REFS1); |
8 | ADMUX |= (1 << MUX1)|(1 << MUX0); |
9 | ADCSRA |= (1 << ADEN)|(1 << ADSC); |
10 | while(ADCSRA & ~(1 << ADSC)){ |
11 | }
|
12 | for(;;){ |
13 | ADCSRA |= (1 << ADSC); |
14 | while(ADCSRA & ~(1 << ADSC)){ |
15 | }
|
16 | Messung = ADC; |
17 | }
|
18 | return 0; |
19 | }
|
Schau dir ruhig mal an was der Code macht, er ist aber nicht die Lösung deiner Aufgabe.
Das verstehe ich natürlich, ich habe schon mit meinen Code angefangen aber bin mir nicht sicher wie ich weiter arbeiten soll. Hier ist mein Code: /* * ADC_Testbsp_seliga.c * * Created: 03.05.2019 10:35:07 * Author : seligpat */ #include <avr/io.h> int messung; int main() { DDRD |= 0xFF; ADMUX &= ~((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)); // A0 pin//Enables ADC ADMUX |= ((1<<REFS0)|(1<<REFS1)); ADCSRA |= 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0; //ADC Prescalar auf 128 setzen, meine ADC Frequenz ist 125KHz ADCSRA |= 1<<ADEN; //Serial.begin(9600); while(1) { ADCSRA |= (1<<ADSC); while(ADCSRA &(1<<ADSC)); messung = ADC; if (messung == 0) { PORTD |= (1<<4); } else PORTD &= ~(1<<4); } }
Epic G. schrieb: > bin mir nicht sicher wie ich weiter arbeiten soll Ist denn aus deiner Sicht die Aufgabenstellung damit erfüllt? Hast du alle Vorgaben erfüllt? Funktioniert der Code, wie er soll? Wenn ja: Fertig. Ggf. noch etwas besser kommentieren
Wie genau müsste ich eben testen dass er funktoniert? Ich habe zwar keine Fehler im Programm aber es fehlt mir sicher noch etwas. Muss ich nicht noch ein I2C-Bus reinprogrammieren damit ich es zB auf mein BCD board ablesen kann?
> Hast du alle Vorgaben erfüllt?
Gute Frage, gar mit Hintergedanke? ... wenn ich mir den Kanal anschaue
...
Epic G. schrieb: > Muss ich > nicht noch ein I2C-Bus reinprogrammieren damit ich es zB auf mein BCD > board ablesen kann? Ist das in der Aufgabe gefordert? Was ist denn ein "BCD Board"? Bzw. auf welche Hardware nutzt du für den AtMega328P? Die paar Indizien weisen auf einen Arduino hin. Korrekt? Dann ist das einfachste, was du machen kannst, die Serielle Schnittstelle dafür zu nutzen und einfach den Inhalt der Variable 'messung' in der Schleife seriell auszugeben. Dann kannst du am Computer, ohne zusätzliche Hardware, sehen, was passiert. Und an dem Analogen Eingang brauchst du natürlich etwas, um den Messwert zu verändern. Hängt ein bisschen von den Möglichkeiten, die du hast, ab.
Sebastian R. schrieb: > Ist das in der Aufgabe gefordert? > > Was ist denn ein "BCD Board"? Bzw. auf welche Hardware nutzt du für den > AtMega328P? > > Die paar Indizien weisen auf einen Arduino hin. Korrekt? > > Dann ist das einfachste, was du machen kannst, die Serielle > Schnittstelle dafür zu nutzen und einfach den Inhalt der Variable > 'messung' in der Schleife seriell auszugeben. Dann kannst du am > Computer, ohne zusätzliche Hardware, sehen, was passiert. > > Hängt ein bisschen von den Möglichkeiten, die du hast, ab. Ich hab einfach ein BCD Board mit einer 7-Segment Anzeige. Ja ich benutze einen Arduino. Ich arbeite normalerweise mit Oszilloskopen wo ich dank Messungen alles ablesen kann, oder ich lese meine Werte aus einer 7-Segment anzeige. Am Computer hab ich nie wirklich geschaut ob mein Code ohne zusätzliche Hardware funktioniert also kenne ich mich da nicht aus.
Epic G. schrieb: > lese meine Werte aus einer 7-Segment anzeige Wenn es dir gelingt, die Zahlen 0...1023 mit einer Ziffer darzustellen... Du könntest den Messwert mit der Funktion map() auf 0...9 herunterbrechen und auf der 7-Segment-Anzeige anzeigen. Du hast in deinem Quelltext ja schon das "Serial.begin(9600);", aber auskommentiert, wo kommt das denn her? Dein Code muss ohne zusätzliche Hardware funktionieren, denn alles, was du tun sollst, ist in dem Controller enthalten. Wenn du das Serial.begin einbaust, kannst du in der Hauptschleife mit "Serial.println(messung);" den Messwert ausgeben. In der Arduino IDE hast du oben Rechts die Lupe, mit der du den Seriellen Monitor aufrufen kannst, da kommen dann die Zahlen an und werden ausgegeben. (Kurzfassung)
Sebastian R. schrieb: > > Wenn es dir gelingt, die Zahlen 0...1023 mit einer Ziffer > darzustellen... > > Du hast in deinem Quelltext ja schon das "Serial.begin(9600);", aber > auskommentiert, wo kommt das denn her? > > Dein Code muss ohne zusätzliche Hardware funktionieren, denn alles, was > du tun sollst, ist in dem Controller enthalten. > > Wenn du das Serial.begin einbaust, kannst du in der Hauptschleife mit > "Serial.println(messung);" den Messwert ausgeben. In der Arduino IDE > hast du oben Rechts die Lupe, mit der du den Seriellen Monitor aufrufen > kannst, da kommen dann die Zahlen an und werden ausgegeben. > (Kurzfassung) Nein ich hab eine Anzeige mit 4 Ziffern natürlich. Der Code scheint schon daweil zu funktionieren, ist aber noch nicht fertig. Ich versuch es mal.
Okay. Mach es so, wie du es am einfachsten für dich ist. Dann bietet sich diese Anzeige vielleicht an. Hast du ein Potentiometer oder ähnliches an dem Pin, um den Wert ändern zu können?
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.