Forum: Mikrocontroller und Digitale Elektronik ATMEGA16 ADC Wie den Channel wechseln?


von Wahrheit (Gast)


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 :)

von 老话 (Gast)


Lesenswert?

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.

von Wahrheit (Gast)


Lesenswert?

Mit welchen Werten hat es dann zu tun? Irgendwie blick ich da nicht 
durch

von Wahrheit (Gast)


Lesenswert?

Kann niemand helfen?

von STK500-Besitzer (Gast)


Lesenswert?

Welchen Controller verwendest du denn?

von Stefan E. (sternst)


Lesenswert?

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.

von NaNa_JaJa (Gast)


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

von Wahrheit (Gast)


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
}

von Wahrheit (Gast)


Lesenswert?

Ok hat sich erledigt ich musste bei der Zeile:

adc_result0 = adc_read(0);

in

 adc_result0 = adc_read(7);

ändern

von Ingo (Gast)


Lesenswert?

Denn sie wussten nicht was sie tun... ;)

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
Noch kein Account? Hier anmelden.