www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ein Bit ansprechen


Autor: Mary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin Anfangerin im Mikrocontrollerbereich,Ich habe die Tutorien
gelesen und damit viel gelernt, jetzt wollte ich dass 5 Tasten ein
Pin(1 LED)anspricht,und es läuft nicht.Kann mir jemand dabei helfen?
Danke

Autor: cazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du dein Programm einstellst sicher.
Sonst wird es eine Rätselstunde, darauf hat hier keiner Lust.

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte source code und Schaltplan posten

Autor: Mary (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
.include "m8def.inc"

         ldi r16, 0xFF
         out DDRB, r16       ;Port B durch Ausgabe von 0xFF ins
                             ;Richtungsregister DDRB als Ausgang
konfigurieren
         ldi r16, 0x00
         out DDRD, r16       ;Port D durch Ausgabe von 0x00 ins
                             ;Richtungsregister DDRD als Eingang
konfigurieren

         ldi r16, 0xFF
         out PORTB, r16      ;PORTB auf 0xFF setzen -> alle LEDs aus

loop:   in r16,PIND
        cbi PORTB,3
        rjmp loop
ende:    rjmp ende           ;Endlosschleife

Autor: Mary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED sind am Port B und die TAsten am PortD angeschlossen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK
Und was erwartest Du von diesem Code? Was macht er
stattdessen.

Hinweis: Ich sehe nirgends dass du irgendwas mit dem
von PortD gelesenen Werten machst. Alles was Dein Code
macht ist:
  von PortD die Werte einlesen
  an PortB das Bit 3 loeschen

mehr passiert da nicht. Sollte nicht irgendwie der neue
Zustand von PortB in irgendeiner Form vom Zustand auf
PortD abhaengen?

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.include "m8def.inc"

         ldi r16, 0xFF
         out DDRB, r16       ;Port B durch Ausgabe von 0xFF ins
                             ;Richtungsregister DDRB als Ausgang
konfigurieren
         ldi r16, 0x00
         out DDRD, r16       ;Port D durch Ausgabe von 0x00 ins
                             ;Richtungsregister DDRD als Eingang
konfigurieren

         ldi r16, 0xFF
         out PORTB, r16      ;PORTB auf 0xFF setzen -> alle LEDs aus

loop:   in r16,PIND
        sbic PIND, 0
        rjump loop
        sbic PIND, 1
        rjump loop
        sbic PIND, 2
        rjump loop
        sbic PIND, 3
        rjump loop
        sbic PIND, 4
        rjump loop
        in r16, 0x04
        OUT PORTB, r16
        rjmp loop
ende:    rjmp ende           ;Endlosschleife

das sollte so zumindest klappen, wenn ich dich richtig verstanden
habe.
wenn eine der tasten gedrueckt wird soll eine led leuchten??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens

Dein Code macht aber was anderes :-)

Dein Code macht: Wenn alle 5 tasten gedrueckt werden
wird PortB auf das gesetzt was am Port 0x04 grade
anliegt. Keine Ahnung was Port 0x04 ist.

Autor: Mary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jede am PORTD gedrückte Taste soll nur ein LED einschalten ZB LED 3 am
PORTB.

Autor: HD_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.include "m8def.inc"

         ldi r16, 0xFF
         out DDRB, r16       ;Port B durch Ausgabe von 0xFF ins
                             ;Richtungsregister DDRB als Ausgang
konfigurieren
         ldi r16, 0x00
         out DDRD, r16       ;Port D durch Ausgabe von 0x00 ins
                             ;Richtungsregister DDRD als Eingang
konfigurieren

         ldi r16, 0xFF
         out PORTB, r16      ;PORTB auf 0xFF setzen -> alle LEDs aus

loop:   in r16,PIND
        sbic PIND, 0
        sbi PORTB, 0

        sbic PIND, 1
        sbi PORTB, 1

        sbic PIND, 2
        sbi PORTB, 2

        sbic PIND, 3
        sbi PORTB, 3

        sbic PIND, 4
        sbi PORTB, 4

        rjmp loop
ende:    rjmp ende           ;Endlosschleife

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl.. das ist eine sache der definition ueber die taster ;) ob man auf
1 oder 0 zieht =)

Mary ok:

.include "m8def.inc"

         ldi r16, 0xFF
         out DDRB, r16       ;Port B durch Ausgabe von 0xFF ins
                             ;Richtungsregister DDRB als Ausgang
