Zitat von
frankensteins-freund
... 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.
Lesezeichen