Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfrage
Raptor42
20.09.2007, 21:29
Hi, ich arbeite mich gerade in PICs ein und werd euch wahrscienlich noch öfter nerven ^^'
Jedenfalls hab ich mich jetzt über ein Jahr bei sprut durchgekämpft und gehe langsam in die ersten praktischen Versuche undversuchedas was ich da mache auch 100% zu verstehen weil es meiner Meinung nach die beste Methode ist was zu lernen.
Ich hab mir das rotary encoder Lernbeispiel von Sprut auf nen 16F628A gebrannt und so verändert das man mit dem encoder ein lauflicht am PortB steuern kann (wenn man am encoder dreht, wandert ein Licht über die LEDs an PortB)
Dabei hab ich nur ein Problem. Wenn das Licht quasi aus dem LED Bereich raus wandert kommt es nicht wieder und es tut sich garnix mehr an dne LEDs, egal wie ich am encoder rumkurbel. eigentlich müsste es ja ins Carryflag wandern und dann auf der anderen Seite wieder auftauchen. Das tut es aber nicht. Ich bin den Code mehrmals durchgegangen, konnte aber keinen Fehler oder irgendeinen anderen Befehl der das Carry Flag nutzt und mir mein Licht evtl löscht finden. Ich hoffe ihr könnt mir sagen was da falsch läuft.
MichaelM
20.09.2007, 21:57
Hallo,
im Hauptprogramm wird das Unterprogramm zum Lesen des Encoders aufgerufen. In diesem Programm taucht die Zeile
andwf neu, f ; nur 2 LSB stehen lassen
auf. An dieser Stelle wird das CY-Flag verändert. Lösung: Teste vor dem Aufruf des Unterprogramms das CY-Flag und speichere es in einem Register zwischen. Wenn du aus dem Unterprogramm zurückkommst stellst du den alten Zustand wieder her und rotierst erst dann den PORTB. Es könnte bei solchen Konstellationen übrigens auch vorkommen, dass sich die Lichtpunkte "vermehren".
Gruß,
Michael
Raptor42
21.09.2007, 18:05
Es könnte bei solchen Konstellationen übrigens auch vorkommen, dass sich die Lichtpunkte "vermehren".
Gruß,
Michael
Na dann ist das mit dem künstlichem Leben ja doch garnicht so schwer ;P
Ne... Danke für die Hilfe. Ich werd das sofort mal ausprobieren wenn ich Zuhause bin. O:)
Raptor42
21.09.2007, 21:55
Erm.. ist mit dem CY Flag das Digit Carry Flag gemeint oder das normale Carryflag?
Hm, ich hab mal verrsucht das Statusregister am Anfang des Unterprogramms komplett in einer Speicherzelle zu sichern und vorm verscheiben des Lichts wider her zu stellen, krieg dann aber beim assemblierne shcon 3 Fehler die ich nicht finde.
Hätte da evtl jemand ein Beispiel oder könnte mir sagen welcher Code an welche Stelle muss.
MichaelM
21.09.2007, 22:15
Hallo,
ich meine das Carry-flag (STATUS,C). Das komplette Statusregister kann man sichern, macht man schließlich bei einem Interrupt auch. Wenn es dir auf das Z-Flag nicht ankommt geht das ganz einfach mit
movf STATUS,0
movwf 30h
und rückstellen mit
movf 30h,0
movwf STATUS
Ich hätte evtl. mit btfsc / btfss bzw. bsf / bcf etwas zusammengebaut. Hierbei werden nämlich keine Flags verändert, auch das W-Registter bleibt unberührt. Beim Assemblieren dürfen eigentlich keine Fehler auftreten, hast du evtl. vergessen die Speicheerzelle zu deklarieren (mit #define bzw. equ)?
Gruß,
Michael
Hallo,
ich hab mir den Code mal angeguckt. Ich hab auch die Fehler endeckt:
;Hauptprogrammschleife
abfragen
movfw counter
read_encoder
movfw encoder
movfw neu ; wurde der encoder bewegt?
movfw alt
movfw neu
weiter
movfw neu
Solche Befehle gibt es meiner Meinung nach gar nicht.
Ich verwende diesen Befehl:
;Hauptprogrammschleife
abfragen
movf counter,0
und so weiter.Vielleicht hilft dir das ja weiter.
Gruß,
Johann
@ Jojo12
Michael hat doch den eigentlichen Fehler schon ganz genau erkannt und auch die passenden Hilfestellungen gegeben.
Bring doch jetzt nicht unnötig Unruhe rein, was meinst Du eigentlich mit "diese Befehle gibt es gar nicht"?
Gruß André
Hab noch nie solche Befehle gesehen oder von solchen Befehlen gehört.
Hätte ja sein können, das daher die drei unbekannten Befehle kommen.
Sonst hat Michael natürlich recht.
Gruß,
Johann
MichaelM
22.09.2007, 13:29
Hallo,
@ Jojo12:
fast richtig, solche Befehle gibt es nicht, der Assembler wandelt diese aber um. So wird z.B. aus
moffw x = movf x,0
Weitere Beispiele bigt es bei www.sprut.de unter "Pseudo-Assemblerbefehle".
Gruß,
Michael
Raptor42
23.09.2007, 13:16
Hat alles nix gebracht aber Danke trotzdem für die Hilfe erstmal.
Die Speicherzelle hab ich ja per
temp2 equ 0x25
deklariert und sie seitdem auch immer als temp2 im Code benannt.
Ansonsten fällt mir auch net mehr ein.
Ich weiß es langsam selber nicht mehr aber irgendwo dran muss es ja liegen.
Jedenfalls probier ich mal a bisl weiter und evtl find ich ja noch was.
@Raptor42"
stelle doch noch mal Dein abgeändertes Programm hier rein, dann kann man sicher mehr sagen...
Gruß André
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.