File: timer_8bit_ctc.py

package info (click to toggle)
simulavr 1.0.0%2Bgit20160221.e53413b-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,740 kB
  • sloc: cpp: 35,491; python: 6,995; ansic: 3,567; makefile: 1,075; sh: 653; asm: 414; tcl: 320; javascript: 32
file content (112 lines) | stat: -rw-r--r-- 3,565 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from vcdtestutil import VCDTestCase, VCDTestLoader, mSec

class TestCase(VCDTestCase):
  
  p2irq = {
    "atmega128": "IRQ.VECTOR9",
    "atmega48":  "IRQ.VECTOR7",
  }
  p2pin = {
    "atmega128": "PORTB.B7-Out",
    "atmega48":  "PORTB.B3-Out",
  }
  ocra_value = 124
  prescaler = 64
  max_irq_delay = 6
  
  def setUp(self):
    self.getVCD()
    self.setClock(4000000)
    self.processor = self.getProcessorType()
    self.tcmp = self.p2irq[self.processor]
    self.pinName = self.p2pin[self.processor]
    
  def test_00(self):
    """simulation time [0..8ms]"""
    self.assertVCD()
    self.assertEqual(self.vcd.starttime, 0)
    self.assertEqual(self.vcd.endtime, 8 * mSec)
    
  def test_01(self):
    """init port and counter"""
    self.assertVCD()
    p = self.getVariable("TIMER2.TCNT")
    self.assertEqual(p.firstedge.intValue, 0)
    p = self.getVariable("TIMER2.OCRA")
    self.assertEqual(p.firstedge.intValue, self.ocra_value)
    p = self.getVariable(self.pinName)
    self.assertEqual(p.firstedge.intValue, 0)

  def test_02(self):
    """counter period = 2ms"""
    self.assertVCD()
    c = self.getVariable("TIMER2.Counter")
    c1 = c.firstedge
    tp = self.tClock * self.prescaler
    t0 = c1.internalTime - tp
    dtc = tp * (self.ocra_value + 1)
    self.assertEqual(c1.intValue, 1)
    c2 = c.getNextEdge(c1)
    self.assertEqual(c2.intValue, 2)
    self.assertEqual(c2.internalTime - c1.internalTime, tp)
      
  def test_03(self):
    """counter mode: count OCRA, then 0"""
    self.assertVCD()
    c = self.getVariable("TIMER2.Counter")
    c1 = c.firstedge
    tp = self.tClock * self.prescaler
    t0 = c1.internalTime - tp
    dtc = tp * (self.ocra_value + 1)
    c2 = c.getNextEdge(t0 + dtc)
    self.assertEqual(c2.intValue, 0)
        
  def test_04(self):
    """check occurence of OCIE2 interrupt"""
    self.assertVCD()
    ctr = self.getVariable("TIMER2.Counter")
    tp = self.tClock * self.prescaler
    t0 = ctr.firstedge.internalTime - tp
    dtc = tp * (self.ocra_value + 1)
    idelay = self.max_irq_delay * self.tClock
    irq = self.getVariable(self.tcmp)
    # first overflow
    t = t0 + dtc
    ce = ctr.getNextEdge(t)
    self.assertEqual(ce.internalTime, t)
    self.assertEqual(ce.intValue, 0)
    # check, when interrupt occurs
    ie = irq.getNextEdge(t)
    self.assertEqual(ie.intValue, 1)
    self.assertTrue(ie.internalTime <= (t + idelay), "OCIE2 occured to late")
    # seek next OCIE2
    ie = irq.getNextEdge(irq.getNextEdge(ie))
    self.assertTrue(ie.internalTime <= (t + dtc + idelay), "second OCIE2 occured to late")
    
  def test_05(self):
    """check toggle port pin"""
    self.assertVCD()
    ctr = self.getVariable("TIMER2.Counter")
    tp = self.tClock * self.prescaler
    t0 = ctr.firstedge.internalTime - tp
    dtc = tp * (self.ocra_value + 1)
    p = self.getVariable(self.pinName)
    # check occurence and value of first toggle change
    pe = p.getNextEdge(p.firstedge)
    self.assertEqual(pe.intValue, 1)
    self.assertEqual(pe.internalTime, t0 + dtc)
    # check occurence and value of following toggle changes
    pe = p.getNextEdge(pe)
    self.assertEqual(pe.intValue, 0)
    self.assertEqual(pe.internalTime, t0 + (2 * dtc))
    pe = p.getNextEdge(pe)
    self.assertEqual(pe.intValue, 1)
    self.assertEqual(pe.internalTime, t0 + (3 * dtc))
    
if __name__ == '__main__':
  
  from unittest import TestLoader, TextTestRunner
  tests = VCDTestLoader("timer_8bit_ctc_atmega128.vcd").loadTestsFromTestCase(TestCase)
  TextTestRunner(verbosity = 2).run(tests)

# EOF