mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe


Autor: Michael Joehrendt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Meiserl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.