Forum: Mikrocontroller und Digitale Elektronik AD-Wandler programmieren ATtiny


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Max (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi,

wir benötigen dringend Hilfe. Unsere Aufgabenstellung lautet:

"Es soll ein Spannungspegel über einen A/D-Wandler eingelesen werden. 
Der Spannungspegel wird über das Potenziometer (Spannungsteiler) 
eingestellt. Der gewandelte Wert wird als Analogwert über den 8 bit 
D/A-Wandler ausgegeben. Der A/D-Wandler soll jedes mal durch den 
Timer0-Überlauf aktiviert werden (Interrupt) und eine Wandlungsrate von 
ca. 100 Hz haben."

Wir sollen einen ATtiny817 mit Assembler programmieren.
Kann uns hierbei jemand weiterhelfen?

Vielen Dank

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
> Kann uns hierbei jemand weiterhelfen?

Ja, viele können das.

Wobei brauchst du denn konkret Hilfe? Jetzt sag nicht "bei allem", sonst 
fangen wir damit an, deinen PC in Betrieb zu nehmen und Englisch zu 
lernen.

: Bearbeitet durch User
von Theor (Gast)


Bewertung
2 lesenswert
nicht lesenswert
@ Max

Ich fürchte, dass wird wieder einer dieser Threads. :-)

Zunächst mal, ist das für Euch vielleicht "dringend". Für uns nicht.

Dann fangen wir nicht an, ausgehend von einer Aufgabenstellung die 
Programmierung an sich, das programmieren in Assembler und noch die 
Konfiguration der Peripherie zu erklären.

Das Programmieren an sich, sollte an so einem Punkt bzgl. Basisdingen 
klar sein. Sonst ist es sinnlos so eine Aufgabe zu stellen.

Programmieren in Assembler bedeutet, sich mit dem Befehlssatz 
auseinander zu setzen und das was man an Programmierkenntnissen hat 
anhand einfacher Beispiele eben in Assembler auszudrücken. Mal zwei 
lange Zahlen addieren. Eine Schleife bauen etcpp. Ein Ergebnis in einer 
Variablen speichern.

Die Konfiguration der Peripherie setzt voraus, dass man eine 
grundlegende Idee von der benötigten Peripherie hat. Also: Was ist und 
tut so ein AD-Wandler? Was ist und tut ein DA-Wandler?
Dann liest man sich die entsprechenden Kapitel im Datenblatt durch und 
ist erst einmal verwirrst, weil man da soviel einstellen kann bzw. muss. 
Das ist normal. Geht jedem so.
Dann überlegt man sich, welche von den möglichen Einstellungen man 
eigentlich benötigt. Das ergibt sich aus der Aufgabenstellung (sollte 
jedenfalls so sein).
Das versucht man dann im den Einstellungen wieder zu finden (man hat ja 
vorher alles gelesen um einen Überblick zu haben). Oder man geht die 
Einstellungen Punkt für Punkt durch und überlegt dabei, was man davon 
braucht.
Dann schreibt man Code, der diese Einstellungen setzt und guckt, was 
dabei herauskommt.
Dazu kann man dann hier auch gezielte Fragen stellen.

Das wäre mal ein schöner Thread. Meiner Meinung nach. :-)

