ATtiny 24A - ADC will nicht

Gast #2885563
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>
Gast #2885610
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!
Gast #2885620
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
Gast #2885657
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.
Gast #2885765
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;
>      }

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