Hey Leute Ich möchte gerne mit einem Atmega8 zwei Akkus mittels ADC auslesen und den jeweiligen Wert auf einem Display anzeigen lassen. ich hab folgendes Problem: -ADC funktioniert nur an Pin-PC0 und zeigt diesen Wert als adc(0) und adc(1) an ( also auf zwei Zeilen gleizeitig ) -ADC1 zeigt den Wert 0 dauerhaft an an wenn ich einen Akku an PC1 klemme das ist der Code:
1 | #include <stdlib.h> |
2 | #include <stdio.h> |
3 | #include <avr/io.h> |
4 | #include <avr/pgmspace.h> |
5 | #include <stdint.h> |
6 | #define F_CPU 3686400UL
|
7 | #include <util/delay.h> |
8 | |
9 | #include "lcd_162.h" |
10 | |
11 | |
12 | uint16_t adc(uint8_t mux) |
13 | {
|
14 | uint16_t result; |
15 | |
16 | ADMUX |= (mux & 0b00000111); // Kanal waehlen |
17 | |
18 | ADMUX = (0<<REFS1)|(1<<REFS0); |
19 | |
20 | |
21 | //Frequenzvorteiler setzen und ADC aktivieren
|
22 | ADCSRA = (1<<ADPS1)|(1<<ADPS0); //Frequenzvorteiler |
23 | ADCSRA |= (1<<ADEN)|(1<<ADIE); //ADC aktivieren |
24 | |
25 | // Dummy-readout
|
26 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung |
27 | while ( ADCSRA & (1<<ADSC) ) |
28 | { ; // auf Abschluss der Konvertierung warten |
29 | }
|
30 | |
31 | result = ADCW; |
32 | |
33 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren |
34 | ADMUX &= ~0b00000111; // alten Kanal loeschen |
35 | return result; |
36 | }
|
37 | |
38 | |
39 | |
40 | |
41 | int main(void) |
42 | {
|
43 | char buffer[20]; |
44 | DDRB=0xFF; //Port B als Ausgänge definieren |
45 | DDRC=0x00; //Port C als Eingänge definieren |
46 | lcd_init(); |
47 | |
48 | uint16_t akku1; |
49 | uint16_t akku2; |
50 | while(1) |
51 | { akku1=adc(0); |
52 | akku2=adc(1); |
53 | lcd_write_zeile(itoa(akku1, buffer,10),1); // Adc Wert von PC0 in Zeile 1 anzeigen |
54 | lcd_write_zeile(itoa(akku2, buffer,10),2); // Adc Wert von PC1 in Zeile 2 anzeigen |
55 | |
56 | _delay_ms(50); |
57 | }
|
58 | }
|