Forum: Mikrocontroller und Digitale Elektronik PIC16F627A assembler: PORTA verhält sich bei XOR nicht wie


von Simon A. (moony) Benutzerseite


Lesenswert?

hallo,
ich habe hier einen interrupt timer. jede sekunde sollten die ausgänge 
von porta und portb von 0 auf 1 gehen und dann umgekehrt.
mit portb klappt das auch aber bei porta bleibt (ich teste das mit einer 
led) der ausgang mal ein paar durchgänge auf 1 und wechselt nur 
manchmal, scheinbar willkürlich, wieder auf 0 und bleibt dann wieder 
einige durchgänge so.
kann mir jemand sagen, wo der fehler liegt? ich habe den verdacht, dass 
mit der config was nicht stimmen könnte, komme aber nicht weiter.


von Otto (Gast)


Lesenswert?

Hallo Simon B.,

poste mal das Programm - sonst wird es schwierig.

Otto

von Simon A. (moony) Benutzerseite


Angehängte Dateien:

Lesenswert?

sorry, dachte ich hätte es angehängt.

von FRAGENSTELLER (Gast)


Lesenswert?

in deinem listing ist die rede von einem '16f84' du betreibst aber laut 
deinen angaben einen '16f627' sind die beiden den kompatibel?

von Franko P. (sgssn)


Lesenswert?

Meist fehlt das hier:

movlw  7
movwf  CMCON  ;PortA nur digital, Comparator off


Gerhard

von Simon A. (moony) Benutzerseite


Lesenswert?

danke für die antworten. ich weiß nicht genau in wie weit 16f84 und 
16f627a kompatibel sind aber ich habe die config so gut ich konnte 
angepasst.
die comperatoren ausschalten hat leider auch nichts bewirkt. ich habe es 
auch an verschiedenen stellen im code versucht oder muss es an eine ganz 
bestimmte?
ich habe es auch mit "CMCON  EQU  H'001F'" probiert, ging auch nicht.

von Timo Z. (typic)


Lesenswert?

Hi
Du redest von Interrupt Timer
Wenn du interrupts machst  gibt es folgendes zu beachten:

- Du musst am Anfang deiner Interrupt- Routine das Arbeitsregister und 
die    Flags sichern und am Ende der Routine sie wieder zurückladen, 
sonst gibt's Verwirrungen zwischen Interrupt und Main-Programm.


Für einen 16F627a beginn in deiner Routine einfach mit

    movwf   w_temp
    swapf   STATUS,w
    bcf     STATUS, RP0       ; status_temp in Bank 0
    movwf   status_temp

und ende deine Routine so:

    swapf   status_temp,w
    movwf   STATUS
    swapf   w_temp,f
    swapf   w_temp,w
    retfie

- Du musst das zugehöhrige Flag-Bit wieder auf "0" setzen. Sonst wird 
gleich nach dem Ende des Interrupts ein neuer Interrupt erzeugt.

- Wichtig ist auch das du die richtigen Voreinstellunge für einen 
Interrupt  gemacht hast.
Schau dir im Datasheet noch mal alle Register genau an !!

Hoffentlich hilft's dir was !!

von moony (Gast)


Lesenswert?

hallo,
danke für die antwort. ich hab im interrupt init die zeile "bcf STATUS, 
RP0" hinzugefügt und am interrupt ende "movw status_temp,w" mit "swapf 
..." vertauscht, am verhalten von porta hat das leider nichts geändert.
der timer ist jetzt jedoch langsamer geworden, ungefähr halb so schnell.
ich werd wohl doch das datenblatt nochmal genau lesen müssen :)

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.