Timer 0 und 2 machen komische sachen Mega 16

Gast #884312
Lesenswert?
• ▲
▼
Im Simulator macht Timer 0 und Timer 2 Komische probleme.
1
      .include "m16def.inc"
2

3
      .def SREGbuf = R2
4
      .def tempL   = R16
5
      .def tempH   = R17
6
      .def PUF0    = R18
7
      .def PUF1    = R19
8
      .def Spalte  = R20
9
      .def Zeile   = R23
10
      .def Flag    = R21
11
      .def Flag2   = R22
12
      .def zaehl   = R24
13

14

15

16

17

18

19
      .equ VTimeL = 0xB0
20
      .equ VTimeH = 0xB1
21
      .equ HTimeL =  0xB2
22
      .equ HTimeH =  0xB7
23
      .equ VorzeitL = 0xB3  ;ergebniss
24
      .equ VorzeitH = 0xB4
25
      .equ SpaltenzeitL = 0xB5
26
      .equ SpaltenzeitH = 0xB6
27
      .equ SpaltenzeitL1 = 0xCE
28
      .equ SpaltenzeitH1 = 0xCF
29
      .equ zeileL = 0xBA
30
      .equ zeileH = 0xBB
31
      .equ Startzeile_HI_0 = 0xBC
32
      .equ Startzeile_LO_0 = 0xBD
33
      .equ Startzeile_HI_1 = 0xBE
34
      .equ Startzeile_LO_1 = 0xBF
35
      .equ Startzeile_HI_2 = 0xC0
36
      .equ Startzeile_LO_2 = 0xC1
37
      .equ Startzeile_HI_3 = 0xC2
38
      .equ Startzeile_LO_3 = 0xC3
39
      .equ Startzeile_HI_4 = 0xC4
40
      .equ Startzeile_LO_4 = 0xC5
41

42

43

44
      ;*********************************************************************
45

46
      #define Master_Dimm    255
47

48
              /* ****set interrupt-routines */
49

50
       .org $0
51
        rjmp reset                                                         /* reset vector address */
52

53

54

55

56
    
57

58
      reset:
59

60
      cli
61

62

63
      /* ***** set stackpointer */
64
      ldi      tempL,  low(RAMEND)
65
      ldi      tempH, high(RAMEND)
66
      out      SPL,tempL
67
      out      SPH,tempH
68

69
      
70
      sei
71
            
72

73

74
      
75

76

77
      
78
      main:    
79
               ldi templ,low(360)
80
           ldi temph,high(360)
81
           sts vtimel,templ
82
           sts vtimeh,temph
83
      
84
    VZ:         lds  tempH,vtimeH
85
    Ltime1:     lds  tempL,vtimeL
86
    vzeit2:     out  OCR2,templ        ;Timer mit Match L Wert laden
87
          clr  templ
88
          out  TCNT2,templ       ; 
89
    
90

91
        wtt:        ldi  tempL, (0<<CS02)|(0<<CS01)|(1<<CS00)
92
          out  TCCR2, tempL          ; Timer Start nach Match wieder von vorn
93
    vzeit:      in   templ,TIFR
94
          andi templ,0b10000000
95
          sbrs templ,OCF2             ;OCF0
96
          rjmp vzeit
97
          ori  templ,(1<<OCF2)     
98
          out  TIFR,templ
99
          cpi  temph,0
100
          breq out_tim0
101
          ldi  templ,0xff
102
          dec  temph
103
          rjmp vzeit2
104
    out_tim0:   ldi  tempL, (0<<CS02)|(0<<CS01)|(0<<CS00) ; Timer Stop
105
          out  TCCR2, templ 
106

107

108

109

110

111

112

113
           
114

115

116
      rjmp   main

keine Ahnung woran das liegt beim ersten durchlauf ist alles OK aber 
beim zweiten wird das OCF2 Flag schon bei ca. 10 ausgelöst und nicht bei 
255.
#885755
Lesenswert?
• ▲
▼
René Schink wrote:
> in templ,TIFR
> ori  templ,(1<<OCF2)
> out  TIFR,templ
>
> sollte besser sein.
> Oder Nicht?
Nein! Interrupt-Flags werden nicht mit Read-Modify-Write gelöscht, 
sondern im direkten Zugriff. Einfach
1
ldi temp, (1 << OCF2)
2
out TIFR, temp
Wenn Du maskierst, werden alle anderen Flags, die beim Lesen von TIFR 
gesetzt sind, gelöscht. Und genau das will man eigentlich normalerweise 
nicht. Interrupt-Flags immer direkt schreiben. Eine Null hat schließlich 
keinen Einfluss auf den Zustand des Flags.

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