Hallo,
ich möchte mit einem atmega32 eine LED schalten.
Das ganze soll in Assembler geschieben werden, es sollen die Kommandos
sbis und sbic genutzt werden.
Der Eingangspin soll der Pin 1 von PortD sein.
Leider leuchtet die LED an PortB die ganze Zeit, es wird nicht
geschaltet.
Wo ist der Fehler?
Franz
Hier der Code:
1
include "m32def.inc" ; Definitionsdatei für den Prozessortyp einbinden
2
3
ldi r16, 0xFF
4
out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
; Richtungsregister DDRB als Ausgang konfigurieren
6
ldi r16, 0x00
7
out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
; Richtungsregister DDRD als Eingang konfigurieren
9
10
loop:
11
sbic PIND, 1
12
in r16, 1
13
14
sbis PIND, 1
15
in r16, 0
16
17
18
out PORTB, r16 ; Inhalt von r16 an Port B ausgeben
ich programmiere zwar nicht in assambler, aber ich sehe schon das du die
led an und ausschlatest. da dein auge aber viel zu träge ist dies
wahrzunehmen, sihet es für dich so aus als wäre die led ständig an.
mach das am bestem im timer un taggel das bin aller 1s oder so
Nein, ich glaube daran liegt das nicht:
Ist PinD,1 auf 0, dann wird immer wieder hintereinander " sbis PIND, 1
in r16, 0" durchgeführt, ansonsten das andere Kommando.
das sollte doch heißen:
ldi r16, 0b11111110
statt:
in r16, 1
EDIT: Oder so^^ Ich kenne ja die schaltung und den Zweck nicht. Aber
"in" geht doch nur von Port nach Register, nicht um eine Zahl in ein
Register zu schreiben...
Hi
in r16, 1 ???
sbis PIND, 1
in r16, 0 ???
Das heisst einmal 'in r16, TWSR' und 'in r16, TWBR'. Aber das willst du
nicht wirklich. Was sollen die beiden Zeilen bezwecken? 'in'-Befehle
sind zu Lesen von IO-Registern. Wenn du ein Register mit einem Wert
laden willst, musst du z.B. 'ldi r16, 1' benutzen.
MfG Spess
>Der Eingangspin soll der Pin 1 von PortD sein.
Ha!
Der Pin Eins ist PB0, also musst du das schreiben:
sbic PIND, 0
...
sbis PIND, 0
Ich beanspruche die Eins selbst!