Forum: Mikrocontroller und Digitale Elektronik ATTiny85 Serielle Bitfolge ausgeben


von Volland S. (volland_s)


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

von Franz (Gast)


Lesenswert?

mit PRINTBIN

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Volland S. schrieb:
> mit welchem Befehl
Mit welcher Sprache?

Sonst gilt allgemein:
Pegel ausgeben, Warten, Pegel ändern, Warten, Pegel ändern, Warten, 
Pegel ändern, Warten, Pegel ändern, Warten, Pegel ändern, Warten, usw...

von Volland S. (volland_s)


Lesenswert?

momentan spiel ich über Arduino,mit einfachen Blink und Tast Programme.

hat mir jemand ein Beispiel für PRINTBIN Ausgabe

von Bananen Joe (Gast)


Lesenswert?

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...

von H.Joachim S. (crazyhorse)


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.

von Volland S. (volland_s)


Lesenswert?

schön wäre im Bereich von 150kHZ

das ist ein super Hinweis das ganze per Serielle Schnittstelle zu 
realisieren.

ich fürchte meine Programmier Kenntnisse sind noch nicht ganz so 
ausreift:

muss mir Beispiele anschauen und durcharbeiten

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Volland S. schrieb:
> muss mir Beispiele anschauen und durcharbeiten
Das Datenblatt des uC ist auch ein unerschöpflicher Quell der 
Information zum Bauteil... ;-)

von Volland S. (volland_s)


Lesenswert?

Lothar Miller schrieb:
> Volland S. schrieb:
>> muss mir Beispiele anschauen und durcharbeiten
> Das Datenblatt des uC ist auch ein unerschöpflicher Quell der
> Information zum Bauteil... ;-)

ohhhh ja da arbeit ich gerade dran.

ist aber ganz schön zähflüssig und schwer zum Einstieg

von Volland S. (volland_s)


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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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) { ... }

von Volland S. (volland_s)


Lesenswert?

auf meinem Steckboard im Moment auf High,

aber eigentlich will ich am Ende 4 Taster auf Masse auswerten.

oh man, danke für die Hinweise,  muss damit mal weiter tüfteln

von Volland S. (volland_s)


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) ....

von Volland S. (volland_s)


Lesenswert?

puhh kann das einfach sein wenn man drauf kommt:

einfach paar Vorzeichen umdrehen

    if (PINB&(1>>PB0))
    {
      PORTB  &= ~(1<<PB4);

von Volland S. (volland_s)


Lesenswert?

Wie aktivier ich die Internen Pull-up Widerstände des ATTiny ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Aber das steht doch alles in jedem AVR Datenblatt. Du setzt die Richtung 
des Pins im DDR auf Input und schreibst dann eine 1 in das Pin Bit im 
PORT Register. Bitte lade dir erstmal das Datenblatt und lies es.
http://www.atmel.com

von Wolfgang (Gast)


Lesenswert?

Volland S. schrieb:
> Wie aktivier ich die Internen Pull-up Widerstände des ATTiny ?

Wenn ich mich recht erinnerer, muss man dafür eine "1" auf das Portbit 
schreiben, steht aber im Datenblatt (General I/O oder so ähnlich)

von Volland S. (volland_s)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Volland S. (volland_s)


Lesenswert?

was bedeutet nun dies genau:

/* Insert nop for synchronization*/
_NOP();
/* Read port pins */
i = PINB;

von Karl H. (kbuchegg)


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.

von Walter S. (avatar)


Lesenswert?

Volland S. schrieb:
> puhh kann das einfach sein wenn man drauf kommt:
>
> einfach paar Vorzeichen umdrehen
>
>     if (PINB&(1>>PB0))
>     {
>       PORTB  &= ~(1<<PB4);

das (1>>PB0) kanns wirklich nicht sein,

wenn es ein Schreibfehler ist:
im Gegensatz zu Doktorarbeiten ist bei Programmtexten Copy and Paste 
sinnvoll

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.