hatte voreiniger Zeit schonmal gefragt aber beim Übersetzen kamm es nun zu Problemen nennt mir mal andere Lösungsvorschläge um die PWM über den ADC in Stufen zu schalten // Ein/Ausgänge konfigurieren DDRD |= (1<<PD7); //Ausgänge //PWM konfigurieren TCCR2 |= (1<<WGM21); // TCCR2 |= (1<<WGM20); // Timer Einstellung Fast PWM, 8-bit TCCR2 |= (1<<CS22); // Vorteiler 256 TCCR2 |= (1<<COM21); // Nicht invertierender PWM-Modus OCR2 = 0; // Startwert Ausgang // ADC konfigurieren ADMUX |= (1<<ADLAR); // Datenrichtung ADCSRA |= (1<<ADEN); // ADC Einschalten ADCSRA |= (1<<ADSC); // Starten Freimessen ADCSRA |= (1<<ADATE); // Freimessen erlauben ADCSRA |= (1<<ADPS2); // ADCSRA |= (1<<ADPS1); // Takt Vorteiler 64 ADCSRA |= (1<<ADPS0); // while(1) { if( adcValue < 400) OCR2 = 64; else if (adc Value < 800) OCR2 = 128; else if (adcValue < 900) OCR2 = 191 else OCR2 = 255 _delay_ms(20) } } laut Überzetzung im Atmel Studio ist adcValue das problem Controller ist der ATMega 16
Steve Uffelmann schrieb: > else if (adc Value < 800) Versuch mal das Leerzeichen zu entfernen. adcValue muss noch deklariert werden und dann sollte ihm auch ein sinnvoller Wert zugewiesen werden.
welches Leerzeichen meinst du und wie musst das adcvalue Deklariert werden weil ich davon keine Ahnung hab war ja nicht meine Idee das so zu lösen aber habs eingesehn das das kürtzer ist warum sind die Werte nicht Sinvoll was wäre besser
Wahrscheinlich hat adcValue nur 8 bit und kann daher nicht 400 oder 800 gross sein, aber das du NATÜRLICH nicht die Deklaration angegeben hast, weiß man das nicht.
Giftzwerg schrieb: > welches Leerzeichen meinst du else if (adc Value < 800) ^ | Lies mal das: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe#Der_interne_ADC_im_AVR
wie muss ich den die Deklaration machen komme irgend wie net weiter und ja 8 bit reichen aus
Steve Uffelmann schrieb: > wie muss ich den die Deklaration machen komme irgend wie net weiter und
1 | uint16_t adcValue; |
> ja 8 bit reichen aus
Dann ist deine Zahl aber immer <256
Kenn ich. Hab ich auch schon zu Rategezogen aber wo wird da was zu adcVaalue ausgesagt finde den Begriff darin nicht!!!!
und das dann bei der ADC Konfiguration mit einfügen aber warum steht da ne 16 oder gebe ich die bit nicht an ???
und dem adcvalue muss ich vor her keinen wert geben und dem unit16_t auch nicht???
So hab jetzt noch mal Gesucht also so richtig über das unit16_t hab ich nichts gefunden, also wäre ne Erklärung ob ich das Füttern muss und wenn wie das Abläuft ganz gut. Aber was ganz anders. Warum wenn der ADC immer selber Messen soll kann ich nicht einfach das ADCL Register vergleichen also ungefähr so if (adcl < 150) OCR2 = 64 oder denke ich da Falsch????
Kannst du nicht mal den ganzen Sourcecode hineinstellen, damit die Leute die dir helfen wollen wenigstens nicht hilflos im dunklen tappen? Oder IST das der ganze Sourcecode? Dann gibt es adcValue doch nicht einmal, und der ADC wird nirgendwo ausgelesen.
sorry hat jetzt etwas Gedauert Weis nicht ob ihr noch Infos Braucht und es war nichd so ganz meine Idee da ich mit unit16_t noch rein garnichts zutun hatte und auch in meinen Büchern noch keine infos dazu gefunden hab
Wenn das der ganze Code ist, ist ja klar dass der Compiler sich über adcValue beschwert, der ist nirgends deklariert und wird nirgends vom A/D-Wandler eingelesen. Dir fehlt es massiv an Grundlagen zur Programmierung, du kopierst nur nicht verstandenes Zeug zusammen. Lese erst mal dein Buch.
das buch habe ich schon 5 mal gelesen alles andere habe ich mir selber erarbeitet das einzigste ist die pwm steuerung über den adc wandler hast du da denn nen tipp oder ne bessere lösung ich finde an den ganzen beispielen nichts was ich um setzen könnte
Steve Uffelmann schrieb: > das buch habe ich schon 5 mal gelesen Steve Uffelmann schrieb: > oder ne bessere lösung ich finde an den ganzen > beispielen nichts was ich um setzen könnte Du wirst auch kaum eine Lösung für genau dieses Problem in einem Buch bzw. Tutorial vorfinden. Materialien dieser Art sollen die Grundlagen vermitteln, z.B. also Variablendeklarationen. Dabei darf man ja wohl davon ausgehen, dass du den geistigen Transfer von "adcval" auf "adcValue" bzw. umgekehrt hin bekommst. Wenn du selbst solch elementare Dinge nicht hin bekommst, dann ist das halt ein Beweis dafür, dass du noch massig Inhalte zum Nachholen hast, bevor du anfangen solltest "echten" Code zu produzieren. Mit deiner Attitüde (à la geht nicht, macht ihr mal bzw. sagt mir was ich ändern soll) wirst du so übrigens auch kaum zu Erfolgen kommen. Wir bieten hier i.d.R. Hilfe zur Selbsthilfe und keine fertigen Lösungen, die du dann nur noch übernehmen brauchst. Mit freundlichen Grüßen, Karol Babioch
Dir fehlt der Teil wo du die Variable adcValue erstellst (deklarierts). Die Zeile schaut etwa so aus:
1 | uint16_t adcValue = 0; |
Wo und warum du diese Zeile brauchst steht in deinem C-Buch
okay gut aber jetzt noch mal was anderes, wenn ich den ADC so einstelle das er eine Messung/Wandlung nach der anderen macht schiebt er doch das Ergebniss immer wieder ins ADCL und ADCH Register und Überschreibt die Werte die drinn sind, so wie ich das Verstanden habe ist das Richtig???
Siehe dazu Datenblatt: > 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. Das Tutorial [1] beschreibt das so: > Beim Auslesen der ADC-Register ist zu beachten: Immer zuerst ADCL und > erst dann ADCH auslesen. Beim Zugriff auf ADCL wird das ADCH Register > gegenüber Veränderungen vom ADC gesperrt. Erst beim nächsten Auslesen des > ADCH-Registers wird diese Sperre wieder aufgehoben. Dadurch ist > sichergestellt, daß die Inhalte von ADCL und ADCH immer aus demselben > Wandlungsergebnis stammen, selbst wenn der ADC im Hintergrund selbsttätig > weiterwandelt. Das ADCH Register muss ausgelesen werden! Sofern du mit C arbeitest, erledigt das aber der Compiler für dich, zumindest, wenn du auf ADC (also ohne H bzw. L) zugreifst. Mit freundlichen Grüßen, Karol Babioch [1]: https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
Steve Uffelmann schrieb: > und Überschreibt die Werte die drinn sind, so wie ich das Verstanden > habe ist das Richtig??? Ja und? Willst du die Werte bis zum Sankt Nimmerleinstag aufheben? p.s. Neben einem C-Buch solltest du auch mal irgendetwas über elementare Rechtschreibregeln lesen - das ist ja grausig zu lesen.
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.