Forum: Compiler & IDEs Probleme bei ADC mit dem Attiny85


von tinynoob (Gast)


Lesenswert?

Hallo,
ich versuche seit mehreren Stunden eine ADC mit dem Attiny85 zum Laufen 
zu bekommen.
Da ich ein Codebeispiel im Internet gefunden habe, dachte ich das dürfte 
kein Problem sein. Ich habe nur das ADMUX Register geändert, damit die 
ADC an PB2 durchgeführt wird.
Abhängig vom ermittelten Spannungswert sollen verschiedene Ausgänge 
geschaltet werden, als Referenz dient VCC.
Allerdings reagiert der uC nicht, egal welche Spannung ich an PB2 
anlege.
Hier mein Code:
1
#include <avr/io.h>
2
3
void init(void);
4
void initADC(void);
5
void adcmeasure(void);
6
7
void main(void)
8
{
9
  init();
10
  initADC();
11
    while(1)
12
    {
13
       adcstart();
14
       if(ADCH > 50)
15
       {
16
          PORTB |= 0b00001;
17
       }
18
19
       if(ADCH > 100)
20
       {
21
          PORTB |= 0b00011;
22
       }
23
    
24
       if(ADCH > 150)
25
       {
26
          PORTB |= 0b01011;
27
       }  
28
    
29
       if(ADCH > 200)
30
       {
31
          PORTB |= 0b11011;
32
       }
33
    }
34
}
35
36
void init(void)
37
{
38
  DDRB |= ((1 << DDB0) | (1 << DDB1) | (1 << DDB3) | (1 << DDB4)); //Set PB0,1,3,4 as output
39
}
40
41
void initADC(void)
42
{
43
  /* this function initialises the ADC 
44
45
        ADC Notes
46
  
47
  Prescaler
48
  
49
  ADC Prescaler needs to be set so that the ADC input frequency is between 50 - 200kHz.
50
  
51
  Example prescaler values for various frequencies
52
  
53
  Clock   Available prescaler values
54
   ---------------------------------------
55
   1 MHz   8 (125kHz), 16 (62.5kHz)
56
   4 MHz   32 (125kHz), 64 (62.5kHz)
57
   8 MHz   64 (125kHz), 128 (62.5kHz)
58
  16 MHz   128 (125kHz)
59
60
   below example set prescaler to 128 for mcu running at 8MHz
61
62
63
  */
64
65
  ADMUX =
66
            (1 << ADLAR) |     // left shift result
67
            (0 << REFS1) |     // Sets ref. voltage to VCC, bit 1
68
            (0 << REFS0) |     // Sets ref. voltage to VCC, bit 0
69
            (0 << MUX3)  |     // use ADC1 for input (PB2), MUX bit 3
70
            (1 << MUX2)  |     // use ADC1 for input (PB2), MUX bit 2
71
            (0 << MUX1)  |     // use ADC1 for input (PB2), MUX bit 1
72
            (1 << MUX0);       // use ADC1 for input (PB2), MUX bit 0
73
74
  ADCSRA = 
75
            (1 << ADEN)  |     // Enable ADC 
76
            (1 << ADPS2) |     // set prescaler to 64, bit 2 
77
            (1 << ADPS1) |     // set prescaler to 64, bit 1 
78
            (0 << ADPS0);      // set prescaler to 64, bit 0  
79
}
80
81
void adcstart(void)
82
{
83
   ADCSRA |= (1 << ADSC);// start ADC measurement
84
   while (ADCSRA & (1 << ADSC) ); // wait till conversion complete
85
}
Stimmt vielleicht etwas mit der Frequenz nicht? Eigentlich müsste der 
Attiny mit 8MHZ laufen.
Wäre super, wenn mir jemand weiterhelfen könnte :)

von Stefan E. (sternst)


Lesenswert?

tinynoob schrieb:
> Ich habe nur das ADMUX Register geändert, damit die
> ADC an PB2 durchgeführt wird.

Nein, deine aktuelle Einstellung ist nicht PB2.
Also nochmal das Datenblatt konsultieren.

von tinynoob (Gast)


Lesenswert?

Ok, das war ein richtig dummer Fehler, habe das zwar überprüft aber hab 
die Bits immer rückwärts gesetzt :(
Danke für deine Hilfe!

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.