Finde den Fehler im programm nicht

OP #398602
Lesenswert?

Hallo!

Habe jetzt mal versucht ein Programm zu erstellen, wo nur der Schalter
S0 und S1 am PortA gedrückt werden dürfen und an PortC soll dann NUR
eine LED (nennen wir sie H0) leuchten.

Habe dazu mal folgendes Programm erstellt. Bitte zerfetzt mich nicht in
der Luft, es ist erst mein zweites...


.include "4433def.inc"

LDI r16, 0xFF
OUT DDRC, r16


Anfang: IN r16, PINA
  ANDI r16, 3
  CPI r16, 3
  BREQ H0ein
  CBI PORTA, PA0
  RJMP Anfang

H0ein: SBI  PORTA, PA0
       RJMP Anfang


Gruß
Dominik
Gast #398603
Lesenswert?

Darf man fragen, was genau nicht funktioniert? Tut sich bei der LED
gar nichts oder leuchtet eine andere als die gewünschte, oder...

Wie ist die LED denn angeschlossen? Wenn sie High-Side am Port hängt,
musst Du das entsprechende PORT-Bit löschen, um die LED
einzuschalten. Ansonsten siehts OK aus.
OP #398607
Lesenswert?

Hallo!

Danke erstmal wieder für die super schnellen Antworten. Sorry wenns
Programm etwas chaotisch aussieht, aber ich wusel mich gerade so
durch..

Hier mein verbessertes Programm...

.include "4433def.inc"

LDI r16, 0xFF
OUT DDRC, r16


Anfang: IN r16, PORTC
    ANDI r16, 3
    CPI r16, 3
    BREQ H0ein
    CBI PORTC, PC0
    RJMP Anfang

H0ein: SBI  PORTC, PC0
       RJMP Anfang




Das blöde ist nur... jetzt leuchten alle LEDS und ich bekomm se auch
nicht durch drücken der taster aus...

Gruß
Dominik
Gast #398608
Lesenswert?

Du schaltest immer noch den selben Port, von dem Du auch einliest! Das
Bit, das Du veränderst, ist eins von denen, die Du vorher eingelesen
hast! Du solltest vll. mal posten, an welchem Port Deine Taster hängen
und an welchem die LEDs. Entweder hast Du die Taster an Port A (dann
muss Port A als Eingang mit Pull-Ups definiert sein) und die LEDs an
Port C (dann muss Port C als Ausgang definiert sein), oder umgekehrt...
#398610
Lesenswert?

Schau noch mal dein Programm durch.
Und halte immer im Hinterkopf:

Am PORT C hängen die LED
Am PORT A hängen die Schalter

Mit diesem Hintergrundwissen:

> Anfang: IN r16, PORTC

Warum fragst du die LED ab, ob ein Schalter gedrückt ist?

Hinweis: Wenn in deinem Programm (mit der Aussenbeschaltung)
entweder nur PORTA (oder PINA) oder nur PORTC (oder PINC)
vorkommt, dann kann es nicht funktionieren. Denn:

Am PORT C hängen die LED
Am PORT A hängen die Schalter
OP #398612
Lesenswert?

ok,, habs mal nach meinem besten Überlegen verbessert...

.include "4433def.inc"

LDI r16, 0x01
OUT DDRC, r16



Anfang: IN r16, PIND
    ANDI r16, 3
    CPI r16, 3
    BREQ H0ein
    CBI PORTC, PC0
    RJMP Anfang

H0ein: SBI  PORTC, PC0
       RJMP Anfang



Das Problem was ich nicht verstehe ist, gebe ich oben bei IN r16, PIND
statt PIND, PINA ein bekomme ich eine Fehlermeldung!
Mit dem obigen Programm leuchtet LED0 jetzt wenn ich Taster S0 oder S1
drücke... aber es sollte doch eine UND Verknüpfung ergeben...
verwirrung
#398615
Lesenswert?

2 Ding sind wichtig:
* wie sind die LED's angeschlossen?
  meistens sind sie gegen Vcc geschaltet.
  Das bedeutet, dass der Prozessor-Pin auf 0 gehen
  muss, damit die LED leuchtet.
  Ich bin mir jetzt nicht sicher, aber ich glaube das STK500
  hat sie gegen Masse geschaltet, d.h. der Prozessor-Pin muss
  auf 1 gegeben werden, damit die LED leuchtet.
  Hatte erst einmal ein STK500 für 20 Minuten zu spielen und
  weiss die Details nicht mehr.

* wie sind die Taster angeschlossen?
  d.h. welchen Pegel kriegst du im Programm (0 oder 1) wenn
  der Taster nicht gedrückt, bzw. wenn er gedrückt wird.

  Meistens sind sie gegen Masse angeschlossen. du musst dann
  den Pullup aktivieren:

   DDRA = 0x00;    // komplette PortA auf Eingang
   PORTA = 0xFF;   // alle Pullup Widerstände einschalten

   PINA liefert dann den Zustand der Taster: ein nicht gedrückter
   Taster liefert eine 1, ein gedrückter eine 0

  Wie gesagt: meist macht man das so, weil es elektrisch die
  einfachste Variante ist. Ob das bei dir so ist, musst du
  entweder nachlesen oder mal im Schaltplan nachschauen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren