Forum: Mikrocontroller und Digitale Elektronik AVR ATtiny84 Ausgänge schalten ArduinoISP PORTx statt digitalWrite


von Thomas S. (thomas_sc)


Lesenswert?

Hallo zusammen,

ich versuche gerade einen ATtiny 84 mit Platformio und einem Arduino als 
ISP zu programmieren. Ich habe hier das Problem die Ausgänge zu 
beschalten, in der Arduino-Schreibweise klappt es:
1
digitalWrite(1, HIGH);
2
digitalWrite(2, HIGH);
3
digitalWrite(3, HIGH);
4
delay(5000);
5
6
digitalWrite(1, LOW);
7
digitalWrite(2, LOW);
8
digitalWrite(3, LOW);
9
delay((5000);
10
...

  nun möchte ich das ganze etwas effizenter gestalten und habe das hier 
versucht:
1
 
2
DDRB |= (1 << DDB1);// PB01 als Ausgang setzen
3
DDRB |=(1 << DDB2); // PB02 als Ausgang setzen
4
DDRB |=(1 << DDB3); // PB03 als Ausgang setzen
5
DDRA |=(1 << DDA1); // PA1 als Ausgang setzen
6
7
PORTB |= (1 << PORTB1); // PB1 auf 1 setzen
8
PORTB |= (1 << PORTB2); // PB2 auf 1 setzen
9
PORTB |= (1 << PORTB3); // PB3 auf 1 setzen
10
PORTA |= (1 << PORTA1); // PA1 auf 1 setzen
11
delay(5000);
12
13
PORTB &= ~(1 << PORTB1); // PB1 auf 0 setzen
14
PORTB &= ~(1 << PORTB2); // PB2 auf 0 setzen
15
PORTB &= ~(1 << PORTB3); // PB3 auf 0 setzen
16
PORTA &= ~(1 << PORTA1); // PA1 auf 0 setzen
17
delay(5000);
PB01 und PB02 funktioniert noch, alles weitere funktioniert leider nicht 
:-( Die Ausgänge PB3 und PA1... verändern sich nicht (kein 1 Signal)

Wie kann ich die PINS 3 (PB1), 5 (PB2), 6 (PA7), 7 (PA6), 8 (PA5), 9 
(PA4), 10 (PA3), 11 (PA2), 12 (PA1), 13 (PA0) ansprechen und auf 1 und 0 
setzen, was mache ich falsch? Beim compilieren und flashen des ATtiny 
bekomme ich keine Fehlermeldung, das übertragen mit dem Arduino 
funktioniert.

Viele Grüße

Thomas

von EAF (Gast)


Lesenswert?

Habe das jetzt weder gegen das Dateblatt geprüft, noch getestet...

PB3, ist das nicht der Reset Pin?

von Thomas S. (thomas_sc)


Lesenswert?

Hallo EAF,

das stimmt PB3 ist der Reset-Pin, aber auch wenn ich den nicht beschalte 
(die Ausgänge einzeln probiere) funktioniert es leider nicht.

Wenn ich z.B. nur
1
 
2
DDRA |=(1 << DDA1); // PA1 als Ausgang setzen
3
PORTA |= (1 << PORTA1); // PA1 auf 1 setzen
4
delay(5000);
5
PORTA &= ~(1 << PORTA1); // PA1 auf 0 setzen
6
delay(5000);

setzte wird der Ausgang PA1 (PIN 12) nicht gesetzt.

Viele Grüße

Thomas

von roehrenvorheizer (Gast)


Lesenswert?

Hallo,

den Reset-Pin nicht zu beschalten, war bei den AVR nie eine gute Idee.

Mfg

von EAF (Gast)


Lesenswert?

Thomas S. schrieb:
> wird der Ausgang PA1 (PIN 12) nicht gesetzt.

Sieht aber richtig aus!

von Georg M. (g_m)


Lesenswert?

Wie verhalten sich einzelne Pins, wenn der ganze Port ein/ausgeschaltet 
wird?
1
#define F_CPU 1000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
int main(void)
6
{
7
  DDRA = 0xFF;
8
  while (1)
9
  {
10
    PORTA = 0xFF;
11
    _delay_ms(1000);
12
    PORTA = 0;
13
    _delay_ms(1000);
14
  }
15
}

von Wolfgang (Gast)


Lesenswert?

Thomas S. schrieb:
> nun möchte ich das ganze etwas effizenter gestalten und habe das hier
> versucht:

Das Thema ist nicht neu.
Wenn es dir nur um "etwas effizienter" geht, guck mal nach 
digitalWriteFast(), z.B. https://github.com/NicksonYap/digitalWriteFast

von Thomas S. (thomas_sc)


Lesenswert?

Hallo Georg M.,

vielen Dank für Deinen Code, es funktioniert nun, ich hatte einen 
Denkfehler :-(
1
digitalWrite(3, HIGH);
benutzt den ATtiny Pin 6 (PA7), dieser muss dann natürlich auch richtig 
angesprochen werden:
1
 PORTA = 0x64;
2
\\ PORTA = 0b01000000;
ich bin vom ATtiny Pin 4 (PB3) ausgegangen, was falsch ist.

@Wolfgang: Vielen Dank für den Hinweis, das schaue ich mir auch mal an.

Viele Grüße und herzlichen Dank euch beiden

Thomas

von Thomas S. (thomas_sc)


Lesenswert?

Sorry, der Code muss natürlich so lauten:
1
PORTA = 0x40;

Thomas

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.