Hallo Community,
ich versuche seit 3 Tagen ein Programm zu schreiben um eine LED über das
Drücken von einem Taster zu Togglen.
Die Bedingung: Dies soll über einen PORT (hier B) geschehen.
Also genauer PB1 als Eingang - für den Taster.
PB2 als Ausgang für die LED.
Der Grund: Ich Programmiere mit dem Arduino Board und einem darauf
enthaltenen ATMEGA 328P, die Software soll aber dann auf einem ATTINY45
laufen.
Programmiersprache: Assembler.
Das Programm:
1
start:
2
3
sbi DDRB, 2 ;LED Auf Ausgang
4
sbi PORTB, 2 ; LED Einschalten
5
cbi DDRB, 1 ; Pin B 1 als Eingang
6
cbi PORTB, 1 ; Pullup ausschalten
7
8
ldi r19, 0b00000010 ; lade 2 in r19
9
ldi r17, 0b00000010 ; lade 2 in r17
10
mov r3, r17 ; kopiere die 2 in r3
11
12
loop:
13
sbic PINB,2 ; wenn LED aus über springe den Befehl
14
in r4, PINB ; rufe den Taster ab
15
sbic PINB,1 ;wenn taster gedrückt überspringe den befehl
16
in r4, PINB ; lade Tasterzustand in r4 - hier die dZahl 4
17
mov r18, r4 ;
18
sbic PINB,2 ; wenn LED aus überspringe den Befehl
19
subi r18, 0b00000100 ; ansonsten ziehe die Zahl 4 ab, das
20
cpse r18, r19 ;Registerwert 2 ist - entspricht Taster gedrückt
21
ldi r18, $00
22
mov r17, r18 ; sicher den Zustand
23
or r18, r3 ; verknüpfe mit dem Sollwert
24
mov r3, r17 ; bewege den jetzt zustand in r3 für nächsten
25
breq loop
26
27
28
and r17, r18
29
30
breq loop
31
sbis PORTB,2 ; jetzt eine if verzweigung wenn taster gedrückt
32
rjmp ifelse
33
cbi PORTB, 2
34
ldi r20, 0b00000100
35
mov r4,r20
36
rjmp endif
37
ifelse:
38
sbi PORTB, 2
39
40
endif:
41
42
rjmp loop
43
rjmp start
Ich hoffe das Programm ist für manchen verständlich.
Ansonsten kommentiere ich gerne nach.
Mein Problem mit dem Debugger:
In dem funktioniert es wenn ich PINB1 setze, also den Taster simuliere.
Ist das eigentlich richtig? Oder muss ich PORTB1 setzen(Debugger).
Mir ist nicht klar: Der ATMEGA liest den PIN aber gibt am PORT aus?
Ich habe viel gelesen und im Internet gesucht, nun such ich mir Hilfe.
Nachschub vom Fragenden:
Kann man überhaupt über einen PORT Ein und Ausgänge vergeben?
Und wenn nein welchen Sinn macht ein ATTINY45, der nur einen PORT hat?
In meiner Simulation (Debug) funktioniert die Software. Ist das richtig
den PINB zu setzen? Also wird auch bei der Hardware Version der PINB1
gesetzt?
Die Rechnerei hab ich in der Software weil ja PINB2 durch die LED
gesetzt ist...
Danke
Ben schrieb:> Der ATMEGA liest den PIN aber gibt am PORT aus?>> Ich habe viel gelesen
und das Datenblatt und dazu sämtliche Tutorials einfach ignoriert oder
wie?
Wie meinst du das Justus Skorps?
Ich bin Anfänger die Frage entsteht aus unsicherheit, da die Simulation
geht nur mit dem Board gehts nicht.
Im Programm muss ich den PIN lesen (Taster) und den PORT setzen (LED)
dem bin ich mir sicher.
Nur wie verhält sich das dann im Microcontroller wenn ein PIN gelesen
wird? Wird dann auch der PORT gesetzt?
PORT Register setze ich bei Eingängen für den PULLUP Widerstand das ist
mir auch klar.
Was mir einfach nicht klar wird warum ich mein Programm super simulieren
kann, es nur am Controller selbst nicht geht.
Mir dem DDR Register bestimmst du, ob ein Pin als Eingang oder als
Ausgang arbeitet.
Das PIN Register dient zum Lesen den Zustandes des I/O Pins. Es liest
den Zustand des I/O Pins unabhängig davon, ob der Pin als Eingang oder
Ausgang geschaltet ist.
Wenn der I/O Pin ein Eingang ist, bestimmst du mit dem PORT Register, ob
der interne Pull-Up Widerstand aktiviert sein soll.
Wenn der I/O Pin ein Ausgang ist, bestimmst du mit dem PORT Register, ob
der I/O Pin High oder Low Pegel ausgibt.
Das PORT Register kann gelesen werden. Es liefert jedoch nicht unbedingt
den aktuellen Zustand des I/O Pins, sondern den Zustand, den der Pin
haben sollte. Der Unterschied fällt bei Kurzschluss auf. Wenn du einen
Ausgang auf High setzt aber mit GND kurzschliesst, dann ist das
entspreche Bit im PORT Register High, während es im PIN register Low
ist.
Manche AVR können Ausgangs-Pins Toggeln (umschalten), indem man das
entsprechende Bit in PIN Register mit 1 beschreibt.
> Nur wie verhält sich das dann im Microcontroller wenn ein> PIN gelesen wird?
Dann erhälst du den aktuellen Zustand des I/O Pins.
> Wird dann auch der PORT gesetzt?
Nein, beim Lesen eines PIN/PORT/DDR Registers wird nichts gesetzt oder
verändert.
> Was mir einfach nicht klar wird warum ich mein Programm super> simulieren kann, es nur am Controller selbst nicht geht.
Vielleicht wiel die Pins für irgendwas anderes reserviert sind? Oder
weil du die Pins falsch beschaltet hast?
> Ich Programmiere mit dem Arduino Board
Welchem?
Dein programm sieht ziemlich wirr aus, ich kann den Ablauf gar nicht so
recht am Quelltext ablesen. Zum Beispiel:
1
loop:
2
sbic PINB,2 ; wenn LED aus über springe den Befehl
3
in r4, PINB ; rufe den Taster ab
4
sbic PINB,1 ;wenn taster gedrückt überspringe den befehl
5
in r4, PINB ; lade Tasterzustand in r4 - hier die dZahl 4
6
mov r18, r4 ;
Das sagt mir, dass r4 nur dann einen Wert enthält, wenn entweder die LED
an ist oder der Taster nicht gedrückt ist.
Ansonsten enthält r4 einen zufälligen Wert, und r18 ebenfalls.
Benjamin K. schrieb:> Wie meinst du das Justus Skorps?
das in jedem Tutorial und erst im Datenblatt der Zusammenhang zwischen
PORTx, PINx und DDRx erklärt wird...