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