Forum: Mikrocontroller und Digitale Elektronik Mischport definieren


von Reiner (Gast)


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

von Reiner (Gast)


Lesenswert?

Noch etwas: Habe ich die Möglichkeit einen Wert (z.B. 400) so vom
Mikrocontroller speichern zu lassen, dass ich ihn nach einem
Stromausfall wieder benutzen kann?

von crazy horse (Gast)


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

von MooseC (Gast)


Lesenswert?

Und was den Wert speichern betrifft... Ja das geht mit dem internen
EEPROM. Davon hast Du 64 Bytes beim Tiny12 zu Verfügung.

MooseC

von Reiner (Gast)


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

von Pete (Gast)


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.

von MooseC (Gast)


Lesenswert?

Und was das Speichern betrifft...


Suche einfach danach, Du wärst nicht der erste der sich damit
beschäftigt. Die Beiträge hier im Forum/Codesammlung sind recht
vielfältig.

Nur einer davon:
http://www.mikrocontroller.net/forum/read-4-647.html#647

MooseC

von Reiner (Gast)


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

von Reiner (Gast)


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

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.