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