Hallo Forenteam, ich versuche mich am ADC eines Atmega 8. Ich möchte beim erreichen eines digatelen Spannungswertes den Ausgang PORTB 0 auf 1 setzen. Ich hab versucht mein Prog möglichst nah am Tutorial zu halten, da ich noch ein blutiger Anfänger bin. Ich habe versucht es auf den Atmega 8 anzupassen. vielleicht könnt ihr mir sagen wo ich müll geschrieben hab.
Jetzt noch bitte in ein Excel-Dokument einfügen, einen Screenshot machen, und den in ein Word-Dokument einfügen, und dieses hochladen. Pro Tip: Das ganze in ein Zip-File.
Für das bischen Code braucht es noch nicht einmal ein Zip-File. Einfach das C-File als Attachment einfügen (das macht man bei "Dateianhang") und hochladen.
Du bist Dipl. Ing.? Da ich die ganzen Einstellungen nicht im Kopf habe und es spät ist, kann ich deinen Fehler so auf die Schnelle nicht finden, aber könntest du das nicht eventuell mit dem Analog Komparator lösen? Der ist einfacher zu bedienen und schneller.
Ron S. schrieb: > Hallo Forenteam, > > ich versuche mich am ADC eines Atmega 8. Ich möchte beim erreichen eines > digatelen Spannungswertes den Ausgang PORTB 0 auf 1 setzen. > > Ich hab versucht mein Prog möglichst nah am Tutorial zu halten, da ich > noch ein blutiger Anfänger bin. Dann frag ich mich, wozu die die überhaupt abgeändert hast? Bis auf die Einstellung der Referenzspannung brauchst du erst mal nichts verändern. Dann würdest du auch nicht die dummen Fehler machen, die du gemacht hast. PS: 0250 Ich denke nicht, dass du weißt, was du da geschrieben hast. Tip: Das ist keine Dezimalzahl. Eine Zahl, die mit 0 beginnt ist in C eine Oktalzahl.
Da manche mit einem Bild nicht klar kommen versuch ich es noch einmal so. Die obere Liste mit Namen usw. lädt Das Prog "Sissy" selber rein. Ich bin kein Dipl. ing #define F_CPU 3686400 #include <avr\io.h> #include <inttypes.h> #include <stdint.h> void ADC_Init(void) { uint16_t result; ADMUX &= ~( (1<<REFS1) | (1<<REFS0) ); // Referenzsp. auf 5V ADCSRA = (1<<ADPS2) | (1<<ADPS0); // Teiler auf 32 ADCSRA = (1<<ADEN); // ADC aktivieren ADCSRA = (1<<ADSC); // eine Wandlung while (ADCSRA & (1<<ADSC) ) { } result = ADCW; } uint16_t ADC_Read( uint8_t Channel ){ ADMUX = (ADMUX & ~(0x1F)) | (Channel & 0x0F); ADCSRA |= (1<<ADSC) ; while (ADCSRA & (1<<ADSC) ) { } return ADCW; } int main (void) { uint16_t adcval; ADC_Init(); DDRB = 1; while (true) // Mainloop { adcval = ADC_Read(0); if (adcval > 0250) { PORTB =0x01; } } return 0; }
Ron S. schrieb: > Da manche mit einem Bild nicht klar kommen versuch ich es noch einmal > so. Es geht nicht um klarkommen. Es geht darum, dass, wenn du Text postest (egal ob als eigenes File oder direkt im Beitrag), die Helfer mittels Cut&Paste Textstellen ausschneiden und für ihre Antwort benutzen können. Du bist der der Hilfe braucht, also mach du es uns einfach dir zu helfen. Wenn ich dein Programm erst abtippen muss um daraus meine Antwort zu basteln, lass ich es lieber. > Ich bin kein Dipl. ing Auch als Nicht-Dipl.-Ing hat man kein Nachdenkverbot. > ADMUX &= ~( (1<<REFS1) | (1<<REFS0) ); // Referenzsp. auf 5V > ADCSRA = (1<<ADPS2) | (1<<ADPS0); // Teiler auf 32 > ADCSRA = (1<<ADEN); // ADC aktivieren > ADCSRA = (1<<ADSC); // eine Wandlung Ganz schnell: Welchen Wert hat i = 5; i = 8; nach all den Zuweisungen? Und jetzt überleg mal, was diese Erkentniss für Auswirkungen auf ADCSRA in deinem Codestück hat.
Dann kann man das so auch so wie du einfach sagen und sich nicht lustig machen. Aber egal Ich bin das stück für stück durch gegangen und hab es versucht zu verstehen. Aber das mit der Null vor der 250 ist ja schon ein Anfang. Ich hab rum probiert auf was ich vergleichen kann. Also sollte ich die Bits in ADCSRA besser in einer Zeile setzen?
Ron S. schrieb: > Dann kann man das so auch so wie du einfach sagen und sich nicht lustig > machen. Aber egal Aber so merkst du dirs. Beim nächsten Mal machst du es besser und alle sind zufrieden. (und sei mal ehrlich: auf so eine Idee, Programtext als Bild einzustellen, muss man erst mal kommen) > Also sollte ich die Bits in ADCSRA besser in einer Zeile setzen? Wäre eine Möglichkeit. Du kannst aber auch sukzessive eine Bitkombination nach der anderen in ADCSRA setzen. Hier
1 | uint16_t ADC_Read( uint8_t Channel ){ |
2 | |
3 | ADMUX = (ADMUX & ~(0x1F)) | (Channel & 0x0F); |
4 | ADCSRA |= (1<<ADSC) ; |
hats du das ja auch hingekriegt, das einzelne Bit namens ADSC im Register ADCSRA zu setzen.
> > ADMUX &= ~( (1<<REFS1) | (1<<REFS0) ); // Referenzsp. auf 5V
Wie hast du auf einem Board den ARef Pin verschaltet?
Karl Heinz Buchegger schrieb: > und sei mal ehrlich: auf so eine Idee, Programtext als > Bild einzustellen, muss man erst mal kommen So spontan fiele mir hierzu der Begriff "Screenshot" ein ;) Karl Heinz Buchegger schrieb: > Wie hast du auf einem Board den ARef Pin verschaltet? Die gesamte Schaltung wäre sicherlich interessant aber ich denke doch erst wenn das Programm in Ordnung ist ;) :D
> Die gesamte Schaltung wäre sicherlich interessant aber ich denke doch > erst wenn das Programm in Ordnung ist ;) :D Vor allem wenn ARef wie gerne mal gemacht auf AVcc geklemmt und dann eine interne Referenz benutzt wird... ;)
Als das ist ein Board von myAvr. Die haben den AREF auf die 5V, mit denen das Board arbeitet, gelegt und über Spule und kondensator in Reihe auf GND.
>Und jetzt überleg mal, was diese Erkentniss für Auswirkungen auf ADCSRA >in deinem Codestück hat. Alles Klar. Das war das ganze Prob. Zumindest funzt es jetzt wie ich es haben will. PS: Zum Glück gibt es hier auch Leute die helfen und nicht nur dumme Antworten schreiben.
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.