AtTiny85 ADC

Gast #4371793
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.
#4371800
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.

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