In voorbereidingAtmel AVR Butterfly

Deze pagina is nog in ontwikkeling!!! Missen nog delen/details...

Atmel AVR ButterflyDe Atmel AVR Butterfly (Atmel: ATAVRBFLY) is een demo-printje van Atmel. Waarom is deze zo interessant?

  • Goedkoop (ik had ze begin 2011 voor €22,50 incl BTW, excl verzendkosten)
  • Volledig: een simpel LCD display, een joystick met 5 schakelaars (up/down/left/right/enter), speakertje, een 4 Mbit data flash, temperatuursensor, etc
  • ATmega169 processor, programmeerbaar in C
  • Vrije ingangen (analoog en digitaal) en uitgangen (digitaal)
  • Batterij-gevoed (geleverd met grote knoopcel) en erg laag stroomgebruik
  • Klein (6.7 x 4.5 x 1.2 cm, kleiner dan een credit-card of bankpas) en licht.

Butterfly in doosjeAl met al een handig ding om makkelijk projectjes op te zetten die een simpele gebruikersinterface nodig hebben, en een beperkte hoeveelheid processing power (bijvoorbeeld een low-speed data logger, dankzij de 512 kByte data flash). Zelf in een doosje ingebouwd, zie links, inclusief een simpele schakeling om het geheel via USB te voeden (communicatie gaat nog wel via de seriele poort) en wat blauwe ledjes voor het display (maar, kan ook nog met batterijen gevoed, voor bijvoorbeeld draagbare toepassingen).Een voorbeeld van een toepassing is mijn NiMH batterij-tester.

Veel informatie over de Butterfly is te vinden op de Atmel Butterfly pagina (Butterfly user manual, pdf), en via de AVR-projects pagina.

Een van de opvolgers van de Butterfly is de ATXMEGAB1-XPLD (Atmel XMEGA-B1 Xplained) met een ATxmega128B1 processor, USB, aanraaktoetsen, LCD etc, volgens Atmel store $29,-. Lijkt interessant. Als ik nog eens nieuw moet kopen...

De AVR Butterfly

Enkele Butterfly details

  • ATmega169 processor (16KB flash, 1KB RAM, 512 bytes EEPROM, timer, 8x 10-bit A/D, 4x PWM, ...)
  • 100 segment LCD display
  • 4 Mbit (512,000 bytes!) data flash AT45DB041B
  • Real Time Clock met 32.768 kHz oscillator
  • 4-way joystick, met center push button
  • Temperatuur sensor (NTC)
  • ADC voltage reading, 0-5V
  • Piëzo speaker for sound generation
  • Header connector pads for access to peripherals
  • RS-232 level converter for PC communications
  • Bootloader for PC based programming
  • Pre-programmed demos with source code
  • Built-in safety pin for hanging from you shirt
  • Connectoren voor JTAG, USI, ...

De ATmega169PV processor

De ATmega169PV processor (al een wat ouder type) is duidelijk een stuk krachtiger dan de ATtiny2313 die ik eerder gebruikt heb... Enkele kenmerken:

  • 8-bit RISC architectuur, 130 Instructies (meeste single-clock), 32 × 8-bit werkregisters, C/C++ programmeerbaar
  • 16 Kbytes In-System Self-programmable Flash program memory (1KB gebruikt voor boot loader), 512 Bytes EEPROM (20 jaar/100K cycles), 1 Kbytes Intern SRAM
  • In-System Programming (ISP) met On-chip Boot Program
  • 4 × 25 Segment LCD Driver
  • Twee 8-bit Timer/Counters, een 16-bit Timer/Counter met aparte Prescalers, Compare Mode, en Capture Mode, Real Time Counter met aparte Oscillator
  • Vier PWM kanalen (analoog uit)
  • 8-channel, 10-bit ADC, en On-chip Analog Comparator
  • Programmable Serial USART, Master/Slave SPI Serial Interface, Universal Serial Interface with Start Condition Detector
  • Interne Calibrated Oscillator, Programmable Watchdog Timer with Separate On-chip Oscillator
  • External en Internal Interrupts, Interrupt and Wake-up on Pin Change
  • Vijf Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, and Standby
  • 0 - 4 MHz @ 1.8V - 5.5V, 0 - 8 MHz @ 2.7V - 5.5V (maar let op, de seriële flash op de Butterfly gaat maar van 2.7 tot 3.6V... ! )

De ontwikkelomgeving

