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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.