ADC Pin nach Wandlung umschalten

Gast #2767114
Lesenswert?

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ß
#2767171
Lesenswert?

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 #2767402
Lesenswert?

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

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