Hallo, Ich möchte gerne das ADC Wert der bei PA0 (Pin 40) eingelesen wird auf PA7 (Pin33) die Werte einliest. Folgende Code habe ich für PA0: ch &= 0b00111; ADMUX = (ADMUX & 0xF8)|ch; Nun wollte ich auf PA7 mit diesem Code probieren: ADMUX |= (1<<MUX0); Aber es funktioniert nicht. Der Wechsel des Channel hat Layouttechnische Gründe. Wäre nett wenn mir jemand fix die Zeile Code hinschreibt :)
Wahrheit schrieb: > ADMUX |= (1<<MUX0); > > Aber es funktioniert nicht. Kein Wunder. Mit den Werten, die im Datenblatt in der Tabelle 21-5. (ADC input channel selection) angegeben sind, hat das auch nichts zu tun.
Mit welchen Werten hat es dann zu tun? Irgendwie blick ich da nicht durch
Der gezeigte Code muss überhaupt nicht verändert werden. Was zu ändern ist, ist der Inhalt von 'ch'. Vermutlich ist das ein Funktionsparameter, also ist der Aufruf dieser Funktion zu ändern.
Im Prinzip so :
1 | void Poti (uint8_t mux) |
2 | {
|
3 | ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); |
4 | ADMUX = mux; |
5 | ADMUX |=(1<<REFS0)|1<<REFS1); |
6 | //(AVcc) 2,56V int. als Refenzspannung nutzen und Kanal wählen
|
Hier ist der gesamte Code:
1 | #define F_CPU 8000000UL
|
2 | #include <avr/io.h> |
3 | #include <util/delay.h> |
4 | |
5 | #include "lcd.h" |
6 | |
7 | |
8 | |
9 | |
10 | void adc_init() |
11 | {
|
12 | // AREF = AVcc
|
13 | ADMUX = (1<<REFS0); |
14 | |
15 | // ADC=Ein und Prescaler von 128
|
16 | |
17 | ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); |
18 | }
|
19 | |
20 | // ADC Wert lesen
|
21 | uint16_t adc_read(uint8_t ch) |
22 | {
|
23 | // Der zumessende Kanal wird gewählt
|
24 | ch &= 0b00111; // UND Operation mit 7 |
25 | ADMUX = (ADMUX & 0xF8)|ch; |
26 | |
27 | // Starten der Umwandlung
|
28 | // Schreibe '1' auf ADSC
|
29 | ADCSRA |= (1<<ADSC); |
30 | |
31 | // Warten bis die Umwandlung beendet ist.
|
32 | // ADSC erhält wieder '0'
|
33 | |
34 | while(ADCSRA & (1<<ADSC)); |
35 | |
36 | return (ADC); |
37 | }
|
38 | |
39 | int main() |
40 | {
|
41 | uint16_t adc_result0; |
42 | int temp; |
43 | char buffer[10]; |
44 | |
45 | |
46 | // Initialisierung von ADC / LCD-Display
|
47 | adc_init(); |
48 | lcd_init(LCD_DISP_ON); |
49 | |
50 | |
51 | lcd_clrscr(); |
52 | lcd_gotoxy(0,0); // Gehe zu Zeile 0 / Spalte 0 |
53 | |
54 | |
55 | |
56 | _delay_ms(50); |
57 | |
58 | while(1) |
59 | {
|
60 | adc_result0 = adc_read(0); // Auslesen des ADC Werts an PA0 |
61 | |
62 | temp=adc_result0/2.0; // Temperatur = ADC Wert / 2.0 |
63 | |
64 | |
65 | lcd_gotoxy(0,0); // Gehe zu Zeile 0 / Spalte 0 |
66 | lcd_puts("ADC-Wert:"); |
67 | itoa(adc_result0,buffer,10); |
68 | lcd_puts(buffer); //Ausgabe des ADC-Werts |
69 | |
70 | lcd_gotoxy(0,1); // Gehe zu Zeile 0 / Spalte 1 |
71 | itoa(temp,buffer,10); |
72 | lcd_puts("Temperatur:"); |
73 | lcd_puts(buffer); //Ausgabe der Temperatur in Grad |
74 | _delay_ms(50); |
75 | |
76 | }
|
77 | }
|
Ok hat sich erledigt ich musste bei der Zeile: adc_result0 = adc_read(0); in adc_result0 = adc_read(7); ändern
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.