Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe


von Michael Joehrendt (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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

von Meiserl (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.