Skip to content

Commit

Permalink
add basic ctc
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergey Pchelincev authored and Sergey Pchelincev committed Feb 20, 2012
1 parent b0e5620 commit 5fe6d04
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 17 deletions.
23 changes: 21 additions & 2 deletions lib/raudi/avr/timer.rb
Expand Up @@ -4,25 +4,44 @@ module AVR

class Timer

attr_accessor :a, :active, :b, :counter, :overflow, :name, :length, :prescale
attr_accessor :active, :counter, :interrupt, :mode, :mode_params, :name, :length, :prescale

[:default, :ctc].each do |timer_mode|
define_method("#{timer_mode}?") do
self.mode == timer_mode
end

define_method("#{timer_mode}!") do
self.mode = timer_mode
end
end

def initialize(name, params)
self.name = name
self.length = params['length']
self.mode = :default
end

def number
name[/\d+/].to_i
end

def range
0..max_number
0...max_number
end

def max_number
2**length
end

def mode=(new_mode)
if @mode != new_mode
@mode = new_mode
self.mode_params = {}
self.interrupt = nil
end
end

end

end
Expand Down
5 changes: 2 additions & 3 deletions lib/raudi/processing.rb
Expand Up @@ -54,9 +54,8 @@ def can_process?
true
end

def vector_name(prefix)
vector_name = ""
vector_name << prefix.upcase
def vector_name(*args)
vector_name = args.map(&:upcase).join('_')
vector_name << "_vect"
end

Expand Down
46 changes: 42 additions & 4 deletions lib/raudi/processing/timer.rb
Expand Up @@ -3,13 +3,51 @@ module Raudi
module Processing

class Timer < Base

private

def active_timers
timers.select(&:active)
end

def config
timers.select(&:active).each do |timer|
register_name = "TCCR#{timer.number}B"
bits = timer.prescale.to_bits(3, :prefix => "CS#{timer.number}")
active_timers.each do |timer|
set_timer_mask(timer)
set_mode(timer)
end
end

def interrupts
active_timers.each do |timer|
next unless timer.interrupt
prefix = "timer#{timer.number}"
case
when timer.default?
interrupt_block vector_name(prefix, "ovf") do

end
when timer.ctc?
timer.mode_params.keys.each do |register_name|
interrupt_block vector_name(prefix, "comp#{register_name}") do

end
end
end
end
end

def set_mode(timer)
register_name = "TCCR#{timer.number}B"
bits = timer.prescale.to_bits(3, :prefix => "CS#{timer.number}")
bits << "WGM#{timer.number}2" if timer.ctc?
write_register(register_name, bits)
end

def set_timer_mask(timer)
case
when timer.default?
register_name = "TIMSK#{timer.number}"
bits = ["TOIE#{timer.number}"]
write_register(register_name, bits)
end
end
Expand Down
13 changes: 7 additions & 6 deletions lib/raudi/proxy/timer.rb
Expand Up @@ -20,15 +20,16 @@ def activate_counter(number, params = {})
private

def base_tc_setting(devise, params)
if params[:overflow]
devise.overflow = true
set_interrupt
end
[:a, :b].each do |number|
if value = params[number]
devise.send("#{number}=", value) if devise.range.include?(value)
if value = params[number] and devise.range.include?(value)
devise.ctc!
devise.mode_params[number] = value
end
end
if params[:interrupt]
devise.interrupt = true
set_interrupt
end
devise.active = true
end

Expand Down
13 changes: 13 additions & 0 deletions spec/lib/raudi/avr/timer_spec.rb
Expand Up @@ -6,4 +6,17 @@

specify{ timer.number.should == 0 }

specify{ timer.range.should include(23)}
specify{ timer.range.should_not include(256)}

it 'should change params when mode changed' do
timer.mode = :foo
timer.mode_params.should == {}
timer.mode_params[:a] = 34
timer.mode = :foo
timer.mode_params[:a].should == 34
timer.mode = :bar
timer.mode_params.should == {}
end

end
14 changes: 12 additions & 2 deletions spec/lib/raudi/proxy/timer_spec.rb
Expand Up @@ -26,15 +26,25 @@
end

it 'set timer with interrupt' do
config.activate_timer 1, :overflow => true
config.activate_timer 1, :interrupt => true
controller.interrupt.should be_true
timer = controller.timers[1]
timer.overflow.should be_true
controller.headers.should include('avr/interrupt')
end

end

context 'ctc mode' do

it 'set to ctc a' do
config.activate_timer 2, :a => 123
timer = controller.timers[2]
timer.mode.should == :ctc
timer.mode_params[:a].should == 123
end

end

context 'define counter' do

it 'set timer 0 to counter' do
Expand Down
16 changes: 16 additions & 0 deletions spec/lib/raudi/source/timer_spec.rb
Expand Up @@ -16,6 +16,22 @@

end

context 'with interrupts' do

it 'basic example' do
config.activate_timer 0, :interrupt => true
source.should include('ISR(TIMER0_OVF_vect)')
source.should include('TIMSK0 |= 1 << TOIE0;')
end

it 'ctc interrupt' do
config.activate_timer 1, :a => 12745, :interrupt => true
source.should include('ISR(TIMER1_COMPA_vect)')
source.should include('TCCR1B |= 1 << CS10 | 1 << WGM12;')
end

end

context 'basic setup counter' do

it 'allow counter 0' do
Expand Down

0 comments on commit 5fe6d04

Please sign in to comment.