Forum: Mikrocontroller und Digitale Elektronik ATtiny series1 Unterschied PORTB.DIRSET PORTB.OUTSET


von Lars H. (larsfcfa)


Lesenswert?

Hallo,

ich beschäftige mich gerade mit den "neuen" ATtiny series 1, konkret mit 
dem ATtiny416 auf dem Xplained Nano Board.

Das klassische "Hallo world" -> LEDs an/aus.

Dazu habe ich in der Vielzahl an Dokumenten verschiedene Vorgehensweisen 
gefunden:

PortB/Pin5 auf Output:
1
PORTB.DIR = PIN5_bm;

nun wird es spannend:
1
PORTB.DIRSET = PIN5_bm;
 bzw.
1
PORTB.DIRCLR = PIN5_bm;
und
1
PORTB.OUTSET = PIN5_bm;
 bzw.
1
PORTB.OUTCLR = PIN5_bm;
sollen das gleiche machen,

dazu gibt es noch jeweils die Marco-Versionen
1
PORTB_OUTSET = PIN5_bm;
und Structure-Versionen
1
PORTB.OUTSET = PIN5_bm;

Könnte mir jemand dazu ein paar Hintergründe/Empfehlungen geben?

von Thomas W. (thomas_w808)


Lesenswert?

PORTB.DIRSET = PIN5_bm;  umschalter Input/Output
PORTB.OUTSET = PIN5_bm;  Ausgang setzen

Möglich wäre noch: PORTB.OUTTGL = PIN5_bm;  toggeln

von Lars H. (larsfcfa)


Lesenswert?

ich dachte Umschalter ist
PORTB.DIR
und nicht
PORTB.DIRSET
?

von Thomas W. (thomas_w808)


Lesenswert?

.DIRSET gibt ja schon die logische "1" vor, diese dann mit |=PIN5_bm an 
die gewünschte Stelle gesetzt werden.
Mit .DIR kannst du den gesamten Port schreiben. z.B. PortB.DIR = 
0b10101010

von Peter D. (peda)


Lesenswert?

Die ausführliche Beschreibung findest Du im "megaAVR 0-series 
Manual.pdf".
Es gibt auch noch .DIRTGL, .OUTTGL.

von Lars H. (larsfcfa)


Lesenswert?

Alles klar, vielen Dank.

von Lars H. (larsfcfa)


Lesenswert?

Zur Ergänzung:
PORTC.DIR |= PIN6_bm;
führt zum gleichen Ergebnis wie
PORTC.DIRSET = PIN6_bm;
nur das der Compiler das erstere in 3 Anweisungen (Read/Mod/Write) 
übersetzt, während unten nur 1 Anweisung (plus evtl. 1 Register-Laden) 
nötig wird

von Georg M. (g_m)


Lesenswert?

Lars H. schrieb:
> ATtiny416 auf dem Xplained Nano Board.
1
// ATtiny416 XNANO Simple Blink
2
3
#include <avr/io.h>
4
#define F_CPU 3333333
5
#include <util/delay.h>
6
7
int main(void)
8
{
9
  while(1)
10
  {
11
    PORTB.DIRTGL = PIN5_bm;
12
    _delay_ms(500);
13
  }
14
}

von Lars H. (larsfcfa)


Lesenswert?

So wie ich es verstanden haben schaltet
PORTB.DIRTGL = PIN5_bm;
immer zwischen Ein- und Ausgang um.
Eigentlich sollte der Pin aber auf Ausgang geschaltet bleiben und nur 
auf low oder high gesetzt werden, oder?

von Veit D. (devil-elec)


Lesenswert?

Lars H. schrieb:
> So wie ich es verstanden haben schaltet
> PORTB.DIRTGL = PIN5_bm;
> immer zwischen Ein- und Ausgang um.
Korrekt.

> Eigentlich sollte der Pin aber auf Ausgang geschaltet bleiben und nur
> auf low oder high gesetzt werden, oder?
Dann nimm OUT und seine Zusatzregister.

Zur Ausgangsfrage.
Ich vergleiche das einmal mit dem altbekannten DIR Register. Im 
herkömmlichen DIR Register muss man zum umschalten zwischen Ausgang und 
Eingang das entsprechende Bit entweder gezielt setzen oder gezielt 
löschen. Das kann man bei den neuen Controller auch so machen. Aber sie 
haben noch paar zusätzliche Register wie zum DIRSET und DIRCLR. Bei 
diesen muss man keine Bits löschen, was auch nicht geht bzw. keinen 
Effekt hat. In diesen Registern kann man nur Bits setzen mit genau dem 
Ziel wie der Registername sagt SET oder CLEAR. Bei diesen gibts nur 
"positive Logik". Das wird dann intern automatisch auf das DIR Register 
angewendet. Das gleiche Prinzip bei OUT. Entweder gezielt mit 0 oder 1 
arbeiten oder nur 1 auf SET, CLR oder TGL anwenden.

Du kannst dir auch auf der Controllerseite unter Dokumente die App Notes 
runterladen und durcharbeiten. Das Manual sowieso. Damit bekommt man 
einen Grundeinstieg für verschiedene Dinge.

von Lars H. (larsfcfa)


Lesenswert?

Vielen Dank euch allen, das hat mir sehr weiter geholfen!

Viele Grüße,
Lars

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.