Nabend,
ich sitze hier und komme nicht weiter.
Benutze derzeit den 2313
Also Portb wird ja so als Ausgang defeniert:
ldi r16, 0xFF
out ddrb, r16
und Portd als Eingang
ldi r16, 0x00
out ddrb, r16
Nun möchte ich aber das PB0 eingang ist und PB1,PB2 und PB3 ausgänge
sind.
Irgendwie bekomme ich das nit hin.
So weiter, wie kann ich jetzt nur PB0 einlesen ??? und weiter
verarbeiten.
Danke schon mal.
Markus
Hallo Markus,
für PIN0:
Also Portb0 wird ja so als Ausgang defeniert:
ldi r16, 0x01
out ddrb, r16
und Portb0 als Eingang
DDRB = DDRB & ~0x1; (komplement)
Also Portb1 wird ja so als Ausgang defeniert:
ldi r16, 0x02
out ddrb, r16
und Portb1 als Eingang
DDRB = DDRB & ~0x2;
Also Portb2 wird ja so als Ausgang defeniert:
ldi r16, 0x04
out ddrb, r16
und Portb2 als Eingang
DDRB= DDRB & ~0x4;
Also Portb3 wird ja so als Ausgang defeniert:
ldi r16, 0x08
out ddrb, r16
und Portb3 als Eingang
DDRB = DDRB & ~0x8
Also Portb4 wird ja so als Ausgang defeniert:
ldi r16, 0x10
out ddrb, r16
und Portb4 als Eingang
DDRB = DDRB & ~0x10
Also Portb5 wird ja so als Ausgang defeniert:
ldi r16, 0x20
out ddrb, r16
und Portb5 als Eingang
DDRB = DDRB & ~0x20
Also Portb6 wird ja so als Ausgang defeniert:
ldi r16, 0x40
out ddrb, r16
und Portb6 als Eingang
DDRB =DDRB & ~0x40
Also Portb7 wird ja so als Ausgang defeniert:
ldi r16, 0x80
out ddrb, r16
und Portb7 als Eingang
DDRB = DDRB & ~0x80
Sorry, aber die Komplementbidung unter Assembler ist mir C-Progger
nicht geläufig. Ich weiß aber, dass Assembler dafür eine Abürzung kennt
- nur deren Syntax weiß ich nicht.
Gruß Marcus
Machen wir das ganze mal Binär, damit es vielleicht etwas anschaulicher
ist!
Wir befassen uns mal nur mit deinem Portb...
Du möchtest gerne:
PB0=Eingang
PB1=Ausgang
PB2=Ausgang
PB3=Ausgang
also musst du in das Datenrichtungsregister B (DDRB) folgenden Wert
Schreiben:
0b11111110
oder
0xFE
Daraus folgt der Code:
ldi r16, 0b11111110
out ddrb, r16
So nun hast du deine Ein und Ausgänge konfiguriert...
Da du wahrscheinlich jetzt nur den PB0 weiter verarbeiten möchtest,
kannst du ersteinmal den ganzen pinb einlesen
in r16,pinb ;den Zustand von den Eingängen einlesen
andi r16, 1<<pb0 ;du läßt nur pb0 auf 1 stehen, der rest wird 0
Nehmen wir an pinb = 0b00101001
Da uns ja nur der Eingang pb0
interessiert erstellen wir eine Maske. In unserem Fall 0b00000001
und
verknüpfen diese mit einem logischen UND (andi). In unserem Beispiel
würden wir also folgendes Ergebnis erhalten:
Beide Binärzahlen werden mit einem logischen UND verknüpft:
0b00101001 (haben wir aus unserem pinb Register gelesen)
0b00000001 (haben wir als Maske definiert)
---------------
0b00000001 (erhalten wir durch die UND (andi) Verknüpfung
So nun kannst du z.B. so weiter arbeiten:
sbrc r16,pb0 ;Ist pb0 gesetz(wenn nicht, dann überspringe
den nächsten Befehl)
etc.
Diesen Code stammt von Hannes und ist teil einer Blinkersteuerung!
Danke! Habe versucht ihn für deine Bedürfnisse "umzustricken"...
Hoffe ich habs richtig gemacht...
Vielleicht sieht Hannes das und gibt noch etwas Feedback...
Kannst ja mal unter folgendem Link schauen, hilft vielleicht weiter!
Ist vieles detailiert diskutiert....
http://www.mikrocontroller.net/forum/read-1-113815.html
Gruß,
Stephan!
Hm, irgendwie verstehe ich die Beschreibung nicht ganz.
Wäre nett, wenn du das ganze nochmal beschreiben würdest...
Bis zu welchem Punkt läuft es denn auf deinem Board? bzw. was hast du
für ein Board?
Gruß,
Stephan
Also
Board STK 500
Taster = pb0
Led 1 = pb1
Led 2 = Pb2
Led 3 = pb3
Taster nicht gedrückt = Alle LED aus
Taster gedrückt = Led 1 und 3 an nach wartezeit geht Led 1 aus
wird taster gehalten dann nix ändern
wird Taster losgelassen = Led 2 an und Led 3 aus, nach zeit geht led 2
aus und dann wieder alles von vorne.
Ok, das Problem ist klar!
in r16, pinb ;Du ließt das Pinb register ein
andi r16, 1<<pb0 ;lässt nur den Taster (Eingang) stehen
sbrc r16,pb0 ;du Fragst ab, ob dein pb0 = 0
rjmp gesetzt ;hier landest du, wenn es log. 1 ist
rjmp loop ;hier landest du, wenn es log. 0 ist
Deine Taster sind bei dem STK500 wie die LEDs "invertiert" (STK User
Guide Teil 3.2)
Gruß,
Stephan