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. .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, 0x00 out PORTB, r16 ldi r25,0x00 marke: in r16, PIND ;Schalter von PORTD auslesen cpi r16,1 brne marke cpi r25,0 brne aus rjmp an an: ldi r25,0x01 ldi r17, 0x03 ;0b00111100 in r16 laden out PORTB, r17 ;r16 ins Register PORTB ausgeben rjmp marke aus: ldi r25,0x00 ldi r17, 0x00 ;0b00111100 in r16 laden out PORTB, r17 ;r16 ins Register PORTB ausgeben rjmp marke Vielleicht weiss ja jemand Rat Mfg Michael
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
Probier mal die PullUpWiderstände bei den Eingängen einzuschalten. z.B.: zuerst Datenrichtung DDRD=0x0F und dann mit PORTB=0x0F die PullUpWiderstände im Controller einschalten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.