Forum: Mikrocontroller und Digitale Elektronik Warum funktioniert das nicht?


von Vitali Tscheroun (Gast)


Lesenswert?

Hallo Leute,
wer kann mir sagen warum dieses Programm in meinem AVR (AT90S4433)
nicht funktioniert?

Gruss.
Vitali.

loop:
      in r16, PIND
            ldi r17,0x1
            cpse r16,r17
      rjmp loop
      cbi PORTB,1         ;LED 1 ein
      rjmp loop

von Frank Linde (Gast)


Lesenswert?

Ich!

Gruß, Frank

von Frank Linde (Gast)


Lesenswert?

Ach, so, so wäre es richtiger und kürzer:

LOOP:
  sbis  PIND, 1  ; Wert hängt davon ab, welchen Pin Du benutzt
  rjmp  LOOP
  cbi  PORTB, 1

Dein Programm verläßt die LOOP-Schleife nie.

Gruß, Frank

von Vitali Tscheroun (Gast)


Lesenswert?

Nein,das Problem ist, das die LED nich angeht.
Es ist ja nicht das ganze Programm,nur ein Ausschnitt.
Der Befehl "cpse" wird nicht ausgeführt,aber warum?
Gruss.
Vitali.

von crazy horse (Gast)


Lesenswert?

woher soll hier jemand wissen, was du in r16 einliest? Ausgeführt wird
cpse natürlich, allerdings eben nicht das überspringen. Und das heist,
du liest nicht 0x01 ein.

von Nik Bamert (Gast)


Lesenswert?

hi!

ich hab zwar keine Ahnung von Assembler, aber könnte es so
funktionieren? :
;*****************************************************
loop:
      in r16, PIND
            ldi r17,0x1
            cpse r16,r17
                     ;hier rjmp auslassen
      cbi PORTB,1         ;LED 1 ein
      rjmp loop
;******************************************************

MFG Nik

von Frank Linde (Gast)


Lesenswert?

Sorry, meine Aussage war in der Tat nicht vollständig. Also, entweder
liest Du in r16 keine 1 ein und damit wird die Schleife nie verlassen
oder Deine LED wird nicht mit Low-Pegel, sondern mit High-Pegel
eingeschaltet (also CBI durch SBI ersetzen).

Gruß, Frank

von Frank Linde (Gast)


Lesenswert?

... oder beides trifft zu.

Gruß, Frank

von Nik Bamert (Gast)


Lesenswert?

Ach so, dann wird cpse sowas heissen wie, wenn gleich dann nächste Zeile
überspringen...dann wird mein Vorschlag wohl noch weniger funktionieren
:)

Nik

von Vitali Tscheroun (Gast)


Lesenswert?

Ich lese schon das richtige ein,mein Problem ist das die ganze
Geschichte im AVR-Simulator funktioniert,bloss nicht im AVR.
Nik,ich glaube wenn ich rjmp auslasse dann macht er mir die LED sifort
an,die soll aber erst dann angehen wenn r16 gleich r17 ist,also
wenn bit 1 an PIND gesetzt ist.

Vitali.

von Frank Linde (Gast)


Lesenswert?

CPSE = ComPare and Skip if Equal, oder so ähnlich.

von Vitali Tscheroun (Gast)


Lesenswert?

Also ich habe schon alles ausprobiert,hi und lo Pegel getauscht u.s.w.
Es tut sich einfach nichts,im Simulator funktionierts aber,ich weiss
auch nicht,am AVR kanns nicht liegen,den habe ich auch schon
getauscht.

Vitali.

von crazy horse (Gast)


Lesenswert?

Es ist doch zum junge Hunde kriegen :-(
Dann setz doch verdammt noch mal den vollständigen Code hier rein, ist
das so schwierig? Da kann man doch wirklich die Lust verlieren.
Immer wieder dasselbe Theater, thread geschlossen für mich.

von Vitali Tscheroun (Gast)


Angehängte Dateien:

Lesenswert?

Kein Problem,also in der Datei ist der vollständige Code.
Wenn taste 1 gedrückt wird,leuchtet led 1,wenn taste 2 gedrückt wird
erlischt die und das gleiche mit anderen leds bloss mit anderer
tastenkombination.
Vitali.

von Matthias (Gast)


Lesenswert?

Hi

Mit Word kann ich leider nichts anfangen. Plain-ASCII oder PDF.

Matthias

von crazy horse (Gast)


Lesenswert?

Wut verflogen...
Setz mal in der Initialisierung PORTD auf 0xff.

von Vitali Tscheroun (Gast)


Lesenswert?

Bin noch auf der Arbeit, mache ich aber sofort wenn ich wieder zu hause
bin.
Danke.Ich hoffe das geht.
Vitali.

von thkais (Gast)


Lesenswert?

@crazy horse: Gute Idee, ich denke auch, daß die Eingänge nicht auf
definierten Pegeln liegen. Aber die Pull-Ups ziehen alle Eingänge auf
"1" und da wird die Abfrage mit "0x1" auch nicht funktionieren, da
Bit 1-7 auf low liegen müssen.
@Vitali: Bei der Abfrage mit cpse mußt Du alle 8 Pins des PORTD auf
definierte Pegel legen. Wie sieht Deine Hardware aus?

von crazy horse (Gast)


Lesenswert?

stimmt, Programm muss überarbeitet werden.

von Vitali Tscheroun (Gast)


Lesenswert?

Was die Hardware betrifft,habe ich das STK 500.
Habe gestern abend und auch heute schon alles probiert,geht aber
nicht.
thkais: was meinst du genau mit definierte Pegel?

Vitali

von thkais (Gast)


Lesenswert?

Wenn Du einen Port-Pin des Controllers als Eingang definierst, wird er
hochohmig. Das wiederum bedeutet, daß er alle möglichen Einstreuungen
einfängt. Wenn Du nun mit "0x01" vergleichst, muß Pin 0 des
Eingangsports auf logisch "1" und alle anderen Bits auf logisch "0"
liegen. Hast Du beispielsweise einen der Port-Pins nich beschaltet bzw.
auf definiertem Pegel (GND oder VCC) liegen, wird diese Bedingung nie
erfüllt. Im Simulator kannst Du die Pegel der Portpins einfach mit
einem Häkchen ändern - in der Realität sieht das anders aus.

von crazy horse (Gast)


Lesenswert?

Ergänzung: die aktivierten pullups (PORTx=0xff) bewirken, dass der
ansonsten offenen Eingang H-Pegel bekommt, ein Schalter nach Masse
bewirkt dann einen L-Pegel (beim STK500 ist das so, falls du diese
Schalter nimmst).
Dein Programm müsste dementsprechend so aussehen:
sub1:
in r16, PIND
ldi r17,0b11111110  //!!!!!!!!!!
cpse r16,r17
jmp sub2
cbi PORTB,1         ;LED 1 ein
rjmp loop

Das ist der ganz Knackpunkt.

von Vitali Tscheroun (Gast)


Lesenswert?

Danke Leute,das leuchtet mir jetzt ein.
Ich werde es heute Abend ausprobieren.
Gruss.
Vitali.

von Hannes Lux (Gast)


Lesenswert?

Hallo...

jmp sub2 ??
oder
rjmp sub1  ?

Bit- & Bytebruch... - ...HanneS...

von Vitali Tscheroun (Gast)


Lesenswert?

Hallo noch mal,
ich danke euch für die Tipps,
habe gestern abend das Programm noch mal überarbeitet und es
funktioniert einwandfrei.

Gruss.
Vitali.

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.