PDA

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

Jojo12
22.09.2007, 11:23
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

Andre_S
22.09.2007, 12:12
@ 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é

Jojo12
22.09.2007, 12:44
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.

Andre_S
23.09.2007, 15:40
@Raptor42"

stelle doch noch mal Dein abgeändertes Programm hier rein, dann kann man sicher mehr sagen...


Gruß André