Forum: Mikrocontroller und Digitale Elektronik ATtiny 24A - ADC will nicht


von Anfänger (Gast)


Lesenswert?

Hallo Leute,

ich bin ein blutiger Anfänger und habe mir eine Schaltung mit ATtiny24A 
aufgebaut mit internen Oscilator. Am PIN10(ADC3) liegt eine Spannung von 
ca 3V an und diese möchte ich mit ADC auslesen und paar Ausgänge 
schalten. Mein Problem ist das Programm will irgendwie nicht. Kann mir 
jemand sagen was ich falsch mache? Ich kriege es einfach nicht raus, 
warum immer der ADC Wert nicht grösser Null ist!!!

<code>
int BattVoltage;

int main(void)
{
    IO_init();
    DDRA  &= ~(1<<PA3);

  while(1)
    {

  ADMUX = 0x03; // Kanal 3 wählen und VCC als Referenzspannung
  ADCSRA |= (1<<ADPS2) | (1<<ADPS1);     // Frequenzvorteiler 64
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren

  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) );    // Einmal durchlaufen lassen
  _delay_ms(1);

  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC));    // Abschluss der Konvertierung warten
  _delay_ms(1);
  BattVoltage= ADCW;

    if (BattVoltage > 0){
      LS1_ON;
      LS2_ON;
    }
      LS1_OFF;
      LS2_OFF;
    }
}
</code>

von Patrick B. (p51d)


Lesenswert?

ADC-Initialisierung im Main-Loop? würde ich raus nehmen (also nur einmal 
machen)
Was sagt der Debugger/Simulator im AVR-Studio? Der Code sieht eigentlich 
gut aus...

Ansonsten kannst du ja noch einen Blick hier hinein werfen...
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe

von Anfänger (Gast)


Lesenswert?

der Initialisierungscode ist eigentlich auch ausserhalb der Main-Loop, 
ich wollte es eigentlich nur für die Problem suche kompakt haben.

Der Simmulator läuft immer bei der Schleife while (ADCSRA & (1<<ADSC)); 
durch zum nächsten Breakpoint und zeigt aber am Ende den Wert Null an! 
Das ist denke ich normal oder? Und die Bits sind auch alle richtig 
gesetzt!

Ich benutze AVR Studio 6!

von spess53 (Gast)


Lesenswert?

Hi

>Der Simmulator läuft immer bei der Schleife while (ADCSRA & (1<<ADSC));
>durch zum nächsten Breakpoint und zeigt aber am Ende den Wert Null an!
>Das ist denke ich normal oder? Und die Bits sind auch alle richtig
>gesetzt!

Dann setze mal den Wert von BattVoltage manuell auf einen Wert>0.

Mir kommt diese Passage

>    if (BattVoltage > 0){
>      LS1_ON;
>      LS2_ON;
>    }
>      LS1_OFF;
>      LS2_OFF;

spanisch vor. Könnte allerdings auch von meinen rudimentären 
C-Kenntnissen kommen.

MfG Spess

von Hubert G. (hubertg)


Lesenswert?

Anfänger schrieb:
> if (BattVoltage > 0){
>       LS1_ON;
>       LS2_ON;
>     }
>       LS1_OFF;
>       LS2_OFF;

Ich weiß nicht wie du LS1-ON auswertest, aber du stellst es sofort 
wieder auf OFF. Sehen kannst du da sicher nichts.

von katastrophenheinz (Gast)


Lesenswert?

Hi,

hast du mal versucht, einen anderen Input zu nehmen?
z.b. die interne Referenz d.h. ADMX=0b00100001
Kommt da dann auch 0 raus?

Außerdem solltest du die erste Wandlung nach ADEN=1 wegwerfen, da kommt 
schrott raus. Betrifft das aber nur die allererste Wandlung, folgende 
Wandlungen sollten dann passen.

von Anfänger (Gast)


Lesenswert?

Oh man, danke jungs das Problem war einfach diese Stelle!!!

> if (BattVoltage > 0){
>       LS1_ON;
>       LS2_ON;
>     }
>       LS1_OFF;
>       LS2_OFF;

so ist richtig:

> if (BattVoltage > 0){
>       LS1_ON;
>       LS2_ON;
>     }
>  else{
>        LS1_OFF;
>       LS2_OFF;
>      }

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.