Forum: Mikrocontroller und Digitale Elektronik Lüftersteuerung über adc


von Steve U. (giftzwerg)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von Giftzwerg (Gast)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?


von Steve U. (giftzwerg)


Lesenswert?

wie muss ich den die Deklaration machen komme irgend wie net weiter und 
ja 8 bit reichen aus

von Max H. (hartl192)


Lesenswert?

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

von Steve U. (giftzwerg)


Lesenswert?

Kenn ich. Hab ich auch schon zu Rategezogen aber wo wird da was zu 
adcVaalue ausgesagt finde den Begriff darin nicht!!!!

von Max H. (hartl192)


Lesenswert?

Im oben verlinkten Artikel wird es "adcval" genannt.

von Steve U. (giftzwerg)


Lesenswert?

und das dann bei der ADC Konfiguration mit einfügen aber warum steht da 
ne 16 oder gebe ich die bit nicht an ???

von Steve U. (giftzwerg)


Lesenswert?

und dem adcvalue muss ich vor her keinen wert geben und dem unit16_t 
auch nicht???

von Max H. (hartl192)


Lesenswert?

Ich würde ganz ehrlich ein C-Buch/-Tutorial empfehlen...

von Steve U. (giftzwerg)


Lesenswert?

habe ich helfen mir aber leider nicht weiter

von Steve U. (giftzwerg)


Lesenswert?

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????

von Vilex (Gast)


Lesenswert?

Lasst ihn dumm sterben mehr hat da keinen Sinn mehr!

von Gerhard W. (gerhard86)


Lesenswert?

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.

von Steve U. (giftzwerg)


Angehängte Dateien:

Lesenswert?

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

von MaWin (Gast)


Lesenswert?

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.

von Steve U. (giftzwerg)


Lesenswert?

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

von Karol B. (johnpatcher)


Lesenswert?

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

von derElf (Gast)


Lesenswert?

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

von Steve U. (giftzwerg)


Lesenswert?

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???

von Karol B. (johnpatcher)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.