ATTiny85 Serielle Bitfolge ausgeben

OP #3092420
Lesenswert?

Hallo @all,

ich möchte mit dem ATTiny85 3 Taster einlesen, und je nach Taster soll 
an einem Ausgang eine andere Bitfolge heraus kommen:

z.B.
Taster 1  betätigen --> digitalWrite(D-OUT, 10011001);
                    --> digitalWrite(LED, High);
                        delay(200);
Taster 2  betätigen --> digitalWrite(D-OUT, 10011010);
                    --> digitalWrite(LED, High);
                        elay(200);
Taster 3  betätigen --> digitalWrite(D-OUT, 10011011);
                    --> digitalWrite(LED, High);
                        elay(200);


könnt ihr mir auf die Sprünge helfen mit welchem Befehl ich die Ports 
nicht einfach nur ein und ausschalten sondern eben eine seriell Bitfolge 
ausgeben kann.

meine ganzen Spielereien bisher haben so nicht das Ergebnis gebracht.

danke
#3092470
Lesenswert?

Tiny85 ist ja nicht gerade gesegnet mit reichlich Schnittstellen.
Entweder bastelst du dir was eigenes oder nimmst was vorhandenes.
Ich würde da auf Peter Daneggers one-wire-Bus setzen. Benötigt nur wenig 
Ressourcen und ist vor allem tolerant gegenüber Taktabweichungen. Für 
nen 8-beinigen Tiny perfekt. Findest du hier in der Codesammlung.
OP #3101813
Lesenswert?

kann mir jemand ein Beispiel Programm zeigen wo "min 2 Taster" auf ein 
Ausgang was schalten:

hiermit hab ich versucht ein 1 Taster und 1 Ausgangs Programm zu 
erweitern.  aber egal wie ichs mach, ich machs Falsch:
1
int main (void) {
2

3
 DDRB &= ~(1<<PB0); //PBO auf 0 -> als Eingang
4
 DDRB &= ~(1<<PB1); //PB1 auf 0 -> als Eingang
5
 DDRB |=  (1<<PB4); //PB4 auf 1 -> als Ausgang
6

7
 //PB0 bis PB4 sicherheitshalber auf 0 zurücksetzen
8
 PORTB &= ~(1<<PB0);
9
 PORTB &= ~(1<<PB1);
10
 PORTB &= ~(1<<PB4);
11

12
  while(1) {
13
    if (PINB & (1<<PB0)) { 
14
      PORTB |= (1<<PB4); //Ausgang PB4 auf 1 setzen
15
    }
16
    else {
17
      PORTB &= ~(1<<PB4); //Sonst: PortB aus!
18
    }
19
  }
20

21
}
Moderator (Firma: Titel) Persönliche Seite #3101819
Lesenswert?

Bitte verwende für C-Quelltexte die [ c] und [ /c] Tokens (ohne 
Leerzeichen, siehe Screenshot)...

Volland S. schrieb:
> kann mir jemand ein Beispiel Programm zeigen wo "min 2 Taster" auf ein
> Ausgang was schalten:
Warum "min. 2" wenn du eh' nur 2 Taster hast?
Dann bedeutet das doch "wenn alle Taster gedrückt sind"!
Wie sind die Taster angeschlossen?
Ist "gedrückt" = high oder low am Pin?

So wird erkannt, ob beide Pins high sind:
1
     if (PINB&(1<<PB0) && PINB&(1<<PB1)) { ... }

Ich würde das aber so schreiben:
1
     if ((PINB&3) == 3) { ... }
Angehängte Dateien:
OP #3102950
Lesenswert?

habs nun so gelöst:

if (PINB&(1<<PB0) || PINB&(1<<PB1) ....

bei jeder anliegenden 1 wird der Ausgang geschalten


wie sieht das nun aus wenn bei einer 0 geschalten werden soll ?
so wohl nicht:
if (PINB&(0<<PB0) || PINB&(0<<PB1) ....

so auch nicht:
if (PINB& ~(1<<PB0) || PINB&~(1<<PB1) ....
OP #3103511
Lesenswert?

ja Datenblatt echt toll.....

erarbeitet hab ich mir aber:

 PORTB = (1<<PB0);

das in die Anfangsroutine rein und dann gehts.

das aus dem Datenblatt

...
/* Define pull-ups and set outputs high */
/* Define directions for port pins */
PORTB = (1<<PB4)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Insert nop for synchronization*/
_NOP();
/* Read port pins */
i = PINB;


ist wohl nur für absolute Kenner,   für was das Zeug unter dem PortB = 
..... alles ist hab ich noch nicht kapiert
Moderator (Firma: Titel) Persönliche Seite #3103574
Lesenswert?

Volland S. schrieb:
> erarbeitet hab ich mir aber:
>  PORTB = (1<<PB0);
> das in die Anfangsroutine rein und dann gehts.
Ja, ist doch toll. Damit kannst du immer genau 1 Pullup einschalten...
> das aus dem Datenblatt
> PORTB = (1<<PB4)|(1<<PB1)|(1<<PB0);
Und was ist da jetzt der Unterschied? Was meinst du, welche Pullups 
werden da wohl ausser dem PB0 zusätzlich noch eingeschaltet?

Volland S. schrieb:
> Wie aktivier ich die Internen Pull-up Widerstände des ATTiny ?
Hast du das AVR-Tutorial schon gesehen? Was verstehst du da nicht?
#3104391
Lesenswert?

Volland S. schrieb:
> was bedeutet nun dies genau:

Es bedeutet, dass man nachdem man am PORT Register bzw. am DDR register 
eine Änderung gemacht hat, 1 Takt warten muss, ehe man das zugehörige 
Pin Register abfragen kann, weil die eigentliche Schaltung intern auch 
einen Takt braucht, bis sie aktiv ist.

Spiel in den meisten Fällen keine Rolle, weil man sowieso nicht 
unmittelbar sofort nach dem Umstellen des DDR Registers bzw. dem 
Anschalten der Pullup übers PORT Register gleich auf das PIN Register 
zugreift.

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