von Max (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Leider habe ich kaum Erfahrung im Programmieren.

Ich habe folgendes aus dem Datenblatt rausgelesen...

    ldi r16,0b00000001

    sts ADC_CTRLA_offset,r16

    ldi r16,0b00000001          sts ADC_CTRLC_offset,r16

    ldi r16,0b00000101          sts ADC_MUXPOS_offset,r16

    ldi r16,0b00000001          sts ADC_INTCTRL_offset,r16

    ldi r16,0b01000001            sts DAC_CTRLA_offset,r16

    ldi r16,0b00000011                          sts 
VREF_DAC0REFSEL_4V34_gc,r16



    ldi tmp0,0b00001011                          sts 
TCA0_SINGLE_CTRLA,tmp0

    ldi tmp0,0b00000001
    sts TCA0_SINGLE_INTCTRL,tmp0

    ldi tmp0,0xb4
    ldi tmp1,0x64
    sts TCA0_SINGLE_PER,tmp0
    sts TCA0_SINGLE_PER+1,tmp1

    sei

Ich komm hier nicht weiter, da ich nicht weiß, wie man die Befehle 
richtig anwendet.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Dann fangen wir mal ganz unten mit einem Assembler Grundkurs an.
http://stefanfrings.de/avr_workshop/index.html

von K. S. (the_yrr)


Bewertung
1 lesenswert
nicht lesenswert
das sieht mehr bruchstückhaft zusammenkopiert als selber geschrieben 
aus, einmal r16, dann tmp0/1, Register nicht definiert, Konfiguration 
über Binärzahlen ist auch nicht so schön (dafür gibts vordefinierte 
Namen, dann wirds leserlich, die passende .inc (in atmel studio) braucht 
man sowieso) und ich bin mir ziemlich sicher das sts nicht genommen wird 
um Register zu schreiben (sollte "out" sein), außer das wurde beim 817 
geändert. außerdem reicht der Offset denke ich nicht, da muss noch die 
base Adresse hinzu.

Stefanus F. schrieb:
> Dann fangen wir mal ganz unten mit einem Assembler Grundkurs an.
das wird die einzige Möglichkeit, außer jemand schreibt euch das ganze 
schnell runter, aber auch richtig geschrieben sollte das Minimalprogramm 
nur ca. 50-100 Zeilen haben.

außerdem den Hinweis zur Foramtierung lesen, dann wirds schöner für 
alle, z.B. so

bei atmel studio 7 tn817def.inc einbinden, alles ohne Gewähr, kenn die 
neuen Attiny noch nicht so gut
1
.DEF tmp  = r16
2
3
ldi tmp, ADC_PRESC_DIV4_gc   oder
4
ldi tmp, (1 << ADC_PRESC1_bp)
5
out (ADC0_base + ADC_CTRLC_offset), tmp

von Theor (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Max schrieb:
> Leider habe ich kaum Erfahrung im Programmieren.

Nun. Du wirst die Erfahrung bekommen. Da kannst Du ganz zuversichtlich 
sein. Das klappt schon.

> Ich habe folgendes aus dem Datenblatt rausgelesen...
> [...]

Da wäre es, zum nachvollziehen und späteren überprüfen, nützlich, wenn 
Du die Namen der Bits aus dem Datenblatt, die auch so in der Datei 
tn817def.inc deklariert sind, verwendest. Es erfordert einen 
gedanklichen Zwischenschritt aus dieser Kombination mit dem Datenblatt 
die Bedeutung des Bits zu ermitteln.
Umgekehrt musst Du das beim schreiben ohnehin tun (also von der 
Bedeutung des Bits zu dessen Namen). Den Schritt vom Bit zum Namen 
nochmals zu tun, kannst Du Dir (und mir resp. uns) ersparen. Das kostet 
Zeit und Energie.

Ausserdem wäre es sehr nützlich, wenn Du Kommentare hinzufügst und 
gesondert einen Text mit Skizzen schreibst. Du solltest beschreiben, was 
Du mit den einzelnen Bits bewirkst. Das ergibt sich aus der von mir oben 
erwähnten Lektüre der Beschreibung des AD-Wandlers bzw. des DA-Wandlers.

Es wäre auch besser, wenn Du zunächst mal den AD-Wandler als Ganzes 
betrachtest. Es gibt verschiedene Skizzen und Blockschaltbilder im 
Datenblatt dazu.
Das kannst Du ja mal ausdrucken oder auf sonst einem Weg aus dem 
Datenblatt extrahieren und darin markieren, welchen Weg das Analogsignal 
nehmen soll und welchen das digitale Wandlungsergebnis und was es da 
noch so einzustellen gibt. Die Konfigurationsbits ergeben sich daraus. 
Das kannst Du auch gut in dem Bild notieren.
Auf diese Weise kannst Du Dich Stück für Stück systematisch vorarbeiten 
und sicher sein, dass Du alles bedacht hast.
Ich habe mal das Bild vom AD-Wandler angehängt. Aber es gibt noch andere 
Bilder, die nützlich sein können.


> Ich komm hier nicht weiter, da ich nicht weiß, wie man die Befehle
> richtig anwendet.

Das wirst Du sicher lernen, wenn Du es nur versuchen willst.
Ich werde Dir hier nicht jeden Befehl im einzelnen erklären und wie er 
mit einer einem abstrakten oder auch umgangssprachlichen Beschreibung 
eines Programmes zusammen hängt.
Nur zwei kleine Beispiele: Wenn Du etwa sagst, Du möchtest zwei Zahlen 
addieren, dann findest Du relativ leicht den Befehl ADD in verschiedenen 
Varianten.
Oder wenn Du, abhängig von einer Bedingung, den Programmablauf 
beeinflussen willst, findest Du die verschiedenen Branch-Befehle.
Mehr will ich aber dazu nicht sagen.

Eine spezielle Frage, zu einem Detailpunkt, werde ich, oder jemand 
anders hier, beantworten. In einem gewissen Maß auch Fragen, die sich 
aus den Übersetzungen aus dem Englischen ergeben. Aber ich gebe hier 
keinen Unterricht. Dazu ist das Thema zu umfangreich.

von Alexander S. (alesi)


Bewertung
1 lesenswert
nicht lesenswert
Max schrieb:
> Wir sollen einen ATtiny817 mit Assembler programmieren.
> Kann uns hierbei jemand weiterhelfen?

Eine Möglichkeit wäre das AVR Tutorial hier durchzuarbeiten
https://www.mikrocontroller.net/articles/AVR-Tutorial
Insbesondere
https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

Das Tutorial ist aber für den ATmega8, d.h. Ihr braucht auch
das Datenblatt zum ATtiny817
http://ww1.microchip.com/downloads/en/DeviceDoc/40001901B.pdf

von Stefan ⛄ F. (stefanus)


Bewertung
-1 lesenswert
nicht lesenswert
Das gemeine daran ist, dass es für diese "neuen" ATtiny Modelle 
(vermutlich) noch keine Tutorials gibt, von denen man einfach kopieren 
könnte.

von Tim T. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Muss aber ehrlich sagen das die neuen Datenblätter für so etwas 
absoluter Schrott sind, da braucht man ewig um was zu finden, es geht 
einfach im Textbrei unter.

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]
  • [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.