www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED schalten mit atmega32


Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mit einem atmega32 eine LED schalten.
Das ganze soll in Assembler geschieben werden, es sollen die Kommandos 
sbis und sbic genutzt werden.

Der Eingangspin soll der Pin 1 von PortD sein.

Leider leuchtet die LED an PortB die ganze Zeit, es wird nicht 
geschaltet.
Wo ist der Fehler?

Franz

Hier der Code:
include "m32def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
 
         ldi r16, 0xFF
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins
                           ; Richtungsregister DDRB als Ausgang konfigurieren
         ldi r16, 0x00
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins
                           ; Richtungsregister DDRD als Eingang konfigurieren

loop:
            sbic PIND, 1
      in r16, 1

      sbis PIND, 1
    in r16, 0
  

     out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
         
     rjmp loop   

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich programmiere zwar nicht in assambler, aber ich sehe schon das du die 
led an und ausschlatest. da dein auge aber viel zu träge ist dies 
wahrzunehmen, sihet es für dich so aus als wäre die led ständig an.
mach das am bestem im timer un taggel das bin aller 1s oder so

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich glaube daran liegt das nicht:
Ist PinD,1 auf 0, dann wird immer wieder hintereinander " sbis PIND, 1
    in r16, 0" durchgeführt, ansonsten das andere Kommando.

Autor: Daniel P. (polzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das sollte doch heißen:

ldi r16, 0b11111110


statt:

in r16, 1



EDIT: Oder so^^ Ich kenne ja die schaltung und den Zweck nicht. Aber 
"in" geht doch nur von Port nach Register, nicht um eine Zahl in ein 
Register zu schreiben...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

in r16, 1          ???
sbis PIND, 1
in r16, 0          ???

Das heisst einmal 'in r16, TWSR' und 'in r16, TWBR'. Aber das willst du 
nicht wirklich. Was sollen die beiden Zeilen bezwecken? 'in'-Befehle 
sind zu Lesen von IO-Registern. Wenn du ein Register mit einem Wert 
laden willst, musst du z.B. 'ldi r16, 1' benutzen.

MfG Spess

Autor: Daniel P. (polzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sag ich ja^^

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Aufgabe ist gelöst.

Eins setzen.

Autor: Daniel P. (polzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, danke^^

Wobei das jetzt eigentlich nicht gesagt ist. Vielleicht liegt der Fehler 
ja auch woanders. Man kann ja nie wissen... :-)

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten.

So, ich habe den Code verbessert.

Aber leider funktionier das immer noch nicht.

Franz
loop:
            sbic PIND, 1
      ldi r16, 1

      sbis PIND, 1
    ldi r16, 0
  

     out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
         
     rjmp loop   

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Eingang auf 0 ist, setzt du nicht auf 1 und umgekehrt. 
Vertausche die ldi-Befehle, dann gehts.

Grüße, Peter

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Eingangspin soll der Pin 1 von PortD sein.

Ha!

Der Pin Eins ist PB0, also musst du das schreiben:
sbic PIND, 0
...
sbis PIND, 0


Ich beanspruche die Eins selbst!

Autor: Daniel P. (polzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss es :-)

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.