Zitat von
RumpelHumpel
... GREEN_LED_ON schaltet eine grüne LED für 1 Sek an, dann wieder aus ...
Es macht herzlich wenig Sinn, wenn man nur den halben Code einstellt und dann Zeile für Zeile nachbessert. Es macht nur die Lösungssuche ziemlich diffuser. Vor Allem wenn der geheimgehaltene Codeteil ("... LED für 1 Sek ...") möglicherweise den Kern des Problems in sich trägt.
Zitat von
RumpelHumpel
... dann wieder aus, sry, habe ich nicht erklärt ...
Wurde ja schon von HeXPloreR angemerkt, dass Du recht wenig Code bereitgestellt hast, vermutlich um unsere Ratemöglichkeiten zu vervielfachen.
Ich habe nen free running ADC z.B. für die Spannungscontrolle meiner Energieversorgung. Hier mal eine 1:1-Kopie des Codes für den m1284 - vielleicht hilft Dir das als Leitlinie für Deine Lösung. Übrigens siehst Du in der ISR auch zwei Zeilen für LED-Tests (wobei die Zeitmessung NICHT der tatsächliche Zeitbedarf der ISR im Target ist ! ! ! weil dabei der Overhead nicht erfasst wird). Den switch-Abschnitt kannst Du Dir ersatzlos sparen. Und nur als Warnung: keine Garantie für die Funktion - auch wenns bei mir bestens läuft - und abschreiben und experimentell weiterentwickeln hilft meist auch nicht.
Code:
// ============================================================================== =
// === Initialisierung fuer ADC mega1284 MIT Interrupt free running
// === ADC5/PA5 auf 10 Bit, fertige Wandlung ###>>> löst Interrupt aus
void ADC_init_10_irupt(void) // Initialisiere ADC, Kanal5, 10 Bit, MIT Interrupt
{ //
if (adcptnr > 7) adcptnr = 5; // Defaultwert adcpnr
// - - - - - - - - - - - - - - -
switch (adcptnr) // Initialisiere je nach ADC Pin Nummer
{ //
case 0: case 1: case 2: case 3: case 4: case 6: //
break; //
case 5: //
adc5_cnt = 0; // ADC-Wert wird x-fach aufaddiert
adc5tcnt = 1; //
adc5_tmp = 0; // ADC-x-fach-Speicher
ADC5bMIN = 1023; // bisheriges Minimum setzen
ADMUX |= (1<<MUX0)|(1<<MUX2); // Wandlung mit ADC5 (mega1284) doc S 259
uputs0 ("\r\tInitialisierung ADC auf ADC5/PA5=Poti\r"); //
break; //
default: //
uputs0 ("\r\tInitialisierung ADC fehlgeschlagen\r"); //
break; //
} //
// - - - - - - - - - - - - - - -
ADMUX |= (1<<REFS0); // Referenzspannung ist AVcc S 258
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Prescaler = clock/128 S 261
// Prescaler NUR für system clck
ADCSRA |= (1<<ADATE); // Auto Triggering Enable S 245 + 260
// es wird bei clock 20 Mhz mit ca. 80 µs getriggert
ADCSRA |= (1<<ADIE); // ADC Interrupt Enable doc S 260
ADCSRA |= (1<<ADEN); // ADC Enable
ADCSRA |= (1<<ADSC); // starte gleich die erste Wandlung
} //
// ============================================================================== =
// ============================================================================== =
// === Nicht unterbrechbare ISR für ADC
// Routine übernimmt ADC-Wert und sichert Minimum
ISR(ADC_vect) // VECTOR 25, Adr $0030
{ //
//ClrBit(PORTC, 7); // LED C7 ein, Zeitmessung: LED/PIN PC7
adc5_tmp = ADC; // Hole Wert
adc_status = 170 + adcptnr; // Setze Flag "ADC-Wert abgeholt
if (adcptnr == 5) //
{if (ADC5bMIN > adc5_tmp) ADC5bMIN = adc5_tmp;} // Sichere bisheriges Minimum
//SetBit(PORTC, 7); // LED C7 aus, Zeitmessung: LED/PIN PC7
} //
// ============================================================================== =
Und damit Du mir nicht ne Geheimhaltung von Makros vorhalten kannst:
Code:
#define SetBit(ADDR,BIT) ((ADDR) |= (1<<(BIT))) // Setzt Bit
#define ClrBit(ADDR,BIT) ((ADDR) &= ~(1<<(BIT))) // Löscht Bit
#define ToggleBit(ADDR,BIT) ((ADDR) ^= (1<<(BIT))) // Toogelt Bit
Lesezeichen