Dank Eurer Hilfe habe ich meine ersten Schritte mit der ATtiny 404 UPDI Schnittstelle und AVR Dude recht schnell gekriegt. Ich habe den 404 ausgesucht weil der kostengünstig ist und nicht allzu viel Schaden entsteht wenn ich den schrotte. Ein paar IO Ports reichen für viele Anwendungen und in Verbindung mit einen Schieberegister lässt sich schon einiges realisieren. Ein kurzes Testprogramm (LED blinken) soll mir zeigen dass die Hardware funktioniert, so mache ich das immer wenn ich neue MCUs ausprobiere. Ein Blick in das Datenblatt zeigt mir dann eine etwas andere Welt, die mit ATMega8 & Co nicht vergleichbar ist, jedenfalls in Teilen. Zu meiner Schande schaffe ich es nicht einmal die IO Ports zu konfigurieren. Meine Frage: Ich möchte den PortA als Ausgang und den PortB als Eingang konfigurieren. Wie sieht da der Assembler Code dazu aus ? So mit DDR.. usw ist da nix. Es gibt da noch viel mehr zu fragen aber das wäre mal ein Anfang.
Das wäre beinahe ins Schwarze getroffen. Der Beispielcode ist in C und damit habe ich (noch) nichts am Hut. Wenn ich den Code einigermaßen verstehe wird mit Bitmasken (die in der io.h definiert sind) gearbeitet.
Rudolf M. schrieb: > So mit DDR.. usw ist da nix. Das DIR-Register 0x00 des PortA hast Du schon gefunden? Oder wo ist das Problem?
Ja habe ich schon gefunden, es gibt da ja einen ganzen Ratenschwanz von Registern die vermutlich auch mit den virtuellen Ports zusammenhängen. So weit bin ich da noch gar nicht vorgedrungen. Das Problem ist viel trivialer, wenn ich versuche mit ldi r16, 0b11111111 out portb_dir, r16 das Register 0x0420 zu beschreiben gibt mir die Maschine Operand 1 out of range:0x420 als Fehlermeldung zurück.
Rudolf M. schrieb: > So mit DDR.. usw ist da nix.
1 | PORTA.DIRSET = PIN1_bm; // PA1 als Ausgang (nur schreiben!) |
2 | PORTA.DIRCLR = PIN1_bm; // PA1 als Eingang (nur schreiben!) |
3 | PORTA.DIR |= PIN1_bm; // Read-Modify-Write möglich |
4 | PORTA.DIR &= ~PIN1_bm; // Read-Modify-Write möglich |
Etwas anderst als die klassischen AVR, aber durchaus schön... So schaltet man übrigens mal einen Pull-up an PA1 an:
1 | PORTA.PIN1CTRL |= PORT_PULLUPEN_bm; |
EDIT: Sorry, du wolltest ja Assembler
:
Bearbeitet durch User
Rudolf M. schrieb: > das Register 0x0420 zu beschreiben gibt mir die Maschine > Operand 1 out of range:0x420 als Fehlermeldung zurück. Mit out kannst Du nur auf die 0x00 - 0x1f zugreifen. Das hat sich seit den atmega aber nicht geändert und Du solltest das wissen.
Rudolf M. schrieb: > das Register 0x0420 zu beschreiben gibt mir die Maschine > Operand 1 out of range:0x420 als Fehlermeldung zurück. Das hat sich seit 1996 nicht geändert... "OUT" geht nur auf Adressen 0x00…0x3F
Vielen Dank für Eure Hinweise. Also wenn ich mich für alles schämen würde das ich wissen sollte, dann würde ich morgens gar nicht aufstehen :-) Ist das auch der Grund, warum im C Beispiel mit Bitmasken geabeitet wird ? Ist das dann auch anlaog in Assembler anzuwenden oder gibt es auch eine Alternative dazu ?
Rudolf M. schrieb: > Ist das auch der Grund, warum im C Beispiel mit Bitmasken geabeitet wird > ? Das Du Dich schämen musst? Oder was ist der Bezug? > Ist das dann auch anlaog in Assembler anzuwenden Sicher. > oder gibt es auch eine > Alternative dazu ? Kommt drauf an, was man ausdrücken will. Für einzelne Bits sind BitMasken schon praktisch. Für Zahlen im Dezimalsystem sicher Zahlen im Dezimalsystem, für manche andere Konstanten ggf. Hex- oder Oktalsystem.
Also das mit dem Schämen bezieht sich darauf dass ich das wissen sollte. Ich habe Gott sei Dank die Fähigkeit auch über mich selber lachen zu können. Also ich werde mit Bitmasken weitermachen, das führt sicher zum Erfolg. Bei ersten Durchsehen des Datenblattes (520 Seiten) sind mir da einige Dinge untergekommen die für mich völliges Neuland sind. Da ist von virtuellen Ports die Rede und von der MCU quasi unabhängigen Steuerung von Peripherie, von Configurable Custom Logic usw.. In den Foren finde ich nicht allzuviel zu diesen Themen. Hab ich wiedermal falsch gesucht oder gibt es dazu wirklich nicht viel ? Vielen Dank !
Rudolf M. schrieb: > In den Foren finde ich nicht allzuviel zu diesen Themen. Hab ich > wiedermal falsch gesucht oder gibt es dazu wirklich nicht viel ? Die DB sind eigentlich ziemlich gut erklärend. Dann gibt es noch die AppNotes. Bitte erstmal lesen, dann fragen. Rudolf M. schrieb: > von der MCU quasi unabhängigen Steuerung > von Peripherie Bezieht sich auf das Event-System. Rudolf M. schrieb: > Configurable Custom Logic Auch sehr mächtig. Damit kann man bspw. Uarts in Half-Duplex in ihrer Polarität invertieren (ok, man braucht extern noch eine Diode).
Bei den AppNotes tu ich mir immer schwer diese zielgerichtet zu finden. Den link den Georg gepostet hat würde ich nie so schnell finden.
Rudolf M. schrieb: > Bei den AppNotes tu ich mir immer schwer diese zielgerichtet zu finden. > Den > link den Georg gepostet hat würde ich nie so schnell finden. Schon mal nach unten gescrollt? https://www.microchip.com/en-us/product/ATTINY404
Rudolf M. rätselte:
> Da ist von virtuellen Ports die Rede
Eben diese werden per 'out' angesprochen, was nur 1 Takt benötigt;
ansonsten steckt aber nichts dahinter.
Und die 'sts' vs. 'out'-Thematik lässt sich vereinfachen mit macros, zum
Beispiel so (die Bezeichner sind natürlich Geschmackssache):
1 | .macro put |
2 | .if @0 < $40 |
3 | out @0,@1 |
4 | .else |
5 | sts @0,@1 |
6 | .endif |
7 | .endmacro |
8 | ;---------------------- |
9 | |
10 | .macro puti |
11 | ldi tmp0,@1 |
12 | put @0,tmp0 |
13 | .endmacro |
14 | ;---------------------- |
15 | |
16 | .macro get |
17 | .if @1 < $40 |
18 | in @0,@1 |
19 | .else |
20 | lds @0,@1 |
21 | .endif |
22 | .endmacro |
> ... im C Beispiel mit Bitmasken geabeitet ...
Das hat mit 'out-sts' bzw. 'in-lds' nichts zu tun; gibt es in Assembler
genauso, siehe die def.inc-Datei.
Mir persönlich ist das zuviel Schreibarbeit.
ich war unpräzise:
> ansonsten steckt aber nichts dahinter
Die VPORTx liegen im Bereich 0x0000..0x001F, folglich lassen sich in
ihnen einzelne Bits ansprechen mit 'sbi', 'cbi', 'sbic' und 'sbis'.
Rudolf M. schrieb: > Ein kurzes Testprogramm (LED blinken) soll mir zeigen dass die Hardware > funktioniert Blink without delay:
1 | // ATtiny404, output: PB1
|
2 | #include <avr/io.h> |
3 | int main(void) |
4 | {
|
5 | PORTB.DIRSET = PIN1_bm; |
6 | TCA0.SINGLE.PER = 0x0CB7; |
7 | TCA0.SINGLE.CMP1 = 0x0145; |
8 | TCA0.SINGLE.CTRLB = 0x23; |
9 | TCA0.SINGLE.CTRLA = 0x0F; |
10 | while(1) |
11 | {
|
12 | }
|
13 | }
|
Georg M. schrieb: > TCA0.SINGLE.PER = 0x0CB7; > TCA0.SINGLE.CMP1 = 0x0145; > TCA0.SINGLE.CTRLB = 0x23; > TCA0.SINGLE.CTRLA = 0x0F; Warum nicht gleich im Oktalsystem statt Hex?! kopfschüttel Magic Numbers sind ein schlechter Stil.
Georg M. schrieb: > Rudolf M. schrieb: >> Ein kurzes Testprogramm (LED blinken) soll mir zeigen dass die Hardware >> funktioniert > > Blink without delay: >
1 | > // ATtiny404, output: PB1 |
2 | > #include <avr/io.h> |
3 | > int main(void) |
4 | > { |
5 | > PORTB.DIRSET = PIN1_bm; |
6 | > TCA0.SINGLE.PER = 0x0CB7; |
7 | > TCA0.SINGLE.CMP1 = 0x0145; |
8 | > TCA0.SINGLE.CTRLB = 0x23; |
9 | > TCA0.SINGLE.CTRLA = 0x0F; |
10 | > while(1) |
11 | > { |
12 | > } |
13 | > } |
14 | >
|
Schaut nicht so sehr nach Assembler aus ;-) Und die magic-numbers schauen auch gut aus.
Ingo L. schrieb: > Magic Numbers sind ein schlechter Stil. Wenigstens konsequent in Hex. Richtige Arschlöcher aber mischen Oktal, Dezimal und #defines.
> Hex
In den "Getting Started with ..." von Microchip Technology Incorporated
ist diese Zahlendarstellung gebräuchlich, und ich bin nicht
bevollmächtigt, etwas daran zu ändern.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.