Moin,
nachdem mein ADC nun läuft würde ich gerne eine Kanalumschaltung per
Knopfdruck einbauen. Mein Problem ist allerdings, dass die
Kanalumschaltung nicht funktioniert. Hier mal die Initialisierung des
ADC und mein Versuch den Kanal zu wechsel:
1
#define F_CPU 8000000UL
2
#define Vref 4.94
3
4
5
#include<avr/io.h> //einbinden der Bibliothek 'io.h'
6
#include<util/delay.h> //einbinden der Bibliothek 'delay.h'
7
#include<avr/interrupt.h>
8
#include<stdlib.h>
9
#include"avr.h"
10
#include"SPI.h"
11
#include"UART.h"
12
13
14
voidADC_init(void)
15
{
16
uint16_tfirst_result=0;
17
18
DIDR0=(1<<ADC0D);
19
20
ADMUX=(1<<REFS0);// | (1<<REFS1); //Einschalten der Referenzspannung: Vref = AVCC
21
ADMUX|=(MUX0);
22
23
ADCSRA=(1<<ADEN)|(1<<ADIE);// ADC aktivieren und Interrupt einschalten
Fehlt nicht, um das
> if (!(PINC &(1<<PC0)))> if (!(PINC &(1<<PC1)))
beurteilen zu können, noch ein Stück Programm und/oder eine
Schaltungsbeschreibung?
Testweise wollte ich zwischen Kanal 0 und 1 umschalten, später wollte
ich alle Kanäle nutzen.
S. Landolt schrieb:> if (!(PINC &(1<<PC0)))
Nicht unbedingt, das sollte nur verdeutlichen, dass ich z.B. durch
Taster oder Schalter den Kanal wählen. Das ist aber erstmal zweitrangig,
wie ich die Umschaltung realisiere, wichtig ist für mich im ersten
Schritt, die Umschaltung des ADCs generell durchführen zu können.
Hi
>Testweise wollte ich zwischen Kanal 0 und 1 umschalten, später wollte>ich alle Kanäle nutzen.
ADMUX =(1<<MUX0); Schaltet Kanal 1 ein
ADMUX |=(1<<MUX1); Schaltet Kanal 2 ein
Außerdem solltest du dich mal über Tastenentprellung schlau machen.
MfG Spess
Das hatte ich bereits probiert, führte Leider nicht zum Erfolg.
Ich möchte aber auch von 1 -> 0, dann geht es auf diesem Wege ja nicht.
Die Taster sind nur eine erste Lösung zum Teten. Ich möchte das final
über die UART Schnittstelle (Terminal) steuern können.
Hi
>Das hatte ich bereits probiert, führte Leider nicht zum Erfolg.>Ich möchte aber auch von 1 -> 0, dann geht es auf diesem Wege ja nicht.
Und was macht
ADMUX &= ~0x03;
wohl?
Aber um das komplette ADMUX auf 0 zu setzen sollte es besser
ADMUX &= ~0x0F;
heißen.
MfG Spess
Marco G. schrieb:> S. Landolt schrieb:>> if (!(PINC &(1<<PC0)))>> Das ist aber erstmal zweitrangig,
Nicht wirklich, wenn der Code und damit das Ergebnis unsinnig ist.
Überleg', wann das wahr wird.
spess53 schrieb:> ADMUX &= ~0x03;
Genau das hatte ich auch gedacht, im ersten Moment funktioniert das
auch, wenn ich dann jedoch auf Kanal 1 umschalte, auf dem 0,825V
anliegen wird irgendeine Spannung gemessen, aber nicht die anliegende.
Wenn ich wieder auf Kanal 0 umschalte, an dem 3.3V anliegen messe ich
nur 2,9V. Vorher waren es 3.22V.
@MWS
Die Abfrage funktioniert, zum Testen habe ich eine LED angebracht, die
eingeschaltet wird, wenn die Funktion betreten wird. Da sie leuchtet,
wird der Abschnitt auch betreten.
Marco G. schrieb:> Die Abfrage funktioniert, zum Testen habe ich eine LED angebracht, die> eingeschaltet wird, wenn die Funktion betreten wird. Da sie leuchtet,> wird der Abschnitt auch betreten.
Funktion oder If-Block?
Es ist dann Absicht, dass der If-Block nicht ausgeführt wird, wenn der
Pin High ist?
Wenn Du auch Deine main() zeigen würdest..?
Und was ist mit der ISR für den ADC (warum ADIEN Bit gesetzt)?
Bei 8MHz wäre ein Prescaler von 64 besser als 128 (ADPS0 nicht setzen).
Soll die Messung nur solange erfolgen, wie der Taster gedrückt ist
(Taster losgelassen, dann auch keine Messung)?