ATtiny 404 und Portkonfiguration

OP #7390395
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.

OP #7390446
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.

#7390447
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

OP #7390471
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 ?

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

OP #7390485
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 !

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

#7390524
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
#7391702
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
}
#7391707
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren