Mischport definieren

Gast #39115
Lesenswert?

Moin,

ich möchte beim Tiny12L die ersten 4 Pins als Ausgabeport, den 5. Pin
als Eingabe und den 6. Pin wider als Ausgabeport des PortBs deklarieren
und benutzen. Wie kann man so etwas in Assembler realisieren? Was wird
genau mit dem Befehl IN eingelesen? Nur der Eingabeport oder der
komplette PortB (s. Beispiel oben)?
Gast #39117
Lesenswert?

du kannst jeden Port einzeln mit dem DDRx-Register definieren, entweder
komplett als byte:
ldi r16, 0b00010010   ;PORT 1und 4 als Ausgang
out DDRB, r16

oder auch bitweise einzeln
sbi DDRB, 4            ;setzt PORTB.4 als Ausgang

in liest den kompletten Port, wobei zu beachten ist, dass jeder Port 3
Register hat:
DDRx: Eingang/Ausgangsdefinition
PORTx: das eigentliche Portregister,
PINx: die Signale am eigentlichen Pin

Ist ein Portpin als Eingang definiert, muss man immer PINx einlesen, da
im Portregister nur steht, was man vorher reingeschrieben hat
(0:interner Pullup deaktiviert, 1: interner Pullup aktiviert).
Gast #39119
Lesenswert?

Ah, vielen Dank, also wenn ich wie oben beschrieben die Ports
deklariere, wie lese ich dann nur das ein, was am Pin 5 des PortBs
anliegt? Also welche Werte gibt dann PinB zurück, wenn an Pin 5 ein
high bzw. ein low anliegt?

Wie lautet der Assemblercode für die EEPROM Abspeicheraktion?

(Ich fange gerade erst an mit der Assemblerprogrammierung!)
Gast #39120
Lesenswert?

Entweder du benutzt die Sprungbefehle SBIC und SBIS (nächsten Befehl
überspringen, wenn Bit in IORegister set/cleared)

sbic PINB,5
rjmp BitSet
.
.
.

sbis PINB,5
rjmp BitCleared
.
.
.


BitSet:

BitCleared:


oder du musst dein Bit auscodieren:


in   Temp,PINB
andi Temp,0b00100000

somit steht in Temp 00100000, wenn das Bit gesetzt ist und 0, wenn das
Bit nicht gesetzt ist.
Gast #39122
Lesenswert?

Moin,

mein Tiny12L läuft komischerweise nicht, mit Ponyprog kann ich Daten
erfolgreich übertragen, aber anschließend läuft dieses lachhafte
Programm nicht:
------------------------------------------------------
.include "tn12def.inc"

ldi r18, 0b11111111
out DDRB, r18

ldi r16, 0b11111111
out PORTB, r16

ende: rjmp ende

------------------------------------------------------

Ich habe kein externes Quarz angeschlossen - muss ich den internen RC
ocillator noch aktivieren?

Benjamin
Gast #39123
Lesenswert?

Moin,

wie kann ich einen Taster per Assembler entprellen? Ich benötige dies,
um Register hochzuzählen, wenn ich einen Taster drücke (Beim Drücken
des Tasters soll noch nichts passieren, erst beim Loslassen soll ein
Register um 1 incrementiert werden.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren