Forum: Mikrocontroller und Digitale Elektronik ADC Pin nach Wandlung umschalten


von Peter Heffner (Gast)


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ß

von Stefan F. (sfrings)


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.

von Peter Heffner (Gast)


Lesenswert?

Fehler gefunden.
Delay-Zeiten werden nicht gebraucht. Aber ich muss den Port schon 
zwischen Ein- und Ausgang umschalten.

von Peter Heffner (Gast)


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.

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.