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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.