Hallo alle zusammen,
seit etwa 3 Monaten programmiere ich jetzt den mega32 und habe soweit
alle Funktionen in Betrieb nehmen können dich ich brauche (I2C, UART,
PORTS) Nun möchte ich über den ADC gerne eine Spannung einlesen. Im
Internet habe ich bereits auch ein beispiel gefunden und teilweise etwas
angepasst. Ich poste euch erstmal den Code der Funktion und dann den
Programmteil, der diese aufruft. Der Wert soll über Port C ausgegeben
werden. (oder testweise und die unteren 8 Bit. Es wäre super wenn mir
jemand helfen könnte und nen Fehler in dem Code findet.
Funktion:
1 | uint16_t ReadChannel(uint8_t mux)
|
2 | {
|
3 | uint8_t i;
|
4 | uint16_t result = 0; //Initialisieren wichtig, da lokale Variablen
|
5 | uint8_t temp;
|
6 |
|
7 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // requenzvorteiler
|
8 | // setzen auf 8 (1) und ADC aktivieren (1)
|
9 | ADMUX = mux; // Kanal waehlen
|
10 | //ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
|
11 | ADMUX |= (1<<REFS0);
|
12 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
13 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
14 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
15 |
|
16 | while ( ADCSRA & (1<<ADSC) ) {
|
17 | //konvertierung abwarten
|
18 | }
|
19 |
|
20 |
|
21 | /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
|
22 | for(i=0;i<4;i++)
|
23 | {
|
24 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
25 | while ( ADCSRA & (1<<ADSC) )
|
26 | {
|
27 | ; // auf Abschluss der Konvertierung warten
|
28 | }
|
29 |
|
30 | result += ADCL; // Wandlungsergebnisse aufaddieren
|
31 | temp = ADCH;
|
32 | }
|
33 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
|
34 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert
|
35 | return result;
|
36 | }
|
aufrufender Programmteil:
1 | uint16_t adcval;
|
2 | uint8_t ausgabe;
|
3 | for(;;){
|
4 | adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
|
5 | //adcval = ReadChannel(2); /* MUX-Bits auf 0b0010 -> Channel 2 */
|
6 | DDRB = 0xFF;
|
7 | ausgabe = adcval | 0xFF;
|
8 | PORTB = ausgabe;
|
9 | delayloop16(16000);
|
10 | }
|