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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.