mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analoge Ports auslesen


Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hoffe es kann mir jemand helfen. Ich suche ein Programmbeispiel in 
Assembler mit dem ich mehrere Analoge Ports hintereinander auslesen 
kann.
Bin schon Stunden dran und kommen auf keinen grünen Zweig.
Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Norbert schrieb:
> Hallo,
> ich hoffe es kann mir jemand helfen. Ich suche ein Programmbeispiel in
> Assembler mit dem ich mehrere Analoge Ports hintereinander auslesen
> kann.

Was ist ein 'analoger Port'.
Auf welchem Prozessor?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rprta 1,x
rprta 2,y
rprta 3,z

usw.

Falls das dein Mikrocontroller nicht versteht, müsstest du uns halt 
verraten, welche du nutzt, und was ein "analoger Port" überhaupt sein 
soll.

Oliver

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite mit einenm Atmega8 und programmiere in Assembler. Es gelingt 
mir einen Analogport ( Port C Wandler0 ) zu lesen, aber ich weiß nicht 
wie ich am elegantesten mehrere Anlaogwerte von Wandler 1,2+3 
hintereinander lesen kann. Ein Beispiel wäre hilfreich.
Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Norbert schrieb:
> Hallo,
> ich arbeite mit einenm Atmega8 und programmiere in Assembler. Es gelingt
> mir einen Analogport ( Port C Wandler0 ) zu lesen,

Nenne das Teil bitte in Zukunft ADC
Konkret möchtest du die ADC0, ADC1, ADC2 auslesen.


> aber ich weiß nicht
> wie ich am elegantesten

Kümmere dich erst mal darum, dass du überhaupt den jeweiligen ADC 
auslesen kannst. Eleganz kommt dann später.

Du musst in ADMUX den jeweils gewünschten Kanal einstellen.
Siehe zb hier
http://www.mikrocontroller.net/articles/AVR-Tutori...

Danach aktivierst du den ADC so wie du es auch bei deinem ersten 
erfolgreichen Kanal gemacht hast, wartest auf das Ergebnis und holst dir 
aus dem ADCH/ADCL Register den Messwert ab. Alles wie gehabt. Der 
einzige Unterschied zwischen den einzelnen Anschlüssen ist nur die 
Kanalnummer in ADMUX

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ok ich nenne die Ports in Zukunft ADC!
Soweit so gut, wann weiß ich denn zu welchem Zeitpunkt die Wandlung 
fertig ist?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Norbert schrieb:
> Hallo,
> ok ich nenne die Ports in Zukunft ADC!
> Soweit so gut, wann weiß ich denn zu welchem Zeitpunkt die Wandlung
> fertig ist?

Studiere das Beispiel auf der verlinkten Tutorialseite.

Auszug:
sample_adc:
    sbi     ADCSRA, ADSC        ; den ADC starten
 
wait_adc:
    sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
    rjmp    wait_adc
 
; ADC einlesen:
 
    in      adlow, ADCL         ; immer zuerst LOW Byte lesen
    in      adhigh, ADCH        ; danach das mittlerweile gesperrte High Byte

Als Assemblerprogrammierer kommst du nicht umhin, auch mal anderen Code 
ein paar Stunden lang zu studieren. Die Tutorialsbeispiele sind 
hoffentlich soweit gut genug mit Kommentaren versehen, dass man im Code 
nachvollziehen kann was abgeht.

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich denke nun komme ich klar. Es ist immer hilfreich wenn man ein 
Beispiel hat. Ich wusste z.B. nicht dass das ADCSRA Register auch 
Bitweise gelesen und geschrieben werden kann. Ich komme aus der SPS-Welt 
und da ist einfach alles etwas einfacher zudem bin ich das zyklische 
programmieren gewohnt und komme normaler weise nicht auf die Idee eine 
Schleife zu bilden die erst dann verlassen wird wenn das Ereignis wahr 
oder flasch ist. In der Automatisierungstechnik geht das nicht da die 
dort verwendeten CPUs um mehrere Potenzen langsamer sind.
Nochmals vielen Dank.
Ich finde dieses Portal echt super!!

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In der Automatisierungstechnik geht das nicht da die
>dort verwendeten CPUs um mehrere Potenzen langsamer sind.

Das ist einfach falsch bzw. nicht mehr richtig...

Heutige SPS haben locker die Power eines Mega8. Spätestens eine 
Software-SPS kann wenn gewünscht/möglich auf die Power von n PC-x86 
Kernen zugreifen

Das warten in Schleifen kann dort nicht machen weil dein System dann 
nicht mehr echtzeitfähig ist.
Eine SPS muss in festen Zeitabständen (dem Zyklus), Eingänge lesen und 
Ausgänge schreiben.

Autor: ::: (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Warten in Schleifen ist auch einem Mega8 schlechter Stil. In einem 
Demoprogramm macht man das natuerlich.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.