mikrocontroller.net

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


Autor: Dominik F. (dominik1202)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: D. W. (dave) Benutzerseite
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@David:
Hast natürlich recht! Musst natürlich PORTC schalten...

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist mir auch erst später eingefallen :)

Autor: Dominik F. (dominik1202)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf PINA einlesen und auf PORTC ausgeben

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Dominik F. (dominik1202)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also die LEDs stecken auf PORTC und die Taster auf PORTA

Danke für eure Geduld rotwerd

Autor: Dominik F. (dominik1202)
Datum:

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

Autor: D. W. (dave) Benutzerseite
Datum:

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

Autor: Dominik F. (dominik1202)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das STK500 zum Testen... Habe nur die Flachkabel gesteckt.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

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.