Forum: Mikrocontroller und Digitale Elektronik Übersehe ich was? ADC am Attiny85


von Martin S. (sirnails)


Lesenswert?

Hallo miteinander,

ich glabue ich bin grad ein bisschen betriebsblind. Ich habe einen 
Tiny85. Dort initialisiere ich den ADC:
1
void ADC_Init(void) {
2
  // Interne 2,54V, Pin PB0 getrennt
3
  ADMUX = (1 << REFS2) | (1 << REFS1);
4
  
5
  // Frequenzvorteiler auf Faktor fclk / 64
6
  ADCSRA = (1 << ADPS2) | (1<<ADPS1);
7
  
8
  // ADC einschalten
9
  ADCSRA |= (1<<ADEN);
10
  
11
  // Erste Wandlung manuell auslösen (siehe Datenblatt S. 114 - ADCSRA-Register)
12
  ADCSRA |= (1<<ADSC);               
13
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der Konvertierung warten
14
  }
15
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
16
  Wandlung nicht übernommen. */
17
  (void) ADCW;
18
}

und frage dann ab:
1
adc_val = ADC_Read(3);
2
    
3
    if (adc_val >= 0x3FF) {
4
      PB4_on();
5
    } else {
6
      PB4_off();
7
    };

Dann toogelt mit Pin4 schon bei 0,985V. Ich verstehe blos gerade nicht 
warum? Es müssten 2,54V sein?!

Das DB sagt: "Internal 2.56V voltage reference without external bypass 
capacitor, disconnected from PB0 (AREF).(1)"

Dankbar für die Hilfe :)

von Thomas E. (thomase)


Lesenswert?

Interessant wäre jetzt die ADC_Read-Funktion.

mfg.

von Felix P. (fixxl)


Lesenswert?

Zeig uns bitte die read-Funktion. In 99,99% aller Fälle wird ADMUX beim 
Setzen des Kanals ungewollt überschrieben und so die Referenz verändert.

von Blinky (Gast)


Lesenswert?

Byte-Dreher in der Routine ADC_Read()?

von Martin S. (sirnails)


Lesenswert?

Ach klar, sollte natürlich mit dazu :)
1
uint16_t ADC_Read(uint8_t Channel) {
2
  
3
  // Kanal wählen
4
  ADMUX = (ADMUX & ~(0x1F)) | (Channel & 0x1F);
5
  
6
  // Einzelne Wandlung durchführen
7
  ADCSRA |= (1<<ADSC);            
8
  
9
  // Auf Abschluss warten  
10
  while (ADCSRA & (1<<ADSC)) {
11
    // Dummy
12
  };
13
    
14
  // Wert zurückgeben
15
  return ADCW;                   
16
  
17
};

von Felix P. (fixxl)


Lesenswert?

Felix Pflaum schrieb:
> Zeig uns bitte die read-Funktion. In 99,99% aller Fälle wird ADMUX beim
> Setzen des Kanals ungewollt überschrieben und so die Referenz verändert.

Martin Schwaikert schrieb:
>
1
ADMUX = (ADMUX & ~(0x1F)) | (Channel & 0x1F);

q.e.d. - du bügelst REFS2 auf 0 --> Die beiden 0x1F solltest du durch 
0x0F ersetzen.

: Bearbeitet durch User
von Martin S. (sirnails)


Lesenswert?

Ohh mir schwant ein böser Fehler...

Editha: Felix war schon schneller.

Dumm von mir!

Vielen Dank.

: Bearbeitet durch User
von TinyNoob (Gast)


Lesenswert?

^^ Lustig habe jetzt auch das erste Mal einen Tiny85 benutzt und erstmal 
alles falsch gemacht was geht ;>

Zuerst übersehen, dass die ADC IN´s eben nicht einfach binär 
durchkodiert sind, dann noch das ADC3 der Temperaturmesser ist, und zum 
krönenden Abschluss selbstverständlich die Clock-Prescaler Bits nicht 
gesetzt...

Alter Schwede...

von Martin S. (sirnails)


Lesenswert?

Wie ist das eigentlich mit AREF, wenn ich SPI dran hab? Muss ich dann 
jedes Mal die Referenz entfernen, um zu programmieren?

von Thomas E. (thomase)


Lesenswert?

Martin Schwaikert schrieb:
> Wie ist das eigentlich mit AREF, wenn ich SPI dran hab? Muss ich
> dann jedes Mal die Referenz entfernen, um zu programmieren?

Eine externe Referenz? Ja, die musst du abklemmen. Sonst trifft Ausgang 
auf Ausgang.

mfg.

von Walter (Gast)


Lesenswert?

Martin Schwaikert schrieb:
> if (adc_val >= 0x3FF) {

Du willst also nur testen ob die Spannung größer als die Referenz ist?

von Martin S. (sirnails)


Lesenswert?

Walter schrieb:
> Martin Schwaikert schrieb:
>> if (adc_val >= 0x3FF) {
>
> Du willst also nur testen ob die Spannung größer als die Referenz ist?

Nope, damit teste ich, welche Spannung die Referenz hat. Steht auch so 
im DB vom Tiny85 drinnen.

von spess53 (Gast)


Lesenswert?

Hi

> if (adc_val >= 0x3FF)

Das kann nicht >0x3FF werden.

MfG Spess

von Martin S. (sirnails)


Lesenswert?

spess53 schrieb:
> Hi
>
>> if (adc_val >= 0x3FF)
>
> Das kann nicht >0x3FF werden.
>
> MfG Spess

Gut, dass dort nicht nur ">" steht ;-)

von spess53 (Gast)


Lesenswert?

HI

>Gut, dass dort nicht nur ">" steht ;-)

Es ist trotzdem sinnlos.

MfG Spess

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.