Forum: Mikrocontroller und Digitale Elektronik LED schalten mit atmega32


von Franz (Gast)


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:
1
include "m32def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
2
 
3
         ldi r16, 0xFF
4
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
                           ; Richtungsregister DDRB als Ausgang konfigurieren
6
         ldi r16, 0x00
7
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
                           ; Richtungsregister DDRD als Eingang konfigurieren
9
10
loop:
11
            sbic PIND, 1
12
      in r16, 1
13
14
      sbis PIND, 1
15
    in r16, 0
16
  
17
18
     out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
19
         
20
     rjmp loop

von gast (Gast)


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

von Franz (Gast)


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.

von Daniel P. (polzi)


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

von spess53 (Gast)


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

von Daniel P. (polzi)


Lesenswert?

sag ich ja^^

von Matthias L. (Gast)


Lesenswert?

Die Aufgabe ist gelöst.

Eins setzen.

von Daniel P. (polzi)


Lesenswert?

Danke, danke^^

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

von Franz (Gast)


Lesenswert?

Danke für die Antworten.

So, ich habe den Code verbessert.

Aber leider funktionier das immer noch nicht.

Franz
1
loop:
2
            sbic PIND, 1
3
      ldi r16, 1
4
5
      sbis PIND, 1
6
    ldi r16, 0
7
  
8
9
     out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
10
         
11
     rjmp loop

von Peter R. (gelb)


Lesenswert?

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

Grüße, Peter

von Matthias L. (Gast)


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!

von Daniel P. (polzi)


Lesenswert?

Vergiss es :-)

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.