Taster vom Pin nach GND, PullUp aktivieren.
if PINB(!(1<<PB3)){
PORTB|=(1<<PB0)
}
Wenn nicht gedrückt dann wieder ausschalten.
mit PORTB=0000100 schaltest du den PullUp an PB2 ein.
Hallo Leute,
Bin jetzt soweit, dass ich Ausgänge am ATtiny beschalte.
Nun würde ich gerne mithilfe von Tastern die Leds blinken lassen...
Jedoch funktioniert noch kein einziger meiner Codes...
Man sieht immer wieder 'PINB (1<<PB7)' und ähnliches, aber es funktioniert einfach nicht...
(Was << hier bedeuten soll findet man auch nirgends klar eklärt...)
Oder kann es an der Schatung liegen?
Ich aktiviere zuerst mittels DDRB=00000011 und nehme dann z.B. port-b3, (wegen 0 ist er ja Eingang)
Dann... Muss ich einen pull-up einschalten?
Das wäre dann PORTB=0000100 (Aber würde ich damit nicht wieder die Ausgänge umschalten -> von High auf Low?)
Und schlussendlich das mit (1<<PB3)
Taster vom Pin nach GND, PullUp aktivieren.
if PINB(!(1<<PB3)){
PORTB|=(1<<PB0)
}
Wenn nicht gedrückt dann wieder ausschalten.
mit PORTB=0000100 schaltest du den PullUp an PB2 ein.
DDRX sind Data Direction Register, sie geben an, ob eine Pin als Eingang oder als Ausgang dient. Wenn z.B. mit DDRB = 0x03; (0x03 = 3 = 0b00000011) oder mit DDRB |= (1 << PB0) | (1 << PB1); PB0 und PB1 im Data Direction Register gesetzt hat, gibt man damit an, dass man diese 2 Pins als Ausgang verwenden möchte. (<< und >> sind Schiebeoperatoren, sie schieben ein Bit um x Stellen nach rechts, bzw. nach links).
Möchtest du überprüfen, ob eine als Eingang verwendete Pin HIGH oder LOW ist kannst du das mit z.B. if(PINB & (1 << PB3)) machen.
Wichtig: Wenn du eine Taste an einem Eingang benutzt, brauchst du immer einen PullUp-Widerstand, der die Pin bei nicht gedrückter Taste auf + zieht (ich gehe davon aus, dass deine Taste die Pin auf Masse zieht). Du kannst das entweder mit einem externen Widerstand machen oder intern, indem du das entsprechende Bit für die Pin im Datenausgangsregister PORTX setzt.
mfg
Danke, werde ich gleich mal probieren und bei evt auftretenden Fragen wieder posten...
Was bedeutet das?PORTB|=(1<<PB0)
Das selbe wie
?PORTB=0000100
Es geht noch immer nicht... Leider...
___
Ich glaube hierbei liegt der Fehler
PORTB|=(1<<PB0) habe ich weggelassen, weil ich es nicht verstehe...Taster vom Pin nach GND, PullUp aktivieren.
if PINB(!(1<<PB3)){
PORTB|=(1<<PB0)
}
Wenn nicht gedrückt dann wieder ausschalten.
mit PORTB=0000100 schaltest du den PullUp an PB2 ein.
PORTB|=(1<<PB0) schaltet PB0 auf high.
PORTB&=~(1<<PB0) schaltet PB0 wieder auf low.
Also kannst du das nicht weglassen.
Wo hast du denn jetzt genau die Tasten und Led angeschalten.
Hier der Code:
main () // Hauptprogramm, startet bei Power ON und Reset
{
DDRB=7;
PORTB=16;
if(PINB & (1<<PINB3))
{
// Schleifenanfang Mainloop
PORTB=17;
waitMs(500);
PORTB=19;
waitMs(250);
PORTB=18;
waitMs(250);
PORTB=17;
waitMs(100);
PORTB=16;
waitMs(1000); // Quellcode
}
while (true); // Schleifenende Mainloop
Diese Schreibweise verstehe ich leider nicht... heißt | nicht eigentlich 'nicht' (so wie '!') ?PORTB|=(1<<PB0) schaltet PB0 auf high.
Ich rechne mit 2-er Potenzen PORTB(=00000001)=1
Das | bedeutet log. Funktion OR (Oder)
Das & bedeutet log. Funktion AND (Und)
Das ! bedeutet log. Funktion NOT (Nicht)
http://de.wikipedia.org/wiki/Logischer_Operator
MfG Hannes
Dein Programm wird genau einmal durchlaufen und daher nicht funktionieren.
Es fehlt die Endlosschleife.
Deine Schreibweise ist unübersichtlich, es wird sich niemand die Mühe machen aus den Zahlen zu eruieren welche Pin gemeint sind.
Das | ist ein oder.
Ich sreche immer nur Pin B0 und Pin B1 als Ausgang an.
Dazu kommt Pin B3 MIt dem Wert 2^4=16
@021aet04
Warum hier ein Oder?
Für mich macht das logisch keinen Sinn... Bin aber auch noch Anfänger in dem Gebiet...
Lesezeichen