ADC Pin nach Wandlung umschalten

Gast #2767114
Hi,

Vorab: verwendete Hardware:

µC: ATTINY13-20PU @ 8 MHz
Prog: AVR-DRAGON

Ich möchte einen ADC-Pin nachdem eine Wandlung durchgeführt wurde, und 
diesen einen gewissen Wert erbracht hat, als Ausgang umschalten.

In der Theorie würde ich sagen - auch nachdem, was ich im gcc Tutorial 
gelesen habe - ADC ausschalten über ADCSRA (Bit Aden auf 0) und dann den 
Port über das entsprechende DDR auf Ausgang umschalten.

Bei mir tritt nun folgendes Problem auf: Die AD-Wandlung wird 
durchgeführt. Sobald ich das Port-Bit allerdings auf Ausgang umschalte 
ist der ganze Port anschließend tot. Keinerlei reaktion mehr.

Die Funktion "ReadChannel" habe ich aus dem GCC Tutorial, die 
funktioniert einwandfrei. Das konnte ich Prüfen, indem ich einfach das 
Umschalten von PORTB4 weggelassen habe und dafür nur über PORTB3 die 
ausgabe gemacht habe.
1
int main(void)
2
{
3
    while(1)
4
    {
5
    if(ReadChannel(0b10) > ADC_SCHWELLWERT)  
6
    {
7
      config_output();
8
                        PORTB |= (1<<PORTB3) | (1<<PORTB4);
9
                        _delay_ms(500);
10
                        PORTB &= ~((1<<PORTB3) | (1<<PORTB4));
11

12
    }      
13
    } // while(...
14
} // int main(v...
15

16
void config_output()
17
{
18
  ADCSRA &= ~(1<<ADEN); // ADC aus
19
  _delay_ms(100); // sicherheitshalber mal 100ms warten
20
  DDRB |= (1<<DDB3) | (1<<DDB4); / DDR einstellen
21
}

Ja ich denke (hoffe), dass das erstmal genug Infos sind, und mir jemand 
schonmal sagen kann, was genau ich falsch mache.

Gruß
Du brauchst den ADC nicht aus zu schalten, alle ADC Pins können 
gleichzeitig auch digital als Eingang und Ausgang genutzt werden. Wenn 
der Pin ein Ausgang ist, misst der ADC die Spannung, die heraus kommt.

Du brauchst keine Delays.

Ich vernute, dein Problem liegt in der Hardware, möglicherweise in der 
Stromversorgung.
Gast
Hier nochmal der fertige Code, falls jemand anderes ein ähnliches 
Problem hat:
1
int main(void)
2
{
3
    while(1)
4
    {
5
    if(ReadChannel(0b10) > ADC_SCHWELLWERT)  
6
    {
7
      config_output();
8
                        PORTB |= (1<<PORTB3) | (1<<PORTB4);
9
                        _delay_ms(500);
10
                        PORTB &= ~((1<<PORTB3) | (1<<PORTB4));
11
                        DDRB &= ~(1<<DDB4);
12
    }      
13
    } // while(...
14
} // int main(v...
15

16
void config_output()
17
{
18
  ADCSRA &= ~(1<<ADEN); // ADC aus
19
  DDRB = 0x00;
20
  DDRB |= (1<<DDB3) | (1<<DDB4); / DDR einstellen
21
}

Nicht perfekt, aber es ist nur ein "Versuchs-Code". Vor dem Einstellen 
des DDR setze ich das DDRB zurück. Dann einstellen. Dann PORTB3/4 an und 
wieder aus. Dann DDB4 wieder als Eingang schaten.

Hat sofort funktioniert.

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.