Gast
#59957
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
|
Anzeige
|
Warum funktioniert das nicht?
Gast
#59957
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
Gast
#59958
Ich! Gruß, Frank
Gast
#59959
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
Gast
#59960
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.
Gast
#59961
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.
Gast
#59962
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
Gast
#59963
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
Gast
#59964
... oder beides trifft zu. Gruß, Frank
Gast
#59965
Ach so, dann wird cpse sowas heissen wie, wenn gleich dann nächste Zeile überspringen...dann wird mein Vorschlag wohl noch weniger funktionieren :) Nik
Gast
#59966
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.
Gast
#59967
CPSE = ComPare and Skip if Equal, oder so ähnlich.
Gast
#59968
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.
Gast
#59969
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.
Gast
#59970
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.
Gast
#59971
Hi Mit Word kann ich leider nichts anfangen. Plain-ASCII oder PDF. Matthias
Gast
#59972
Wut verflogen... Setz mal in der Initialisierung PORTD auf 0xff.
Gast
#59973
Bin noch auf der Arbeit, mache ich aber sofort wenn ich wieder zu hause bin. Danke.Ich hoffe das geht. Vitali.
Gast
#59974
@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?
Gast
#59975
stimmt, Programm muss überarbeitet werden.
Gast
#59976
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
Gast
#59977
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.
Gast
#59978
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.
Gast
#59979
Danke Leute,das leuchtet mir jetzt ein. Ich werde es heute Abend ausprobieren. Gruss. Vitali.
Gast
#59980
Hallo... jmp sub2 ?? oder rjmp sub1 ? Bit- & Bytebruch... - ...HanneS...
Gast
#59981
Hallo noch mal, ich danke euch für die Tipps, habe gestern abend das Programm noch mal überarbeitet und es funktioniert einwandfrei. Gruss. Vitali. Antwort schreiben |
Anzeige
|