www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer beim PIC 16f877


Autor: PVT Paula (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin noch ein frischling was das Programmieren bei Assembler angeht. 
ich habe mir mit mühe und not ein Programm geschrieben (es versucht. Es 
soll eigentlich ein Lauflicht werden der durch den timer gesteuert 
werden...sprich ca 0,5 sekunden bevor die LED weiter spricht. Leider 
klappt es bei mir Null.... ich danke schon einmal im voraus:

    list p=16f877                ;der Prozessortyp wird festgelegt
   include "p16f877.inc"
;  __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC & _LVP_OFF


  udata
  countint EQU    0x23


; -----------------------------------------------------------------
; Interruptvektortabelle
; -----------------------------------------------------------------
 org 0x000               ; RESET-Vektor
    goto start
 org 0x0004             ; Interruptvektor
    goto ISR           ; Sprung zu Interruptserviceroutine
;
;  org  b'00000000'


start:

    movlw  b'00000000'      ;alle Bits Port C Ausgänge
    bsf    STATUS, RP0      ; umschalten auf Bank 1
    bcf    STATUS, RP1      ; umschalten auf Bank 1
    movwf  TRISC
    bcf   OPTION_REG,5     ; interner Clock fuer Timer0
    bcf    OPTION_REG,0     ; Vorteiler fuer Timer0 ein
    bcf   OPTION_REG,1     ; Vorteilerbit0 = 0
    bcf   OPTION_REG,0     ; Vorteilerbit1 = 0
    bsf   OPTION_REG,1     ; Vorteilerbit2 = 1
                  ; -> 1MHz : 32 : 125 = 250Hz -> 4ms

    bcf    STATUS, RP0          ;umschalten auf Bank0
    movlw D'198'         ; Vorladen des Zaelregisters Timer0
    movwf   TMR0
    movlw D'187'         ; Vorladen des Interruptzaehlers
    movwf   countint
    bsf   INTCON,2      ; Timer0 Overflow ein
    bsf   INTCON,5      ; alle Interrupts ein

    movlw  b'00000001'
    movwf  PORTC
    bcf   STATUS,C       ; loesche Carry-Flag im STATUS
                  ; Register (noetig fuer rrf)
main:
    rlf   PORTC,1        ; Rotiere links ueber Carry
    call   ISR

    goto  main        ; Ruecksprung zu main


;----------------------------------------------------------------------- 
-
ISR:
    movlw D'198'         ; Reloadwert fuer Zaelregister Timer0 nach w
    movwf   TMR0         ; w nach TMR0
    decfsz   countint,0      ; Interruptereignisse zaehlen
    goto  isr1         ; solange Interruptzaehler != 0
                  ; sonst ->
    movf   PORTC,         ; Status PORTB einlesen

    movwf   PORTC         ; Ausgabe auf PORTB
    movlw D'187'         ; Vorladen des Interruptzaehlers
    movwf   countint

isr1:
    bcf   INTCON,1      ;Iterruptflag zurücksetzen
    retfie             ; Return from Interrupt
 end                             ;das Ende des Programms

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also als erstes fällt auf, dass du in der Main die ISR aufrufst, das 
darf nicht sein. Die wird ja durch den IRQ selbst aufgerufen.
Das Bitschieben kannst du in dem Fall auch in die ISR auslagern, sonst 
schiebt er ja in der Main ständig durch.
Das wäre auch besser gelöst über eine Variable im RAM, die du schiebst 
und dann komplett auf den Ausgang schreibst.
Beachte auch, dass du das Carry durchschiebst, dessen Zustand musst du 
explizit setzen/löschen.
In deiner Main bleibt also zunächst nichts übrig.

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. die Config-Bits sind auskommentiert

2. als Anfänger würde ich das erst mal ohne Interrupt machen:

loop
   Bit setzen,
   warten
   Bit schieben
   zurück zu loop

Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der ISR noch die Register sichern..

Autor: PVT Paula (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soll in main auch das "goto" weggenommen werden?

Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne, dann hast du ja keine Endlosschleife mehr =)

Autor: PVT Paula (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oke ich hatte mich auch schon gewundert

Autor: PVT PAULA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich hab das mitlerweile auch hinbekommen....ich habe es zwar 
allgemein jetzt etwas anderes aufgebaut aber es funktionier auch dank 
eurer hilfe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.