Forum: Mikrocontroller und Digitale Elektronik AtTiny85 ADC


von Norbart (Gast)


Lesenswert?

Ich bekomme einfach nicht den ADC vom AtTiny85 zum Laufen... Hab mich an 
diesem Code orientiert:
1
void initADC()
2
{
3
  /* this function initialises the ADC 
4
5
        ADC Notes
6
  
7
  Prescaler
8
  
9
  ADC Prescaler needs to be set so that the ADC input frequency is between 50 - 200kHz.
10
  
11
  Example prescaler values for various frequencies
12
  
13
  Clock   Available prescaler values
14
   ---------------------------------------
15
   1 MHz   8 (125kHz), 16 (62.5kHz)
16
   4 MHz   32 (125kHz), 64 (62.5kHz)
17
   8 MHz   64 (125kHz), 128 (62.5kHz)
18
  16 MHz   128 (125kHz)
19
20
   below example set prescaler to 128 for mcu running at 8MHz
21
22
23
  */
24
25
  ADMUX =
26
            (1 << ADLAR) |     // left shift result
27
            (0 << REFS1) |     // Sets ref. voltage to VCC, bit 1
28
            (0 << REFS0) |     // Sets ref. voltage to VCC, bit 0
29
            (0 << MUX3)  |     // use ADC2 for input (PB4), MUX bit 3
30
            (0 << MUX2)  |     // use ADC2 for input (PB4), MUX bit 2
31
            (1 << MUX1)  |     // use ADC2 for input (PB4), MUX bit 1
32
            (0 << MUX0);       // use ADC2 for input (PB4), MUX bit 0
33
34
  ADCSRA = 
35
            (1 << ADEN)  |     // Enable ADC 
36
            (1 << ADPS2) |     // set prescaler to 64, bit 2 
37
            (1 << ADPS1) |     // set prescaler to 64, bit 1 
38
            (0 << ADPS0);      // set prescaler to 64, bit 0  
39
}
40
41
42
int main( void ) 
43
{
44
  
45
  initADC();
46
47
  while(1)
48
  {
49
50
    ADCSRA |= (1 << ADSC);         // start ADC measurement
51
    while (ADCSRA & (1 << ADSC) ); // wait till conversion complete 
52
53
    if (ADCH > 128)
54
    {
55
      // ADC input voltage is more than half of VCC
56
57
    } else {
58
59
      // ADC input voltage is less than half of VCC
60
61
    }
62
63
  }
64
65
  return 0;
66
}

Quelle: http://www.marcelpost.com/wiki/index.php/ATtiny85_ADC

Natürlich bin ich auch das Datenblatt rauf und runter, aber ich komm 
einfach nicht auf das Problem. Fuses sind auch richtig gesetzt.

Dem Code habe ich lediglich 'DDRB = (1<<PB1);' und in der if-else 
Abfrage 'PORTB |= (1<<PB1);', 'PORTB |= (0<<PB1);' hinzugefügt.

An PB1 hängt eine LED mit Vorwiderstand.

Derzeitig scheint es nur zu einer Umwandlung zu kommen... schwebt PB4 
(ADC2) beim Neustart oder liegt auf Masse ist die LED wie gewünscht aus. 
Ist PB4 beim Start auf VCC leuchtet die LED. Verbinde ich PB4 von 
Floating/Masse auf Vcc geht die LED an. Aber nicht mehr aus.

von Karl H. (kbuchegg)


Lesenswert?

Norbart schrieb:

> Dem Code habe ich lediglich 'DDRB = (1<<PB1);' und in der if-else
> Abfrage 'PORTB |= (1<<PB1);', 'PORTB |= (0<<PB1);' hinzugefügt.

Hier steckt dein Problem.
Ein Bit wird nicht so auf 0 zurückgesetzt. Biroperationen solltest du 
eigentlich schon beherrschen, wenn du beim ADC angelangt bist.
1
    if( ADCH > 128 )
2
      PORTB |= ( 1 << PB1 );
3
    else
4
      PORTB &= ~( 1 << PB1 );

Es geht eben nichts über ein solides Grundlagenwissen.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

PORTB |= (0<<PB1)

und was soll das bringen?

von Samelton (Gast)


Lesenswert?

Karl H. schrieb:
> Hier steckt sein Problem.

Die Nacht hätte viel kürzer werden können... danke...

Ist mein erstes Projekt seit knapp einem Jahr, ich schäme mich trotzdem.

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.