Forum: Mikrocontroller und Digitale Elektronik ATtiny 404 und Portkonfiguration


von Rudolf M. (rudolf_58)


Lesenswert?

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.

von Georg M. (g_m)


Lesenswert?


von Rudolf M. (rudolf_58)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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?

von Rudolf M. (rudolf_58)


Lesenswert?

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.

von Ingo L. (corrtexx)


Lesenswert?

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
von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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

von Rudolf M. (rudolf_58)


Lesenswert?

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 ?

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Rudolf M. (rudolf_58)


Lesenswert?

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 !

von Wilhelm M. (wimalopaan)


Lesenswert?

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

von Rudolf M. (rudolf_58)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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

von S. L. (sldt)


Lesenswert?

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

von Rudolf M. (rudolf_58)


Lesenswert?

Vielen Dank !

von S. L. (sldt)


Lesenswert?

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

von S. L. (sldt)


Lesenswert?

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

von Georg M. (g_m)


Lesenswert?

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
}

von Ingo L. (corrtexx)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

Ingo L. schrieb:
> Magic Numbers sind ein schlechter Stil.

Wenigstens konsequent in Hex. Richtige Arschlöcher aber mischen Oktal, 
Dezimal und #defines.

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

> 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
Noch kein Account? Hier anmelden.