PIC16F627A assembler: PORTA verhält sich bei XOR nicht wie

OP Persönliche Seite #521244
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.

OP Persönliche Seite #521428
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.
#522566
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 !!
Gast #524738
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren