Zitat Zitat von frankensteins-freund Beitrag anzeigen
... mit einem Poti ... schalten ... wie ... ADC ... aktivieren und auslesen ...
Na das mit dem if-else ist ja erst dann möglich, wenn der ADC "am Laufen" ist. Hier ein paar Schnippsel zu nem funktionierenden Programm für nen mega1284 - das sollte mit nem m16 wohl 1:1 laufen (hab ich aber nicht wirklich geprüft).

Hier der Code. Die ----Sequenzen bedeuten ne Art Schnittkante und führen mittenrein in verschiedene Module. Die globalen Deklarationen sind weggelassen - wird Dir aber sicher trotzdem helfen. Das Poti hängt am PA5 - wie im Kommentar/Code beschrieben. Du kannst vermutlich für Deine Zwecke mit einem wesentlich "langsamer" wirkenden prescaler für den ADC-Takt arbeiten. Für Dich ist im Prinzip nur der Befehl
ADC_ist = ADC;
wichtig, den Rest brauchst Du aber, damit der Befehl überhaupt wirkt. Und mit dem gewonnen Wert ADC_ist kannst Du dann Deine LEDs schalten. In der Luxusausführung könntest Du noch den ADC_ist-Wert in tatsächliche Spannung umrechnen. Das solltest Du dann aber wohl selbst lösen = hinkriegen.

Code:
Initialisierungen etc im main:
----------------------------------------------
//              ===================================================
// ####>>>>     Initialisierung der Anschlüsse für R5M auf mega1284: <<<<####
//                       PB0   1 A   E  40  PA0 
//  Relais Blink/Warnl.  PB1   2 A   E  39  PA1 
//                       PB2   3 A   E  38  PA2 
//                       PB3   4 A   E  37  PA3 
//                       PB4   5 A   EU 36  PA4 
//                 MOSI, PB5   6 A   E  35  PA5, ADC Batterie_2-Test (Test, Poti)
//                 MISO, PB6   7 AU  E  34  PA6, ADC Batterie_1-Test !!RNCntrl!!
//                  SCK, PB7   8 A   E  33  PA7 
//                    /RESET   9        32  AREF ref Vccaktuell (?)
----------------------------------------------
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Ports+Pins als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
//      A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
// - - - - - - - - - - - - - - - -
  DDRA  = 0b00000000;   // siehe aktuell oben
  PORTA = 0b00010000;   // PA5 = ADC-Eingang Poti
                        //
----------------------------------------------
// - - - - - - - - - - - - - - - -
  adcpnr        = 5;    // Vorwahl ADC Portnummer
  ADC_init_10_irupt();  // Init. ADC, 10 Bit, Interrupt, auf Kanal adc_pnr    ~gpd~
// - - - - - - - - - - - - - - -
----------------------------------------------
// ============================================================================== =
// ===  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 (adcpnr > 7) adcpnr  = 5;  // Defaultwert adcpnr
  ADMUX  |= (1<<REFS0);         // Referenzspannung ist AVcc                  S 258
  ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);   // Prescaler = clock/128      S 261
  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
 ISR(ADC_vect)                  // VECTOR 25, Adr $0030
 {                              //
  adc5_tmp      = ADC;          // Hole Wert
// Anmerkung für Forum - 23. Nov. 2012, 19:34 Dieser Wert wird "anderswo gefragt
 }                              //
// ============================================================================== =
----------------------------------------------
Auswertung des ADC, hier im main, sozusagen etwas unter dem Schnippsel ganz oben
Anmerkung: mit diesem Schnippsel wird im späteren Zielsystem mit Akku
die aktuelle Spannung abgefragt. Hier nur ne Funktionskontrolle, die
nur den (konstanten) Wert durch Netzteil und Poti/Spannungsteiler nennt
==================
// - - - - - - - - - - - - - - -
  uart_puts ("\tUbattADC5-Minimalwert  : ");    // Melde ADC5-MinimalWert
  itoa(ADC5MM, wortadc, 10);            // aktueller ADC-Abschaltwert
  sendUSART(wortadc);                   //   ... ausgeben
  uart_puts ("\r\n\tUbattADC5 Messwert : ");    // Melde ADC-5-Istwert
  cli(); ADC_ist = ADC;  sei();         // hole aktuellen ADC5-wert
  itoa(ADC_ist, wortadc, 10);           // aktueller ADC-Abschaltwert
  sendUSART(wortadc);                   //   ... ausgeben
  uart_puts ("\r\n");                   // Melde aktuellen ADC-Istwert
                        //
// ============================================================================== =
Viel Erfolg.