Timer0 18F2550
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Timer (Assembler)  |  Timer0 18F2550 « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Timer0 18F2550  (Gelesen 3106 mal)
 
Rainer
Newbie
*
Offline Offline

Beiträge: 9


Profil anzeigen
« am: August 07, 2007, 21:21:01 »

Hallo,

Um den Timer zu verstehen habe ich den folgenden Code erstellt:

LIST P=18F2550         
#include <P18F2550.INC>
CONFIG     PLLDIV = 2
CONFIG     PWRT = ON           
CONFIG     BOR = OFF           
CONFIG     WDT = OFF           
CONFIG     LVP = OFF           




W_TEMP        equ    0x820           ; auch 0xA0
STATUS_TEMP    equ    0x821           ; registers for saving context
PCLATH_TEMP    equ    0x822
counter        equ    0x825           ; Misc counter


ORG    0x0800
goto   Start           
ORG   0x0808
goto   INT_SERV_ROUT


Start:

MOVLW B'000000'
MOVWF TRISA

MOVLW B'00000000'
MOVWF TRISB

clrf PORTA
clrf PORTB

; Timer einstellen
bsf    T0CON, 7
bsf    T0CON, 6       ; Timer0 is configured as an 8-bit timer/counter
bcf    T0CON, 5       ; interner Takt/4
bcf    T0CON, 3       ; Vorteiler am Timer0 erlauben
bsf    T0CON, 2       ; Vorteiler 1:64
bcf     T0CON, 1
bsf    T0CON, 0

bsf   INTCON,7         ;GIE
bsf    INTCON, 5       ;T0IE
bcf INTCON,2           ;TOIF

movlw   D'73'
movwf   TMR0L

goto Main

INT_SERV_ROUT:

bcf INTCON,7;global int disable
; Register retten
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS,W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using pages 1, 2 and/or 3
MOVWF PCLATH_TEMP ;Save PCLATH into W

bsf PORTA,0

movlw   D'73'
movwf   TMR0L

btfss INTCON,2
goto ENDE_ISR

incf   counter, f         ;counter eins hoch
bcf INTCON,2          ;TOIF löschen

ENDE_ISR:


;Register zurückretten
MOVF PCLATH_TEMP, W ;Restore PCLATH
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP,F ;Swap W_TEMP
SWAPF W_TEMP,W ;Swap W_TEMP into W

bsf INTCON,7;global int enable

bcf PORTA,0
retfie

Main
; Endlosschleife, in der counter ausgelesen wird
loop0
movf counter, 0
movwf PORTB
goto   loop0

end

Ich greife dann am PortB,0 das counter-Signal (erstes bit) ab, welches 1ms lang ist, also 1ms high, 1ms low usw.
Dieses Signal wird ja durch den counter in der Interruptroutine bzw durch den Timer0 erzeugt.
Das funktioniert soweit sauber.
Nur das Signal an PORTA,0 kommt absolut unregelmässig.
Es müsste doch eigentlich zeitl. parallel zu jeder Flanke der Rechtecke an PORTB,0 ein kurzer Impuls an PORTA,0 zu sehen sein. Das ist aber nicht der Fall, mal ist er da, mal nicht. Ach ja, Den Takt erhält der Pic durch einen 8MHz-Quarz.

Wie kommt das bzw was mache ich falsch?
Würde mich sehr über Eure Ideen freuen.

Viele Grüsse
Gespeichert
Hagi
Full Member
***
Offline Offline

Beiträge: 201


Profil anzeigen WWW
« Antworten #1 am: August 08, 2007, 07:27:22 »

Bitte setze die Konstanten aus der Include-Datei ein, sonst kann es dir passieren das niemand dein Programm analysiert weil es schwer lesbar ist.
Ein bsf   INTCON,GIE         ;GIE
liest sich besser als ein bsf   INTCON,7         ;GIE

In der ISR-Routine kann das zwischenspeichern der Register wegfallen, da dies automatisch geschieht. Du mußt dann die ISR-Routine mit retfie, FAST beenden (Kapitel 5.1.3 im Datenblatt).

In der ISR-Routine mußt du das GIE-Bit nicht behandeln, das macht der PIC automatisch. Einen Interrupt im Interrupt gibt es nicht.
 
Der Zugriff auf Port-Ausgänge sollte über die LAT-Register und nicht über die PORT-Register erfolgen (z.B. bsf LATA,0).

Deine Variablen befinden sich im Bereich 0x0820...0x0825.
Dir ist schon klar das deine 2K-RAM bei 0x07FF enden?
Aber dann greifst du auf das ACCESS-RAM zu, das den Bereich 0x00...0xFF unterstützt. (genauer 0x0000..0x005F und 0x0F60...0x0FFF, aber davon merkst nichts das Regelt der PIC intern).


Dein Code sieht so aus als ob du mit aller Macht ein Programm vom PIC16Fxxx nach PC18Fxxx übersetzen willst, aber das Datenblatt zum neuen PIC noch nicht gelesen hast.
« Letzte Änderung: August 08, 2007, 07:39:34 von Hagi » Gespeichert

Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #2 am: August 08, 2007, 11:55:55 »

Hallo Rainer,

so wie es aussieht hast du in PORTA die Analog-Funktionen nicht deaktiviert.
Im Datasheet steht dazu folgendes:

Code:
   CLRF PORTA ; Initialize PORTA by
              ; clearing output
              ; data latches
   CLRF LATA    ; Alternate method
                ; to clear output
                ; data latches
   MOVLW 0Fh    ; Configure A/D
   MOVWF ADCON1 ; for digital inputs
   MOVLW 07h    ; Configure comparators
   MOVWF CMCON  ; for digital input
   MOVLW 0CFh   ; Value used to
                ; initialize data       -Edit: In deinem Fall -> movlw 0x00
                ; direction
   MOVWF TRISA  ; Set RA<3:0> as inputs -Edit: setzt alle PortA auf Output
                ; RA<5:4> as outputs

Edit: Das gilt auch wenn die Port-Pins als Ausgänge verwendet werden.

Gruss,
Edson
« Letzte Änderung: August 08, 2007, 20:25:58 von Edson » Gespeichert
Rainer
Newbie
*
Offline Offline

Beiträge: 9


Profil anzeigen
« Antworten #3 am: August 17, 2007, 10:29:57 »

Hallo Hagi und Edson,

erstmal vielen Dank für Eure prima Antworten.
Es hat sich mittlerweile herausgestellt, dass mein Code doch richtig funktioniert. Ich hatte nur die Osco-Signale falsch interpretiert ;-)

@Hagi
Ohne das Datenblatt gelesen zu haben, hätte ich gar nicht gewagt, hier zu posten :-)
Es gibt leider so wenig Assembler-Code zum 18F2550, dass man am Datenblatt nicht vorbeikommt...
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.038 Sekunden mit 18 Zugriffen.
 
Top! Top!