Forum: Mikrocontroller und Digitale Elektronik Atmega16 kleine Hilfe für ADC benötigt.


von Lukas P. (lzaman)


Lesenswert?

Hi all,

Ich habe folgenden Code:

#include <avr/io.h>

int x;

int main ()
{
DDRA=0x00;
DDRB=0xFF;

ADMUX |= (1<<REFS1) | (1<<REFS0);
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);

while(1)
{
x=MUX0;
if (x<40){PORTB=0xFF;}
else {PORTB=0x00;}
}
return 0;
}



Wie kann ich die Variable x dem Ausgang PA0 zuordnen und mit dem 
anliegendem Wert LED's ein bzw. ausschalten?
Die LED's soll leuchten wenn AnalogWert an PA0 < 40 liegt. (von max. 
255).
Ansonsten bleiben sie dunkel?

von Martin (Gast)


Lesenswert?

Du musst das ADC Register einlesen, und nicht das MUX Register.

von Lukas P. (lzaman)


Lesenswert?

Wie schreibe ich das denn?

bei

ADC0=x;

oder

ADC(0)=x; meckert WinAvr.

von Walter (Gast)


Lesenswert?

und du musst warten bis eine Wandlung fertig ist bevor du den Wert holst

von gast (Gast)


Lesenswert?

Hallo,
ich habe so ein bischen das Gefühl, dass du dir hier alles ein wenig 
vorkauen läßt. Daher würde ich dir einfach mal empfehlen dir einen 
ADC-Code aus dem Netz zu laden und den dann Schritt für Schritt zu 
analysieren. Auch wenn der Code nicht für den Mega16 ist, so sind die 
ADC´s der Mega Familie so ähnlich wenn nicht sogar identisch, so dass 
das fürs erste egal ist.

Oder benutzte doch einen der frei zur Verfügung stehenden Code-Wizards 
(AvrWiz , IODesigner bzw. AtmanVar) und stell dir den ADC entsprend 
deiner wünsche ein.

von Lukas P. (lzaman)


Lesenswert?

Naja vorkauen?, ich beschäftige mich erst mit der Theorie bevor ich 
Fragen stelle.

Bei mir hat es noch nicht ganz klick gemacht, aber so langsam verstehe 
ich das ganze.

Danke für den TIP mit Code Wizards.

von Joan P. (joan)


Lesenswert?

Lukas Piet wrote:
> Wie schreibe ich das denn?
>
> bei
>
> ADC0=x;
>
> oder
>
> ADC(0)=x; meckert WinAvr.

die zu beschreibende Variable muss immer links stehen.. also eher:
1
x=ADC0;

Ich würde an deiner Stelle mal das GCC Tutorial hier auf der Seite 
anschauen.. da ist bestimmt ne Menge für dich drin..
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Johannes M. (johnny-m)


Lesenswert?

Du hast offensichtlich das Funktionsprinzip des ADC noch nicht ganz 
verstanden. Der ADC kann nur eine Wandlung gleichzeitig durchführen 
und besitzt auch nur ein Ergebnisregister ADC (das ist ein 
16-Bit-Register, das aus den beiden 8-Bit-Registern ADCL und ADCH 
besteht, was Dich bei der Programmierung in C aber zunächst nur am Rande 
interessieren muss).

Die Pins von Port A können über einen Multiplexer alternierend mit dem 
ADC verbunden werden. Der Multiplexer wird über die MUX -Bits im 
Register ADMUX gesteuert. Du musst, wenn Du einen Wert von PA0 
einlesen willst, den Multiplexer auf Kanal 0 einstellen, eine Wandlung 
durchführen und das Ergebnis aus dem Ergebnisregister einlesen, wenn die 
Wandlung beendet ist (entweder ADSC pollen oder mit Interrupt 
arbeiten). Wie das im Detail geht, steht im Tutorial.

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.