Tips: Voor Code::Blocks kies de atmega169 als core, niet de atmega169P (I/O library issue. En kies avr-gcc als linker, niet avr-g++.

Ik gebruik hiervoor dezelfde tools (GCC compiler, Code::Blocks) als voor de andere Atmel processor die ik gebruik, de ATtiny2313. Zie dan ook deze pagina voor een overzicht van de ontwikkelomgeving.

Direct aan de PC

Specifiek voor de Butterfly: de Butterfly kan direct op een seriële poort op de PC aangesloten worden (wel zelf een connector er op zetten), en kan dan zonder extra hardware via de ingebouwde boot loader worden geprogrammeerd met avrdude (één regel), boot loader starten via menu naar Options > Boot loader > Jump to boot loader; hier de joystick indrukken ('Enter') en ingedrukt houden totdat je avrdude gestart hebt:

avrdude -p atmega169 -c butterfly -P /dev/ttyS0 -U flash:w:mijnprog.elf.hex

Snel en makkelijk... Maar: de Butterfly wordt geleverd zonder connectoren, afhankelijk van wat je er mee wilt moet je die er zelf op solderen. Eerste wat ik dus gedaan heb is met een header en drie draadjes er een 9-polige sub-D connector (female) opgezet voor de seriële poort, zodat ik hem aan mijn PC kan hangen; zie pagina 19-20 van het user manual. Testen: probeer je naam in de Butterfly te zetten via HyperTerm of gtkterm (pagina 4).

Een seriële programmer

Programmeren kan ook met de seriële programmer die ik ook voor de ATtiny gebruik, en wordt dan aangesloten op de 6-polige ISP connector. Wel een extra 1N4148 diode aangebracht in de voedingslijn van de programmer; de butterfly mag maximaal 4.5 Volt hebben ivm de seriële flash (heb ook de signaallijnen op een lager niveau begrenst, 5V1 zenerdiodes vervangen door 4V3). De seriële programmer heeft het voordeel dat je ook alle andere commando's van avrdude kan gebruiken, bijvoorbeeld op de fuses uit te lezen ( standaard: l=0xe2, h=0x98, e=0xff, device signature = 0x1e9405) of te programmeren, of om de oorspronkelijke binary (inclusief boot loader) uit te lezen voor het geval zaken overschreven raken en de standaard boot loader niet meer werkt (twee keer één regel):

avrdude -p atmega169 -c siprog -P /dev/ttyS0 -i 40 -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h
avrdude -p atmega169 -c siprog -P /dev/ttyS0 -i 40 -U flash:r:origbin.hex:i

Vreemd genoeg is de teruggelezen binary niet helemaal dezelfde als die die ik in de file met de oorspronkelijke sources heb gevonden...

De Butterfly menu-software

Op de Butterfly draait een eenvoudig menu-gedreven applicatie, die je de mogelijkheden van de Butterfly laten proberen (datum/tijd, temperatuur, muziekjes spelen, ...). Dit wordt gedaan vanuit een C programma, waarvan ook de source bescjikbaar is, als voorbeeld om aan programmeurs het hoe en waarom te laten zien.

Ik verwacht hier uiteraard dat je de GCC compiler al hebt geïnstalleerd; zie de ATtiny pagina, sectie over tools.

De beschrijving hier is voor Linux, maar onder Windows gaat het geheel op een vergelijkbare manier.

De menu-demo is oorspronkelijk geschreven voor de Atmel ontwikkelomgeving, maar er is ook een GCC port beschikbaar wat bijvoorbeeld in een Linux-omgeving handiger kan zijn. Dit is gelijk een goede test om je GCC-omgeving te testen, en als startpunt te dienen. Van de AVR projects site is de source van de GCC port van versie Rev07 te downloaden (versie 0.7.6 van 20091217). Pak deze uit in een nieuwe folder. Je ziet in deze folder nu een aantal C code en header files, een make file, en zo voort.

Start nu een terminal in die folder, en (als je dat nog niet globaal gedaan hebt) zorg dat Linux je AVR-tools kan vinden door het pad goed te zetten. Daarna kan je met make de compilatie starten:

PATH=/usr/local/avr/bin:$PATH
make

Compilers zijn niet altijd helemaal deterministisch. Zo is de demo-binary onder Windows 6 bytes kleiner dan die onder Linux (zelfde make file, zelfde GCC versie). Kan komen door kleine verschillen in bijvoorbeeld de link-volgorde.

De compiler gaat nu aan de slag, en produceert (als alles goed gaat) een file genaamd 'main.hex'. Je kunt uiteraard ook proberen om het geheel in een IDE als Code::Blocks te importeren, maar met de meegeleverde make-file gaat het vanaf de command line wel zo makkelijk.

Het uploaden naar de Butterfly: sluit de Butterfly aan op de seriële poort, en breng hem in bootloader mode (zie ook het user manual): Options » Boatloader » Jump to bootloader. In de terminal avrdude opzetten met de volgende argumenten (maar druk nog NIET op 'Enter'):

avrdude -p atmega169 -c butterfly -P /dev/ttyS0 -U flash:w:main.hex

De demo-software gebruikt iets meer dan 13 Kbyte; de bootloader is 1 Kbyte groot. Er is dus nog haast 2Kbyte plek om wat kleine (test-)routines toevoegen aan de standaard versie.

Op de Butterfly nu de joystick indrukken en ingedrukt houden, op het toetsenbord de 'Enter' indrukken, en avrdude moet nu starten (je kan de joystick loslaten). avrdude gaat nu het een en ander inlezen, de flash wissen en programmeren, en weer teruglezen om te verifiëren dat alles goed is gegaan. Na de bootload staat de Butterfly in rust: joystick 'up', en de startup tekst komt in beeld; nu AVR BUTTERFLY GCC. Klik de joystick naar rechts, en de versie 076 verschijnt (0.7.6).

En als dit allemaal werkt kan je je eigen software gaan schrijven... Succes!

Eigen software

Voor mijn eigen software ga ik uit van de Butterfly demo-programma opzet, hierin zitten al routines voor menu-besturing, LCD-aansturing en dergelijke; dus waarom niet hergebruiken? Op die manier hoef je alleen aan te passen wat er in je eigen programma moet (en eventueel er uit te gooien wat te veel ruimte in neemt, zoals de liedjes in sound.c).

Wel vind ik de menu-structuur vrij onoverzichtelijk (verdeeld over enkele files als menu.h en main.h, en over diverse tabellen). Ik heb de menu's er uit geplukt en in één tabel met kolommen voor state, naam en acties gezet. Hiervan maak ik met behulp van Perl nu al de benodigde tabellen en zo (ik maak een nieuwe menu.h). Als ik nu menu's verander hoef ik dat maar op een plaats te doen...

Een eerste test was het maken van wat wijzigingen in de voltmeter (floating point wegwerken, nergens voor nodig; via menu schakelen tussen interne en externe referentie­spanning), om te kijken of het werkt.

Mijn projecten met de Butterfly

Vrije pinnen

Bij eigen projectjes wil ik extra hardware aansluiten (bijvoorbeeld 4 analoge ingangen gebruiken). De volgende pinnen zijn 'vrij' (of vrij te maken) voor experimenten, zie het Butterfly user manual, en/of de details in Butterfly Alternate Pin Uses van smileymicros (waar nog meer Butterfly info te vinden is):

Pinnen
Functie
Connector
Gedeeld met
Port B: 1,2,3
I/O
ISP (BP1: 3, PB2: 4, PB3: 1, GND: 6, Vcc_ext: 2)
Data flash
Port F: 4, 5, 6, 7

ADC 4-7
JTAG (PF4: 1, PF5: 5, PF6: 3, PF7: 9, GND: 2, Vcc: 4)
JTAG (disable in SW: set JTD in MCUCR)

Port E: 4,5,6
I/O
USI (PE4: 1, PE5: 2, PE6: 3, GND: 4)
USI
Port B: 0-7
diversen
PortB (zie doc)
Data Flash, Joy stick, buzzer
Port D: 0-7
I/O
PortD (zie doc)
LCD
Port F: 1
ADC 1
Voltage in (PF1: 1, GND: 2)
 

A/D conversie

De standaard software maakt geen gebruik van de ingebouwde 1.1V referentiespanning, maar gebruikt om stroom te besparen via PF3 de voedingsspanning (2.85V) als referentie... Dus, als je een externe voeding aansluit veranderen je meetwaarden, afhankelijk van de externe spanning.

De interne hoog-ohmige (~50K) referentie­­­spanning wordt belast door het NTC-circuit (160K) en indien aangesloten de LDR, dat kan een probleem zijn... Spanning is dus maar zo'n 0.8V in plaats van 1.1V. Misschien een baantje doorkrassen?

Meer info over de ADC op Butterfly

Met de Vcc-pinnen op de connectoren is het even oppassen: de meeste zijn de Vcc_ext spanning, dat wil zeggen bedoeld om de Butterfly mee van spanning te voorzien, niet om spanning te leveren! Ze zijn via een diode gescheiden van de batterij-spanning op de butterfly. Alleen de Vcc op de JTAG connector is echt de processor-spanning.

Datalogger/controller

Een eerste serieus project in mijn NiMH batterij-tester; gebaseerd op een simpele data logger/controller met opslag op de flash chip: hoe snel is een NiMH van vol naar 1 Volt (leeg) door een 100 mA belasting (die wordt afgeschakeld bij het bereiken van 1 Volt, om te verre ontlading te voorkomen)?

LED controller

Voor complexere besturing van mijn RGB power LEDs wil ik ook de Butterfly inzetten, maar dat heeft niet zo'n haast... Later meer.

Golfvorm-generator

Simpele schakeling om twee kanalen analoge data te genereren met behulp van de LTC1661 10-bit DAC (Digitaal naar Analoog Converter), bijvoorbeeld voor het maken van willekeurige golfvormen (geluid, testen), of het weergeven van data in grafische vorm op een oscilloscoop (handig bij heel langzame signalen las bij mijn batterijtester; versneld weergeven om te bekijken).

Stappenmotoren-besturing

Heb nog wat oude stappenmotoren liggen waar ik nog eens wat mee wil spelen.