ATtiny461A ADC konvertiert grundlos

#4047717
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
#4047764
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.
Gast #4047766
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.
#4047781
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

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