ATTiny85 Serielle Bitfolge ausgeben

OP #3092420
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
Gast
Mit welcher frequenz willst du das denn machen?
Evtl. lässt sich da auch gut eine serielle Schnittstelle verwenden 
(USART,SPI,TWI)? Macht das alles viel einfacher...
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
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
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
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
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
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?
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.