ATMEGA16 ADC Wie den Channel wechseln?

Gast #3406021
Lesenswert?

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 :)
Gast #3406732
Lesenswert?

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
Gast #3406736
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren