Forum: Mikrocontroller und Digitale Elektronik AD Wandler Programm


von Maikas (Gast)


Angehängte Dateien:

Lesenswert?

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
von Falk B. (falk)


Lesenswert?


von Maikas (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Klomann (Gast)


Angehängte Dateien:

Lesenswert?

////////////////////////////////////////////////////////////////////
// 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
  }
}

von Karl H. (kbuchegg)


Lesenswert?

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.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.