Hallo Stefan_84,
weiss nicht ob Dir mein C-Code hilft, aber die Initialisierung (m)eines mega168 und (D)eines mega8515 ist IM PRINZIP sicher ähnlich und der Code ist doch etwas Assemblernah . . . Mit der folgenden Routine initialisiere ich den ADC und lese ihn in der ISR aus. Übrigens repräsentiert der Wert "ADC" in meiner ISR zum Auslesen des ADC die Befehle zum Auslesen des Low- und danach des High-Bytes. Dabei ist die Reihenfolge des Auslesens wichtig! Das steht auch im doc. Vielleicht ist das Beispiel eine Hilfe für Dich?
Code:
/* >>
Auszug aus ...C1..\m168D_10\m168D_iir_10x35.h
===================================================================================
================================================================================ */
// .........................
/* =================================================================================
##### Hier ISR und ISR - Initialisierung(en)
================================================================================= */
/* ============================================================================== */
// Auszug aus *com*.h
volatile uint16_t adc3_dat; // ADC-Wandlung des Sharp GP2D120: adc3_dat=ADC;
// .........................
/* ============================================================================== */
/* === Initialisierung fuer ADC mega168 MIT Interrupt ========================
// ISR(ADC_vect) vgl. iomx8.h // Interrupt- Vektor 21
ADC3/PC3 auf 10 Bit, Wandlung #####>>>>> Interrupt ausgelöst */
void ADC3_10_init_irupt(void) //
{
ADMUX |= (1<<MUX1)|(1<<MUX0); // Wandlung mit ADC3
ADMUX |= (1<<REFS0); // Referenzspannung ist Vcc doc S 256 und
// https://www.roboternetz.de/phpBB2/ze...=287602#287602
ADCSRA |= (1<<ADPS2)|(1<<ADPS0); // ADC Prescaler = clock/32 S258
// ... das ergibt aus der 4,88-kHz-Motor-PWM 152,5 Hz
ADCSRB |= (1<<ADTS1)|(1<<ADTS0); // ADATE Trigger=TC0-cmpmatchA S259
ADCSRA |= (1<<ADATE); // Auto Triggering Enable, doc S 247 (257)
ADCSRA |= (1<<ADIE); // ADC Interrupt Enable, doc S 258
ADCSRA |= (1<<ADEN); // AD Enable
ADCSRA |= (1<<ADSC); // starte gleich die erste Wandlung
}
/* ============================================================================== */
/* === Initialisierung fuer ADC mega168 OHNE Interrupt =====================
// 26mai2008 Diesen Code übernommen aus 22dzms168-regel-x13.c
// ISR(ADC_vect) vgl. iomx8.h // Interrupt- Vektor 21 , KEIN Interrupt enabled
ADC3/PC3 auf 8 Bit, Wandlung "auf Abruf", es wird kein Interrupt ausgelöst */
/* ################# ADC3_10_init ausgeblendet Anfang
void ADC3_10_init(void) //
{
// ADMUX |= (1<<ADLAR); // 8bit-left-adjusted (doc S256)
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ADC Prescaler clock/128 S258
ADMUX |= (1<<MUX1)|(1<<MUX0); // Wandlung mit ADC3
ADCSRA |= (1<<ADEN); // AD Enable
ADCSRA |= (1<<ADSC); // starte erste Wandlung
} ############ ADC3_10_init ausgeblendet Ende */
/* ============================================================================== */
/* ============================================================================== */
/* ==== Initialisierungsroutinen sind zu Ende - es folgen die ISR=============== */
/* ============================================================================== */
// ..........................................
/* ============================================================================== */
/* === Nicht unterbrechbare ISR für ADC3 auf Pin 26/PC3/mega168 =============== */
/* Routine übernimmt ADC-Wert. */
ISR(ADC_vect) // _VECTOR(21)
{
adc3_dat = ADC; // Hole Wert
ADCSRA |= (1<<ADSC); // starte nächste Wandlung
}
/* ============================================================================== */
/* ============================================================================== */
/* ============================================================================== */
Viel Erfolg
Lesezeichen