Forum: Mikrocontroller und Digitale Elektronik ATmega2560 ADC ISR differential channels, Auto Triggering


von StudentOhnePlan (Gast)


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

von holger (Gast)


Lesenswert?


von StudentOhnePlan (Gast)


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.

von StudentOhnePlan (Gast)


Lesenswert?

Hat niemand einen Tipp für mich?

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.