hi auf einen Beitrag hir hab ich mir gedacht das probier ich auch mal aus. Ich hab auch einen guten Beitrag im wiki zu genau meinem avr gefunden. Ich will 6LEDs PB0-PB5 leuchten lassen. Um so mehr Spannung anliegt um so mehr LEDs leuchten. Die Spannung wird mit einem Potti an Pin PA0 eingestellt. Leider Weiß ich hier nicht weiter. Die Frequenz stimmt auch nicht aber das sollte ein anderes Thema sein. Kann mir einer sagen wo der Fehler liegt. mfg
Hi Lies dir bitte mal durch, was du geschrieben hast. Und überlege dir dann einmal, was jemand, der nicht weiss was du gemacht hast, für Informationen daraus entnehmen kann. Mit dieser Aussage kann dir keiner helfen. MfG Spess
. uint8_t i; i = ADCW; (Ich dachte eigentlich dass das Register einfach ADC heißt) Du willst also einen 16bit-Wert in eine 8bit Variable quetschen... if(i>=100){ PORTB = 0b10000000; } if(i>=200){ PORTB = 0b11000000; } So weit, so gut... if(i>=300){ PORTB = 0b11100000; } if(i>=400){ PORTB = 0b11110000; } if(i>=500){ PORTB = 0b11111000; } if(i>=600){ PORTB = 0b11111100; } Welches ist gleich noch mal der höchst mögliche Wert einer 8bit-Variable?
lol das geht mir auch meistens so. Ok ich versuchs besser zu machen, ich wollte halt das keiner beim lesen einschläft und vom Sessel kippt. also erstmal ein Bild (sagt mehr als 1000 Worte) http://kingdonderguru.ki.funpic.de/Bilder/P1010432.JPG Ich versuche den A/D Wandler vom ATMEGA16 zum laufen zu bringen. Am A/D Wandler (Pin PA0) hängt ein Potti mit dem ich die Spannung einstelle. An den Pins PB0-PB5 hängen 6 LEDs die leuchten sollen. Um so mehr Spannung am A/D Wandler anliegt um so mehr LEDs sollen leuchten. Zb 0,5V eine LED, 1V zwei LEDs usw. Ich habe dazu einen Code den ich im Wiki gefunden habe umgeschrieben. Da liegt aber auch der Fehler. Der Code wird nicht angenommen, und ich weiß nicht wo der Fehler liegt. Daher bitte ich euch mal einen Blick draufzuwerfen, da ich nicht weiter komme. Die Schaltung sollte soweit passen und läuft.Der Code ist im oberen Dateianhang. mfg
>(Ich dachte eigentlich dass das Register einfach ADC heißt) Also im wiki stand das so drinn, wenns wen interresiert kann ich den artikel mal hochladen da ich die seite nicht mehr finde. >Du willst also einen 16bit-Wert in eine 8bit Variable quetschen... mist gekonnt ignoriert (lol) muß ich gleich mal testen. mfg
Hi
>i = ADCW;
Mit Sicherheit falsch.
Du solltest in ADMUX das Bit ADLAR setzen. Dann sind die höherwertigen 8
Bit in ADCH
->i = ADCH
Noch was: Die Initialisierung des ADC sollte einmal vor der Schleife
erfolgen.
MfG Spess
>Hi >>Der Code ist im oberen Dateianhang. >Nö. Leider hats nicht beim ersten mal hochladen geklappt Entschuldigung angenommen. mfg
ich hab den Code mal nach euren Anregungen geändert. Leider hat das nicht den gewünschten Effekt. An dem Code ist immer noch was falsch. Hir der Fehler der auftritt ../fghfhg.c:26: error: 'ADC0' undeclared (first use in this function) ../fghfhg.c:26: error: (Each undeclared identifier is reported only once ../fghfhg.c:26: error: for each function it appears in.) Leider kann ich mir darauf keinen Reim machen. Im wiki stand da anstatt ADC0 channel aber das geht auch nicht. Ich hab den geänderten Code mal angehänt. mfg
Hi Entschultige mal bitte. Aber hast du etwas von dem Code, den du da irgendwie zusammenkopiert hast, etwas verstanden? Ich komme aus der Assemblerecke und habe noch kein Programm in C geschrieben. Aber da sträuben sich selbst mir die Nackenhaare. MfG Spess
öm also bis auf den ausschnitt // Den ADC initialisieren und einen sog. Dummyreadout machen ADCSRA |= (1<<ADSC); while(1) { // Den ADC aktivieren und Teilungsfaktor auf 64 stellen ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // Kanal des Multiplexers waehlen ADMUX = ADC0; // Interne Referenzspannung verwenden (also 2,56 V) ADMUX |= (1<<REFS1) | (1<<REFS0)| (1<<ADLAR); // Den ADC initialisieren und einen sog. Dummyreadout machen ADCSRA |= (1<<ADSC); // Auf Ergebnis warten... while(ADCSRA & (1<<ADSC)); i = ADCH; // ADC wieder deaktivieren ADCSRA &= ~(1<<ADEN); hab ich den Code selbst geschrieben. Ich hab auch schon ein Programm mit doppelter 7Segmentanzeige (Multiplexen) und anschluß an den Parallelport hinbekommen. Aber ich geb zu ich bin ein schlechter Programmierer. Mußte mir alles selber beibringen. Und hab bei weitem nicht alles verstanden. Aber das der Code jetzt so schlecht ist verstehe ich nicht. Wenn du die Einrückung meinst die kommt meist durch das kopieren etwas durcheinander und ich bin auch nicht immer so gewissenhaft. Hab mir alles über open sorce beigebracht was natürlich nicht immer auf meine bedürfnisse zugesnitten war. Aber nun schluß mit dem Mitleid erhaschen. Auch wenn der Code schlecht ist würde ich gerne wissen wo der Fehler liegt bzw wie ich ihn beheben kann. mfg
Initialisierung vom ADC wie gesagt vor der Schleife. Port A ist nicht als Eingang gewählt, dafür Port D. Interner Pull-Up muss für einen Analogeingang abgedreht werden. ADMUX = ADC0 ist Quatsch. Für ADC0 müssen die MUX Bits im ADMUX Register 0 sein. ADC0 ist, wie dir der Compiler gesagt hat, nicht in der Headerdatei definiert. ADC0 ist PA0 wie du wissen solltest (vom Schaltungsaufbau). Ob die gewählte Referenzspannung für dich die Richtige ist, musst du wissen. ADC und ADCW sind dasselbe, in C kannst du beides für das ADC Ergebnis verwenden. Trotzdem ist das Ergebnis 10 Bit breit. Reichen dir die höherwertigen 8 Bit dann einfach ADLAR (left alignment) im ADMUX Register 1 setzen und nur ADCH auslesen (ADCH muss ausgelesen werden). Dann tuts auch ein uint8_t und du brauchst keine uint16_t Variable. Der Wertebereich liegt dann natürlich zwischen 0 und 255 (bei 10 Bit zwischen 0 und 1023). ADC immer wieder zu deaktivieren ist Quatsch, lass ihn einfach an. Variablen sollten sinnvolle Namen haben, verwendete Register eigentlich neu definiert werden (z.B. #define LED_PORT PORTB) um spätere Änderungen der gewählten Ports leicht zu ermöglichen und den Sinn des Ports zu erhalten. Zieh dir mal das Datasheet falls du es noch nicht getan hast, es beißt nicht. Im Inhaltsverzeichnis findest du schnell was du brauchst. Wenn nicht der ganze Port verwendet wird, dann nur die verwendeten Bits verändern. Wenn du z.B. bei PORTA nur den PA0 Pin (ADC0) verwendest, dann ändere nur dieses Bit in den jeweiligen Registern. MfG
Und zu guter letzt: Warum verwendest du nicht einfach die Routine aus dem Tutorial http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29 Gut, die ist übervorsichtig geschrieben und in einer realen Applikation könnte man sie in Initialisierung und Auswertung trennen. Aber ... sie funktioniert erst mal und wäre als erster Ausgangspunkt schon mal gut zu gebrauchen.
ok danke erstmal an euch alle Ich werd mich da heute noch mal dransetzen und versuchen es besser zu machen. mfg
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.