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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.