-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Anfängerfrage

  1. #1

    Anfängerfrage

    Anzeige

    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.
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.05.2007
    Beiträge
    191
    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

  3. #3
    Zitat Zitat von MichaelM
    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.

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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.05.2007
    Beiträge
    191
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    15.09.2007
    Alter
    25
    Beiträge
    15
    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

  7. #7
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    310
    @ 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é

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.09.2007
    Alter
    25
    Beiträge
    15
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.05.2007
    Beiträge
    191
    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

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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •