Forum: Mikrocontroller und Digitale Elektronik Finde den Fehler im programm nicht


von Dominik F. (dominik1202)


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

von johnny.m (Gast)


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.

von D. W. (dave) Benutzerseite


Lesenswert?

Komisches Programm...

So wie das jetzt da steht geht das so:
PORTC als Ausgang,
PORTA einlesen, wenn Eingang 0 UND 1 logisch 1 sind, dann wird der
(jetzt kommts) PULL-UP vom Eingang 0 an PORTA aktiviert, wenn nicht,
wird der PullUp ausgeschaltet.

Verbesserung: PORTA mit PORTC ersetzen.

von johnny.m (Gast)


Lesenswert?

@David:
Hast natürlich recht! Musst natürlich PORTC schalten...

von D. W. (dave) Benutzerseite


Lesenswert?

Ist mir auch erst später eingefallen :)

von Dominik F. (dominik1202)


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

von johnny.m (Gast)


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...

von Hubert.G (Gast)


Lesenswert?

Auf PINA einlesen und auf PORTC ausgeben

von Karl heinz B. (kbucheg)


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

von Dominik F. (dominik1202)


Lesenswert?

also die LEDs stecken auf PORTC und die Taster auf PORTA

Danke für eure Geduld rotwerd

von Dominik F. (dominik1202)


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

von D. W. (dave) Benutzerseite


Lesenswert?

Du hast sicherlich keine PullUp / PullDown-Widerstände an deinen
Eingängen?

Verkabel die Taster mal mit Masse und schalte die internen PullUps ein.
Danach musst du natürlich umgedreht denken (0 = gedrückt).

von Dominik F. (dominik1202)


Lesenswert?

Habe das STK500 zum Testen... Habe nur die Flachkabel gesteckt.

von Karl heinz B. (kbucheg)


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.

von johnny.m (Gast)


Lesenswert?

> ...was ich nicht verstehe ist, gebe ich oben bei IN r16, PIND
> statt PIND, PINA ein bekomme ich eine Fehlermeldung!

Ist doch klar, der 4433 hat keinen Port A und deshalb auch kein PINA!

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.