ATtiny Software TipsDeze pagina is een vervolg op mijn Starten met de ATtiny2313 pagina... Het behandelt een aantal tips en trucks aan de softwarekant voor mensen die met de 2313 willen werken en dient eigenlijk voornamelijk als naslagwerk voor mezelf (voor hardware, zie ATtiny hardware tips). Onderwerpen op deze pagina:
Geen garanties, maar hopelijk heeft naast mezelf nog iemand er iets aan. English: MiniMon for ATtiny2313I did not find any standard way to access variables and I/O locations in a
'life' system, i.e. for debugging and tuning a running system which would break
when single stepping or stopping, due to interaction with other parts/systems.
For this purpose, I made my It interacts with the running program via the serial port and a small
interrupt routine. It allows you to read and write SRAM and I/O locations,
without stopping the program (and taking at 4 MHz about 10 µs per
interaction). Download: minimon_v0r2.zip (PC program for
interaction also included). Include in your program by including the
Een real-time monitor: MiniMonSoms is het handig om in een draaiend ('life') programma real-time de variabelen of geheugenlocaties te kunnen bekijken, of I/O poorten te lezen of te schrijven (bijvoorbeeld omdat je de datasheet toch net wat anders had geïnterpreteerd). Niet ieder programma kan zomaar gestopt worden, vooral bij interactie met de omgeving of andere systemen. Daarvoor deze real-time monitor, waarmee je over de seriële poort vanaf de PC in de SRAM/IO geheugenmap van de ATtiny komt zonder het draaiende programma te stoppen of te beïnvloeden. Het geheel bestaat uit drie delen:
Het eigenlijke programma op de ATtiny, de MiniMon, is compact (142
bytes programma = 7% van het 2K geheugen, 2 bytes SRAM+8 bytes stack), gebruikt
een minimaal aantal CPU cycles (bij 4 MHz ongeveer 10 µs per interactie) omdat
de communicatie erg kort gehouden is, en gebruikt de USART en twee pinnen van
de ATtiny2313: RxD(2) en TxD(3). Je moet de file #ifdef MINIMON Serieel via USBAls je een Linux-computer met seriële poort hebt is gtkterm een
handig programma. Met een USB-to-serial adaptor met bijvoorbeeld een FTDI
FT232RQ chip is ook goed te werken, je port is dan bijvoorbeeld
Het geheel in versie 0.2 kan je downloaden (bevat Voorbeeld starten MiniMon.exe: Voorbeeld gebruik MiniMon: RxD/TxD pinnen al gebruikt? Misschien dat ik nog eens een versie maak gebaseerd op I²C, via de ISP header. Eerst mijn I2C master op orde hebben... C compiler tips voor optimale codeC compiler? GCC, zie mijn AVR overzichtpagina voor info/links... Al met al heb ik tot nu toe alles in C gedaan. Wel is de ATtiny2313 natuurlijk nogal beperkt in geheugen; 2 Kbytes programmageheugen (flash) en 128 bytes datageheugen. Tot nu toe blijkt dit geen probleem te zijn, mijn ondertussen al wat uitgebreidere RGB-LED programma gebruikt nu (inclusief startup code en C runtime) ongeveer 1 Kbyte flash en 64 bytes datageheugen. Daarnaast gebruikt C natuurlijk de stack; tot nu toe minder dan 32 bytes. Wel een paar tips:
En zo zijn er meer tips&tricks te bedenken. Bit and byte manipulatie
Om bits in poorten efficient te toggelen is onderstaande
XORBIT niet altijd de meest efficiënte; kijk eens naar de
functionaliteit van de PINx poort en doe: SETBIT(PIND,
1<<PD3); Zelfde als XORBIT(PORTD, 1<<PD3) maar
kortere code...Handig om een paar macro's te definiëren om bits en bytes te manipuleren op een manier die efficiënte code oplevert... heb ze zelf in een headerfile bij elkaar geveegd, maar hier even de belangrijkste, met alle haakjes op de juiste plaats om verrassingen te voorkomen: Voor bits in registers etc te manipuleren zijn onderstaande
definities handig; resulteren meestal in slechts één instructie (mits
losgelaten op registers die dit ondersteunen); te gebruiken als bijvoorbeeld
// some defines to handle I/O ports (and implicit bit flag
variables) Om efficiënt met de losse bytes van 16-bit pointers te werken de volgende definities, waarbij de PTR-variant gebruikt kan worden om een byte-wide pointer te krijgen uit een 16-bits pointer. Op deze manier hoef je niet de byte-volgorde zelf te onthouden: // Use LOW and HIGH for computations, LOWPTR and HIGHPTR for
16-bit mem locations Kan je ook voor variabelen gebruiken: zet low byte op nul met
Soms wil je 2 bytes swappen, of twee bytes in de verkeerde volgorde laden in
een 16-bits integer. Concreet voorbeeld: de LM75 I2C temperatuursensor geeft
eerst in een buffer eerst het meest significante byte, en dan pas het minst
significante. Helaas, voor 16-bit integers vrewacht de ATtiny juist het
minst-significante byte op het laagste geheugenadres... Wil je dit echt
efficient doen, dan is er wat getruk nodig; in mijn geval heb ik twee
#define FETCHHIGHLOW(result, highbyte, lowbyte) \ Het gebruik hiervan in het geval van mijn I2C routine is als hieronder,
hierbij is uint16_t newest; Bits in GPIO: efficient high level accessVoor efficiente bitmanipulatie-code, in bijvoorbeeld interrupt
service routines, is het handig een bit-addresseerbaar general purpose register
te gebruiken zoals typedef union runstruct // pack some bits indicating the
running state Op deze manier kunnen we I²C master en slave interfacesNog enkele tips:
De ATtiny heeft ook hardware support voor I²C, maar deze is vrij rudimentair: er moet nog vrij veel in software gebeuren. In de tiny zit de USI (Universal Serial Interface), deze is zeker voor de master functionaliteit veel simpeler dan de meer volledige TWI (Two-Wire interface) in uitgebreidere AVR devices als veel ATmegas. In de Atmel application notes staat er wel vrij veel over beschreven, zie hieronder. Ik heb zelf zowel master als slave werkend gekregen: voor de slave zie ook mijn 'Starten met de ATtiny2313 pagina', ben uitgegaan van de beschreven I²C eeprom simulatie met wat eigen aanpassingen; voor de master ben ik uitgegaan van de Atmel application note AVR310, en heb de code omgezet naar GCC. Ik zal mijn libraries mogelijk nog wel eens publiceren, maar hier al vast enkele links:
Een andere keer meer... |
op mijn site |