konfigurieren
         ldi r16, 0x00
         out DDRD, r16       ;Port D durch Ausgabe von 0x00 ins
                             ;Richtungsregister DDRD als Eingang
konfigurieren

         ldi r16, 0xFF
         out PORTB, r16      ;PORTB auf 0xFF setzen -> alle LEDs aus

loop:   in r16,PIND
        AND R16, 0x1F        ;Taste 1 - 5 reagiert, wenn alle

                             ;reagieren sollen Zeile entfernen
        OUT PORTB, r16
        rjmp loop
ende:    rjmp ende           ;Endlosschleife

Dann eben so ;)

Autor: HD_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein Fehler ist noch drin !!

der PortB muss noch gelöscht werden zuerst !

also:

loop: out PORTB,0
      und dann weiter mit
        in r16,PIND
        sbic PIND, 0
        sbi PORTB, 0

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HD_
...
wozu in r16,PIND???

und warum so umstaendlich??
man koennte auch noch definieren, wenn zwei tasten gedrueckt sind alle
LEDs an ;)

Ach was is ASM schoen einfach, wenn es ums Bit schubsen geht ;)

Gruss

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HD_
...
Arbeitest du bei Microsoft?? :D

Naja so erklärt sich, warum man immer die neuesten und groessten
Computer braucht ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HD_

Welchen Sinn soll es haben, an einem Port der
sowieso schon auf 0xFF steht, mittels sbi
dasselbe Bit nochmal auf 1 zu stellen?

Jungs: probiert doch eure Programme aus, bevor ihr sie
postet. Damit ist Mary nicht geholfen.
Entweder wir versuchen sie dahin zu bringen, dass sie selbst
durch Nachdenken ihr Program selbst schreibt, oder wir posten
eine fertige Loesung. Dann muss sie aber korrekt sein.

@Mary
OK. Du moechtest also haben, dass PortB, Pin3 auf 0 geht
(denn dann brennt die LED), wenn am PortD irgendein Bit
auf 0 gebracht wurde (0 bedeutet ja: Taster gedrueckt).

Kann man das so sagen? (Um mal deine etwas 'schwammige'
Formulierung zu praezisieren).

Hmm. Mal sehen. Wenn kein Bit am PortD auf 0 stehen darf,
bedeutet das doch, das dieser Port den Wert 0xFF haben muss.

D.h. Wenn du einfach testest ob dort 0xFF vorliegt
     Wenn ja:  PortB, Pin3 auf 1 (Led aus)
     Wenn nein: PortB, Pin3 auf 0 (Led ein)

Zum testen: Du holst dir den Wert in ein Register
und vergleichst dann das Register mit 0xFF

Kriegst Du das mit diesen Hinweisen hin?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens

Mary hat ganz am Anfang gesagt, dass sie das Tutorial durch
macht. Ich wette mit Dir um ein Bier, dass ihre Taster
gegen GND schalten.

Autor: HD_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens:

Danke für den Tip,
schreibe mal schnell ne Bewerbung für Microsoft

Stimmt schon umständlicher gehts wirklich kaum noch

Autor: Mary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,
danke für eure Antworten,leider hat es nicht geklappt.kann jemand mir
ein Vorschlag posten?

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, daß Dein Mega arbeitet?

Mach mal nach der Init folgendes Programmi:

Loop:
clr  r16           ;Temporäres Register löschen
sbis PinD, 0       ;hier den Taster dranne, der nach Masse geht
ldi  r16, 1        ;wenn Taster gedrückt, Temp.Reg auf 1 setzen
out  PortB, r16    ;auf LED-Port ausgeben
rjmp Loop          ;alles auf Anfang

Wenn Du jetzt an PortD, Bit 0 den Taster drückst, müßte an PortB, Bit 0
die LED an bzw. aus gehen. Wenn Du den Taster wieder losläßt, ändert die
LED wieder ihren Leuchtzstand. Wenn das Proggi geht, arbeitet zumindest
Dein Prozessor und Du kannst Dich größeren Aufgaben widmen. Für den
Anfang ist es gut, nach jeder neu geschriebenen Code-Zeile das Programm
erneut in den Prozessor zu laden und auszuprobieren. Dann merkt man
schnell, wenn man Mist gemacht hat ;-)

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.