@ ! mset mclr mtst
\ the source code
\ declare some constants and variable as labels
variable Compare
variable Count
$100 constant PINH \ these labels come from the atmega2560 datasheet
$101 constant DDRH
$102 constant PORTH
$a0 constant TCCR4A
$a1 constant TCCR4B
$a8 constant OCR4A
$2c constant PINE
$2d constant DDRE
$2e constant PORTE
$6a constant EICRB
$3d constant EIMSK
: ext4.irq ( -- ) Count @ 1+ Count ! ;i \ the frequency counter
: logicprobe-init ( -- )
1249 Compare ! \ 100 hz
%0000.1000 DDRH mset \ h3 output
%0100.0000 TCCR4A c! \ toggle d6, ph3 on compare match
0000.1011 %TCCR4B c! \ set ctc mode, clk/64
Compare @ OCR4A ! \ set compare value
%0 DDRE c! \ e input
0001.0000 PORTE mset \ pullup on e4
%0000.0010 %EICRB mset \ falling edge
['] ext4.irq #6 int!
;
\ helper words
: start-clock ( -- ) %0100.0000 TCCR4A c! %0000.1011 TCCR4B c! ; \ the bit manipulation does what the word says
: stop-clock ( -- ) %0000.0000 TCCR4A c! %0000.0000 TCCR4B c! ;
: set-frequency ( n -- ) OCR4A ! ; \ set compare value
: pin-high ( -- ) %0000.1000 PORTH mset ;
: pin-low ( -- ) %0000.1000 PORTH mclr ;
: open-gate ( -- ) 0 Count ! %0001.0000 EIMSK mset ;
: close-gate ( -- ) %0001.0000 EIMSK mclr ;
: process-data ( -- )
Count @ 1- Count ! \ clean up value in Count
Count @ dup 0 > if \ is Count greater than 0, if so its pulsing
cr ." freq=" 10 * .
else \ otherwise its not so is it high or low?
drop
%0000.1000 PINH mtst
if
." high"
else
." low"
then then
;
: wait ( -- ) 100 ms ;
: sample-pin ( -- ) open-gate wait close-gate process-data ; \ the 'logic probe'
test
Arduino
E FlashForth 5 ATmega2560 13.06.2022
ok<#,ram>
logicprobe-init ok<#,ram> (start up the logic probe)
sample-pin (sample the pin)
freq=100 ok<#,ram> ( its oscilating at 100hz)
stop-clock ok<#,ram>
sample-pin low ok<#,ram> ( after stopping the clock the pin is low)
pin-high ok<#,ram>
sample-pin
high ok<#,ram> ( now its high)
125 set-frequency ok<#,ram>
start-clock ok<#,ram>
sample-pin
freq=1000 ok<#,ram> ( after changing the frequency its 1000hz)
next time
Unless otherwise stated, our shows are released under a Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.
The HPR Website Design is released to the Public Domain.