Forum: Mikrocontroller und Digitale Elektronik Portb als in und out


von Markus (Gast)


Lesenswert?

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

von Danny (Gast)


Lesenswert?

ldi r16,0xfe  ---> alles Ausgänge, nur PB0 ist Eingang
out ddrb, r16   ----> alle anderen Pins analog dazu

steht aber alles im Datenblatt

von Marcus M. (Gast)


Lesenswert?

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

von Danny (Gast)


Lesenswert?

oder mit Bild:
0000 0000 = 0x00   ===> alles Eingänge
1111 0000 = 0xf0   ===> pins 7-4 Ausgänge, pins 3-0 Eingänge
oder weils so schön ist:
1010 1010 = 0xaa   ===> Ausgang, Eingang, Ausgang, Eingang, Ausgang,
Eingang, Ausgang, Eingang

den Rest kennst du schon

von Stephan Titz (Gast)


Lesenswert?

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!

von Markus (Gast)


Lesenswert?

@ stephan

guten morgen.

werde es heute mal ausprobieren und mir mal rein zeihen.

Danke schon mal.

Markus

von Markus (Gast)


Lesenswert?

so im Simulator läuft das Programm aber aufm Board nicht.


Beschreibung:

wenn Taster 1 (pb0) an dann led 1,3 an und nach 1 sek led 1 aus
wird der taster losgelassen dass led 2 an (warten)
und wieder zum anfang wenn taster gedrückt bleibt, warten bis er
losgelassen wird.


**********************************************************
.include "2313def.inc"

ldi r16, 0b11111110
out ddrb, r16

loop:

in r16, pinb
andi r16, 1<<pb0

sbrc r16,pb0
rjmp gesetzt

rjmp loop

gesetzt:
ldi r16, 0b00000101
out portb, r16

; =============================
;   Warteschleifen-Generator
;     4000000 Zyklen:
; -----------------------------
; warte 3999996 Zyklen:
          ldi  R17, $24
WGLOOP0:  ldi  R18, $BC
WGLOOP1:  ldi  R19, $C4
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; warte 3 Zyklen:
          ldi  R17, $01
WGLOOP3:  dec  R17
          brne WGLOOP3
; -----------------------------
; warte 1 Zyklus:
          nop
; =============================


weiter:
ldi r16, 0b00000100
out portb, r16
in r16, pinb
andi r16, 1<<pb0
sbrc r16, pb0
rjmp weiter
rjmp weiter1

weiter1:
ldi r16, 0b00000001
out portb, r16

; =============================
;   Warteschleifen-Generator
;     4000000 Zyklen:
; -----------------------------
; warte 3999996 Zyklen:
          ldi  R17, $24
WGLOOP10:  ldi  R18, $BC
WGLOOP11:  ldi  R19, $C4
WGLOOP12:  dec  R19
          brne WGLOOP12
          dec  R18
          brne WGLOOP11
          dec  R17
          brne WGLOOP10
; -----------------------------
; warte 3 Zyklen:
          ldi  R17, $01
WGLOOP13:  dec  R17
          brne WGLOOP13
; -----------------------------
; warte 1 Zyklus:
          nop
; =============================



ldi r16, 0b00000000
out portb, r16

rjmp loop
********************************************************

wo ligt da jetzt der fehler ?

von Stephan Titz (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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.

von Stephan Titz (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

Danke,
habe jetzt noch die Out werte Invertiert und die rjmp getauscht und es
geht.

suppi, und wieder was dazu gelernt.

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.