Forum: Mikrocontroller und Digitale Elektronik Attiny841 ADC


von Stefan S. (sschultewolter)


Lesenswert?

Hallo,

ich teste gerade den ATtiny841 für eine Spannungsmessung. Genutzt wird 
derzeit die interene 1V1 Referenz ohne Bypass Kondensator. Würde gerne 
zur Erhöhung der Genauigkeit diesen Kondensator zu schalten. (PA0 und 
GND mit einem Kerko verbinden).

Nur kann ich den ADC1 nicht auslesen. Hingegen geht es mit dem ADC0 
wunderbar. Woran liegt das und ist es sinnvoll, den Bypass zu nutzen für 
die Messung?
1
/*
2
* tiny841_adc.c
3
*
4
* Created: 19.01.2015 19:18:10
5
*  Author: sschultewolter
6
*/
7
8
9
#include <avr/io.h>
10
#include <util/delay.h>
11
#include "uart/uart.h"
12
13
void adc_init(void)
14
{
15
  // Internval 1.1V reference
16
  ADMUXB = /*(1<<REFS2) | (1<REFS1) |*/ (1<<REFS0);
17
  
18
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);
19
  ADCSRA |= (1<<ADEN);
20
  
21
  ADCSRA |= (11<<ADSC);
22
  while(ADCSRA & (1<<ADSC));
23
  (void) ADCW;
24
}
25
26
uint16_t adc_read(uint8_t channel)
27
{
28
  ADMUXA = (ADMUXA &~(0x1F)) | (channel & 0x1F);
29
  ADCSRA |= (1<<ADSC);
30
  while(ADCSRA & (1<<ADSC));
31
  return ADCW;
32
}
33
34
uint16_t adc_read_avg(uint8_t channel, uint8_t nsamples)
35
{
36
  uint32_t sum = 0;
37
  for(uint8_t i = 0; i < nsamples; i++)
38
  {
39
    sum+=adc_read(channel);
40
  }
41
  return (uint16_t)(sum/nsamples);
42
}
43
44
int main(void)
45
{
46
  uart_init();
47
  adc_init();
48
  
49
  sei();
50
  uart_puts_P("ADC Test Channel ADC1\r\n");
51
  
52
  uint16_t adcval;
53
  uint16_t count;
54
  while(1)
55
  {
56
    adcval = adc_read_avg(1, 10);
57
    uart_puti_format(count);
58
    uart_puts_P(" : ");
59
    uart_puti_format(adcval);
60
    uart_puts_P("\r\n");
61
    _delay_ms(1000);
62
  }
63
}

von c-hater (Gast)


Lesenswert?

Stefan S. schrieb:

> ich teste gerade den ATtiny841 für eine Spannungsmessung. Genutzt wird
> derzeit die interene 1V1 Referenz ohne Bypass Kondensator. Würde gerne
> zur Erhöhung der Genauigkeit diesen Kondensator zu schalten. (PA0 und
> GND mit einem Kerko verbinden).
>
> Nur kann ich den ADC1 nicht auslesen.

Wie äußert sich das?

von Nico (nico123)


Lesenswert?

Stefan S. schrieb:
> Genutzt wird derzeit die interene 1V1 Referenz ohne Bypass Kondensator.
> Würde gerne zur Erhöhung der Genauigkeit diesen Kondensator zu schalten.

Für die interne Referenz kannst/brauchst Du beim Tiny841 keinen externen 
Kondensator! AREF ist nur für externe Referenzen gedacht.

Wie c-hate schon schrieb: was heißt ADC1 nicht auslesen können?

von (prx) A. K. (prx)


Lesenswert?

Nico ... schrieb:
> AREF ist nur für externe Referenzen gedacht.

Nicht ganz richtig. Siehe Doku von ADMUXB.

von (prx) A. K. (prx)


Lesenswert?

Stefan S. schrieb:
> Nur kann ich den ADC1 nicht auslesen.

Auf dem ADC1 Pin liegt TXD0, also deine erste serielle Schnittstelle. 
Der 841 hat zwar viele Funktionen, aber nur wenig Pins. Das hat Folgen.

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.