Hallo, Ich bin noch neu in der C-Programmierung und deswegen bräuchte ich eure Hilfe. Also: Ich brauche einen Ad-Wandler für meinen ATMEGA 16. Am PortA.0 hängt ein potentiometer, und an PortC.0 hängt eine LED (zu Versuchs zwecken). Ich habe bereits ein Programm geschrieben mit dem ich eine PWM erzeugen kann und sie am PORTC.0 ausgeben kann, das funktioniert ohne Probleme, doch jetzt will ich die PWM mittels des Potentiometers manuel einstellen können. Also muss ich den Wert bei PortA.0 (Poti) auslesen und in ein PWM "verwandeln". Das ist das bestehende Programm liegt als Anhang bei. Habe das Programm mit CodeVisionAVR geschrieben Und dieses will ich jetzt umschreiben das er die PWM nicht mehr automatisch erstellt, sondern ich sie mittels Poti einstellen kann. Kann mir jemand helfen und zeigen wie es geht, ich bekomms einfach nicht hin :-( Vielen Dank Maikas
:
Gesperrt durch User
Hmmm, das hab ich mir schon durchgelesen, trotzdem danke. Ich griegs aber leider nicht hin, irgendwas mache ich falsch. Kann noch jemand helfen und mir sagen wie es gehört
Maikas wrote: > Hmmm, das hab ich mir schon durchgelesen, trotzdem danke. > Ich griegs aber leider nicht hin, irgendwas mache ich falsch. Kann noch > jemand helfen und mir sagen wie es gehört Dann lies es dir nochmal durch. Ein Stückchen weiter unten ist Programmcode. Vergleich mal die Initialisierungen die du bei den Registern machst. Vor allem das ADMUX Register. Und schau dir am besten auch die Syntax zum Bitsetzen vom Tutoriumsbeispiel ab. Sowas ADCSRA|=0x40; ist nicht wirklich sehr aussagekräftig, wenn man es mit ADCSRA |= (1<<ADSC); vergleicht. Im letzten Fall sieht man zumindest, dass hier das ADSC Bit gesetzt werden soll. Und noch was: Wenn deine LED ständig auf den ADC reagieren soll, dann wird wohl die Abfrage des ADC Wertes (der Aufruf der Funktion) in die while Schleife hinein muessen. Ansonsten wird der ADC ja nur einmal, ganz am Anfang abgefragt. (Meine perönliche Meinung: Schmeiss mal alles was dieser dämliche Wizzard generiert hat und du nicht in deinem Programm brauchst aus dem Programm raus. Das ist seitenweise Code, der keinen Menschen interessiert. Und der Rest ist dank der Hex-Zahlen Orgie so gut wie nicht lesbar.)
//////////////////////////////////////////////////////////////////// // ADC.C // // Eduard-Spranger-Berufskolleg // // 10.12.2009 Mikrocontrollertechnik // //////////////////////////////////////////////////////©rudolphi///// // Definitionen Deklarationen Include #include <REG517A.h> // P4 in REG517A.h als SFR deklariert #include <lcd.h> // Steuert die LCD-Ausgabe #include <stdio.h> // Standard Input Output // Hauptprogramm void main(void) { int ADC; // ADC-Wert lcd_init (); // LCD initialisieren crsr_pos (0x00); // Cursor auf home Position printf ("Wurst"); // Text ausgeben //AD Initialisierung ADCON1=0x01; //Eingang AIN0 P7.1 wählen ADM=0; //Einzelwandlung einstellen ADEX=0; //Software-Start einstellen // AD-Wandlung while(1) //Endlossschleife { ADDATL=0x00; //ADC neu starten while(BSY==1); //Warte bis Wandlungsende BSY=0 ADC=ADDATH; //Digitalisierter Analogwert auslesen und in Datentyp int wandeln crsr_pos (0x40); //Cursor in Ausgabeposition printf ("DEZ %3d",ADC); //Dezimalausgabe auf LCD } }
Nach 7 Jahren: Themenverfehlung, da anderer Prozessor. Und bevor sich jemand bemüssigt sieht, da noch der langen Zeit noch einen drauf zu setzen, mach ich dicht.