Hallo Michael!
> Kann mir einer erklaeren warum mein Programm im
> Simulator ohne Probleme laeuft und auf dem Prozessor nicht???
> Das Programm soll nur zwei Dioden ueber einen Taster ein und
> ausschalten. Wenn ich das Demoprogramm aus den IO-Grundlagen
> von dieser Website nehme klappts, also Hardware ist richtig
> verdrahtet.
Die LEDs sind an VCC angeschlossen. Damit ein Strom durchfließen und die
LED leuchten kann, musst du das entsprechende Bit auf 0, also GND
setzen. Deswegen musst du z.B. um die Leds alle abzuschalten nicht 0x00
an den Port senden, sondern 0xFF.
Das gleiche bei den Tastern. Diese sind an GND angeschlossen, wenn du
einen drückst wird das jeweilige Bit also 0, wenn er nicht gedrückt ist
1. Wenn keine Taster gedrückt sind bekommst du also 0xFF in PIND.
Wenn du testen willst ob einzelne Schalter gedrückt sind, ist der Befehl
cpi unpraktisch, weil es nicht mehr funktioniert wenn z.B. mehrere
Tasten gleichzeitig gedrückt sind. Nimm stattdessen die Befehle sbic
(überspringen, wenn Bit 0 ist) und sbis (überspringen, wenn Bit 1 ist).
Diese Befehle lassen sich außerdem direkt auf die IO-Register anwenden,
du sparst dir also das Einlesen in ein Arbeitsregister.
Wenn du eine Led anmachen willst, musst du auch nicht den ganzen Port
ändern. Dafür gibt es die Befehle sbi (Bit setzen) und cbi (Bit
löschen). Auch diese sind nur auf die IO-Register anwendbar.
<hr>
Ich hab das Programm mal ein bisschen geändert:
.include "4433def.inc" ;Definitionsdatei einbinden
ldi r19,RAMEND ; init Stackpointer im RAM !!
out SPL,r19
ldi r16, 0xFF ;0xFF in r16 laden
out DDRB, r16 ;PortB als Ausgaenge konfigurieren
ldi r16,0x00 ;0x00 in Arbeitsregister r16 laden
out DDRD,r16 ;PortD als Eingaenge konfigurieren
ldi r16, 0xFF
out PORTB, r16
ldi r25,0x00
loop: in r16, PIND ;Schalter von PORTD auslesen
sbic PIND, 0
rjmp loop
sbic PORTB, 0
rjmp an
sbi PORTB, 0
rjmp loop
an:
cbi PORTB, 0
rjmp loop
<hr>
Achtung: das Entprellen der Tasten wird in diesem Programm nicht
durchgeführt (hab grad kein' Bock, vielleicht morgen), nach einem
Tastendruck wirst du also immer ein mehr oder weniger zufälliges
Ergebnis bekommen.
MfG
Andreas