Lüftersteuerung über adc

OP #3675223
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
Gast #3675243
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
OP #3675482
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????
Gast #3675576
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.
#3675654
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
OP #3675685
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???
#3675697
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
Gast #3675732
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren