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?
Du musst das ADC Register einlesen, und nicht das MUX Register.
Wie schreibe ich das denn? bei ADC0=x; oder ADC(0)=x; meckert WinAvr.
und du musst warten bis eine Wandlung fertig ist bevor du den Wert holst
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.