ATmega2560 ADC ISR differential channels, Auto Triggering

Gast #3911368
Lesenswert?

Hallo,

wie im Betreff erwähnt versuche ich gerade am ATmega2560 eine ISR zu 
realisieren, die alle x Sekunden von verschiedenen AI ADC Werte erfasst.

Aus dem Datenblatt kann ich bisher entnehmen:


ADMUX – ADC Multiplexer Selection Register:
7     6     5     4    3    2    1    0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
0     1     0     0    0    0    0    0
- BIT6: 5V Ref. Spg.


ADCSRA – ADC Control and Status Register A
7    6    5     4    3    2     1     0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
0    0    1     0    0    1     1     1
- BIT0,2,3: Prescaler 128
- BIT5: ADC Auto Trigger Enable (Voraussetzung für Auto Triggerung)


ADCSRB – ADC Control and Status Register B
7    6    5     4    3    2     1     0
–    ACME –     –    MUX5 ADTS2 ADTS1 ADTS0
0    0    0     0    0    1     0     1
- BIT0,2: Timer/Counter1 Compare Match B


TCCR1B – Timer/Counter 1 Control Register B
7     6     5 4     3     2    1    0
ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10
0     0     0 0     1     1    0    1
- BIT3: Clear Time on Compare (CTC)
- BIT0,2: Prescaler 1024


OCR1B = x     (für x Sekunden)


Und jetzt hörts auf.
Ich bin mir darüber im Klaren, dass ich den ADC zu Beginn erstmal 
erfassen lassen muss. Leider verstehe ich gerade nicht, wie die Syntax 
sein müsste, um den ADC-Wert von zwei versch. analogen Eingängen alle x 
Sekunden zu erfassen.

void init
{
  //Setzen von Bits in den entspr. Registern
}

void main
{
  //unwichtig
}

ISR(ADC_vect)
{
  //absolut keine Ahnung
}

Ich würde mich über Unterstützung bzw. Lösungsansatz sehr freuen
Gast #3911437
Lesenswert?

holger schrieb:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Danke für die schnelle Rückmeldung.
Natürlich habe ich mich bereits mit den Grundlagen und Syntax 
beschäftigt. Nur beim genannten Problem fehlt mir ein Ansatz für die 
Umsetzung. Programmiert habe ich bisher:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
void init{
5
   
6
   cli();
7

8
   ADMUX = (ADMUX & ~(0x1F)) | (a1_input & 0x1F);  
9
   ADMUX = (1<<REFS0);
10

11
   ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
12
   ADCSRA |= (1<<ADATE);
13

14
   ADCSRB = (1<<ADTS1) | (1<<ADTS2);
15

16
   ADCSRA |= (1<<ADEN);
17
   ADCSRA |= (1<<ADSC);
18
   while (ADCSRA & (1<<ADSC) );
19
   (void) ADCW;
20

21
   TCCR1B = 0;  
22
   OCR1B = 100000;
23
   TCCR1B |= (1 << WGM12);
24
   TCCR1B |= (1 << CS10);
25
   TCCR1B |= (1 << CS12);
26

27
   sei();
28
}

Ich weiß nicht, welche BITs in der ISR(ADC_vect) gesetzt werden müssen, 
um beide Channels einzulesen.

Wenn ich das Datenblatt richtig verstehe muss ich innerhalb der ISR 
ADCSRA |= (0<<ADEN); setzen, weil mit Hilfe des Autotriggers dieses Bit 
wieder gesetzt wird. Bei dieser Anweisung und bei dem wechselseitigem 
Einlesen der AI Werte tue ich mir gerade schwer.

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