Forum: Mikrocontroller und Digitale Elektronik Timer 0 und 2 machen komische sachen Mega 16


von René (Gast)


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.

von Martin (Gast)


Lesenswert?

also bei mir funktioniert die simulation. versuch mal, dein programm 
etwas zu stukturieren, dann kannste eventuelle Fehler leichter finden.

von Otto (Gast)


Lesenswert?

Die Interruptvektoren fehlen.....

Gruss Otto

von Andreas K. (a-k)


Lesenswert?

Wenn er keine Interrupts verwendet, braucht er auch keine Vektoren.

von Otto (Gast)


Lesenswert?

ach - und deshalb auch das "sei"....

Gruss Otto

von R--- S. (rene66)


Lesenswert?

ori  templ,(1<<OCF2)
out  TIFR,templ

ich glaube das war das Problem da ich auch noch den Timer 1 mit  nutze 
und ich das register anspreche ohne mir vorher TIFR zu maskieren.

also

in templ,TIFR
ori  templ,(1<<OCF2)
out  TIFR,templ

sollte besser sein.
Oder Nicht?

von Johannes M. (johnny-m)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.