Forum: Mikrocontroller und Digitale Elektronik ATtiny461A ADC konvertiert grundlos


von Andreas M. (amesser)


Lesenswert?

Hallo,

Ich kämpfe hier seit ein paar Tagen an einem ADC Problem mit dem 
ATtiny461A und weis nicht mehr weiter. Der ADC beginnt zu konvertieren 
sobald ich das ADEN Bit setze, obwohl ich keinen Free-Running Mode und 
keinen Trigger aktiviert habe. Ich habe mir das Assembler-Listing 
angesehen und habe dort erst mal nix gesehen, was der GCC falsch machen 
könnte. Entweder mein Tiny ist hinüber oder das Datenblatt stimmt nicht, 
oder ich habe etwas im Datenblatt übersehen. Der folgende Code reicht, 
um das Problem bei mir auszulösen, am PB0 gibt es einen 4,5 kHz 
Rechteck. Wenn ich das sleep-enable auskommentiere dann passiert das was 
ich erwarten würde: der PB0 ändert sich nicht.
1
#include <avr/io.h>
2
#include <avr/sleep.h>
3
#include <avr/interrupt.h>
4
5
6
ISR(ADC_vect)
7
{
8
  PORTB ^= 0x01;
9
}
10
11
int main()
12
{
13
  CLKPR = _BV(CLKPCE);
14
  CLKPR = 0;
15
16
  DDRB = 0x01;
17
18
  ADCSRA =  _BV(ADEN)  | _BV(ADPS2) | _BV(ADPS1) | _BV(ADIE);
19
  ADCSRB =   0;
20
21
  set_sleep_mode(SLEEP_MODE_IDLE);
22
23
  sleep_enable();
24
  sei();
25
26
  while(1)
27
  {
28
    sleep_cpu();
29
  }
30
}
Vielleicht weis ja jemand Rat.

Gruß,
Andreas

von Bernd K. (prof7bit)


Lesenswert?

sleep mode.

Beim Aufwachen startet eine Wandlung. Steht irgendwo im Datenblatt ganz 
vergraben und beiläufig in einem Nebensatz erwähnt in irgendeinem 
anderen Kapitel.

von Andreas M. (amesser)


Lesenswert?

Bernd K. schrieb:
> sleep mode.
>
> Beim Aufwachen startet eine Wandlung. Steht irgendwo im Datenblatt ganz
> vergraben und beiläufig in einem Nebensatz erwähnt in irgendeinem
> anderen Kapitel.

Vielen Dank für den Hinweis. Hab noch mal im Manual gesucht, Im Kapitel 
7.1.1 stehts drinnen. Der ADC wird beim Eintreten in den Idle Mode und 
in den ADC Noise Reduction Mode gestartet wenn er aktiviert ist. Heist 
also für mich, das ich keinen Sleep Mode verwenden kann. Idee war den 
ADC von extern triggern zu lassen (timer) und aufzuwachen wenn er fertig 
ist.

von chris (Gast)


Lesenswert?

Bernd K. schrieb:
> Beim Aufwachen startet eine Wandlung.

Nicht eher beim Einschlafen? Sonst würde er ja garnicht aufwachen, weil 
es hier ja nur den ADC-Interrupt zum Aufwecken gibt.
Sinn des Ganzen ist es, die ADC-Wandlung auszuführen, während die 
restlichen Takte (oder zumindest einige davon) stehen --> weniger 
Störungen / besseres Messergebnis.

von Andreas M. (amesser)


Lesenswert?

chris schrieb:
> Bernd K. schrieb:
>> Beim Aufwachen startet eine Wandlung.
>
> Nicht eher beim Einschlafen? Sonst würde er ja garnicht aufwachen, weil

Stimmt, ich sollte ins Bett...

von Martin S. (led_martin)


Lesenswert?

Seite 36:

7.1.1 Idle Mode
When bits SM[1:0] are written to 00, the SLEEP instruction makes the MCU 
enter Idle mode, stopping the CPU but allowing Analog Comparator, ADC, 
Timer/Counter, Watchdog, and the interrupt system to continue operating. 
This sleep mode basically halts clkCPU and clkFLASH, while allowing the 
other clocks to run. Table 7-1. Active Clock Domains and Wake-up Sources 
in Different Sleep Modes Sleep Mode Active Clock Domains Osc. Wake-up 
Sources clkCPU clkFLASH clkIO clkADC clkPCK clkPLL Main Clock Source 
Enabled INT0, INT1 and Pin Change SPM/EEPROM Ready Interrupt ADC 
Interrupt USI Interrupt Other I/O Watchdog Interrupt
Idle mode enables the MCU to wake up from external triggered interrupts 
as well as internal ones like the Timer Overflow. If wake-up from the 
Analog Comparator interrupt is not required, the Analog Comparator can 
be powered down by setting the ACD bit in the Analog Comparator Control 
and Status Register – ACSR. This will reduce power consumption in Idle 
mode. If_the_ADC_is_enabled, 
a_conversion_starts_automatically_when_this_mode_is_entered.

Mit freundlichem Gruß - Martin

von Bernd K. (prof7bit)


Lesenswert?

chris schrieb:
> Bernd K. schrieb:
>> Beim Aufwachen startet eine Wandlung.
>
> Nicht eher beim Einschlafen?

ja, ich hatte es nur noch dunkel in Erinnerung.

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.