pysimavr¶
About¶
pysimavr is a python wrapper for simavr which is AVR and arduino simulator
- Links:
- home: https://github.com/ponty/pysimavr
- documentation: http://pysimavr.readthedocs.org
- PYPI: https://pypi.python.org/pypi/pysimavr
- Features:
- Known problems:
- included simavr source code is not up to date
- Python 3 is not supported
- tested only on linux
- more tests needed
- PWM simulation is not real-time
- missing PWM modes
- a lot of messages on stdout
- LCD simulator is not fully implemented
- Possible usage:
- unit test
- simulator
- Similar projects:
Basic usage¶
>>> from pysimavr.avr import Avr
>>> avr=Avr(mcu='atmega48',f_cpu=8000000)
>>> firmware = Firmware('lcd.elf')
>>> avr.load_firmware(firmware)
>>> from pysimavr.sim import ArduinoSim
>>> print ArduinoSim(snippet='Serial.print("hello!");').get_serial()
hello!
Installation¶
check simavr documentation
- ignore these in simavr doc:
- OpenGl (freeglut)
- gcc-avr
- avr-libc
- make
General¶
Ubuntu 14.04¶
sudo apt-get install python-pip
sudo apt-get install swig python-dev gcc libelf-dev arduino
sudo pip install pysimavr
# optional for some tests:
sudo apt-get install freeglut3-dev scons
Uninstall¶
# as root
pip uninstall pysimavr
Usage¶
pysimavr.examples.simple:
#-- include('examples/simple.py')--#
from pysimavr.avr import Avr
if __name__ == "__main__":
avr = Avr(mcu='atmega48', f_cpu=8000000)
print( avr.pc )
avr.step(1)
print( avr.pc )
avr.step(1)
print( avr.pc )
avr.terminate()
#-#
Output:
#-- sh('python -m pysimavr.examples.simple ')--#
0
2
4
#-#
pysimavr.examples.hello:
#-- include('examples/hello.py')--#
from pysimavr.sim import ArduinoSim
if __name__ == "__main__":
s= ArduinoSim(snippet='Serial.println("hello!");').get_serial()
print(s)
#-#
Output:
#-- sh('python -m pysimavr.examples.hello ')--#
hello!
#-#
pysimavr.examples.delay:
#-- include('examples/delay.py')--#
from pysimavr.sim import ArduinoSim
import time
snippet = '''
int i=0;
while (1)
{
Serial.println(i++);
_delay_ms(1000);
}
'''
t0 = None
def logger(x):
global t0
t = time.time()
if not t0:
t0 = t
print t - t0, x
f_cpu=16000000
fps=20
speed=1
timespan=5
if __name__ == "__main__":
ArduinoSim(snippet=snippet,
timespan=timespan,
serial_line_logger=logger,
f_cpu=f_cpu,
fps=fps,
speed=speed,
).run()
#-#
Output:
#-- sh('python -m pysimavr.examples.delay ')--#
0.0 0
1.00977802277 1
2.01976013184 2
3.02968215942 3
4.03792500496 4
#-#
vcd export example¶
pysimavr.examples.vcd:
#-- include('examples/vcd.py')--#
from pysimavr.sim import ArduinoSim
vcdfile='delay.vcd'
snippet = '''
Serial.println("start");
pinMode(0, OUTPUT);
digitalWrite(0, HIGH);
delay(100);
digitalWrite(0, LOW);
delay(100);
digitalWrite(0, HIGH);
delay(100);
digitalWrite(0, LOW);
delay(100);
Serial.println("end");
'''
if __name__ == "__main__":
sim = ArduinoSim(snippet=snippet, vcd=vcdfile, timespan=0.5)
sim.run()
#-#

File hierarchy¶
|-docs sphinx documentation
|---.build generated documentation
|-pysimavr main python package, high level classes
|---examples examples
|---swig all swig files (simavr and parts)
|-----include copy of simavr generated *.h files
|-------avr copy from avr-libc
|-----parts some electronic parts in c
|-----simavr simavr as git submodule
|-tests unit tests
How to update external sources¶
- copy avr-libc headers (Ubuntu folder: /usr/lib/avr/include/avr/) into pysimavr/swig/include/avr
- simavr is a git submodule. Run ‘make’ inside simavr directory, then copy generated sim_core_config.h and sim_core_decl.h into pysimavr/swig/include
API¶
- There are 2 interfaces:
- pysimavr.swig.*: low level, generated by swig
- pysimavr.*: high level classes, they can redirect function calls to low level interface. Example: Avr class (high level) has all properties and methods of avr_t class (low level) automatically.
low level interface¶
-
class
pysimavr.swig.hd44780.
hd44780_t
¶ -
avr
¶
-
cursor
¶
-
datapins
¶
-
flags
¶
-
h
¶
-
irq
¶
-
pinstate
¶
-
readpins
¶
-
vram
¶
-
w
¶
-
-
class
pysimavr.swig.sgm7.
sgm7_t
¶ -
avr
¶
-
digit_count
¶
-
digit_pin
¶
-
digit_port
¶
-
digit_segments
¶
-
digit_segments_changed
¶
-
irq
¶
-
pinstate
¶
-
segment_pin
¶
-
segment_port
¶
-
-
class
pysimavr.swig.simavr.
avr_io_t
¶ -
avr
¶
-
dealloc
¶
-
ioctl
¶
-
irq
¶
-
irq_count
¶
-
irq_ioctl_get
¶
-
irq_names
¶
-
kind
¶
-
next
¶
-
reset
¶
-
-
class
pysimavr.swig.simavr.
avr_t
¶ -
address_size
¶
-
aref
¶
-
avcc
¶
-
codeend
¶
-
custom
¶
-
cycle
¶
-
cycle_timers
¶
-
data
¶
-
e2end
¶
-
eind
¶
-
flash
¶
-
flashend
¶
-
frequency
¶
-
fuse
¶
-
gdb
¶
-
gdb_port
¶
-
init
¶
-
interrupt_state
¶
-
interrupts
¶
-
io
¶
-
io_port
¶
-
irq_pool
¶
-
log
¶
-
mmcu
¶
-
pc
¶
-
ramend
¶
-
rampz
¶
-
reset
¶
-
reset_pc
¶
-
run
¶
-
run_cycle_count
¶
-
run_cycle_limit
¶
-
signature
¶
-
sleep
¶
-
sleep_usec
¶
-
sreg
¶
-
state
¶
-
trace
¶
-
trace_data
¶
-
vcc
¶
-
vcd
¶
-
vector_size
¶
-
-
class
pysimavr.swig.simavr.
avr_vcd_t
¶ -
avr
¶
-
filename
¶
-
log
¶
-
logindex
¶
-
logsize
¶
-
output
¶
-
period
¶
-
signal
¶
-
signal_count
¶
-
start
¶
-
high level interface¶
-
pysimavr.connect.
connect_irqs
(irq_out, irq_in, bidirectional=False)¶
-
pysimavr.connect.
connect_pins_by_rule
(rule, device_map, vcd=None)¶ rule example:
B0 –> D4 -> vcd
B1 <== D5 B2 => D6 # B3 <=> D7