ATtiny Hardware TipsKant-en-klare bordjes met AVR processor? Kijk eens op de Arduino pages; is een uitgebreide gebruikers-community bij. Leuk bordje is bijvoorbeeld de Arduino Duemilanove (wel krachtiger dan de ATtiny). Deze pagina is een vervolg op mijn Starten met de ATtiny2313 pagina... Het behandelt een aantal tips en trucks aan de hardwarekant voor mensen die met de 2313 willen werken (en dient eigenlijk voornamelijk als naslagwerk voor mezelf). Voor software/debuggen zie de ATtiny Software (en debugging) Tips. Onderwerpen op deze pagina:
Geen garanties, maar hopelijk heeft naast mezelf nog iemand er iets aan. Fuse programming vanuit je C source, of met AVRDUDENaast het programmageheugen heeft de tiny2313 nog meer programmeerbare
delen; met name de fuses voor het instellen van de verschillende modes (zoals
welke klok te gebruiken). Die fuses zijn vaak wat raadselachtig (zo is
'programmed' een 0, en 'cleared' een 1), maar gelukkig is er op het net wel wat
uitleg verkrijgbaar; zo is er bijvoorbeeld de fuse calculator, welke de fuse waardes
netjes uitrekent aan de hand van je keuzes. Als je de waardes berekend hebt kan
je met avrdude deze programmeren. Pas op; een verkeerde waarde kan je
chip onbruikbaar maken (zeker als je alleen een seriële programmer hebt)!
Meer info ook op de AVR
Fuses HOWTO Guide (en natuurlijk in de datasheet). Het is nuttig eerst eens de huidige waardes uit te lezen, met het commando (serial programmer, windows resp. linux): avrdude -p t2313 -c siprog -P com1 -U lfuse:r:-:h -U
hfuse:r:-:h -U efuse:r:-:h Enkele Fuse-settingsDefault 8MHz / 8: Low= Extern 4 MHz Xtal: Low= Internal 128 kHz clock (low power): Low= Watchdog & brownout@2.7V: High= Dit levert bij mij de waarden op (even zoeken in de output): low fuse
avrdude -p t2313 -c usbasp -U lfuse:w:0xfd:m En ja, programmer uitgebreid met een 4 MHz kristal en 2 stuks 22 pF condensatoren, en mijn ledje knippert nu 4x sneller (in plaats van de 1 MHz interne RC-klok, de 4 MHz kristalwaarde). Zoals gezegd: een verkeerde fuse waarde kan je chip onbruikbaar maken; altijd dubbel-checken!!! Fuses in je C programmaJe kunt ook de waarde van fuses in je programma (en daarmee direct in je
binary files) opnemen, zodat deze informatie in de bijhorende source en
#include <avr/io.h> Je kunt de waarde van de fuses uitlezen uit de Low-cost zero-CPU-load analog-to-digital converterDe ATtiny2313 heeft zelf geen A/D-converter. In de applicatienote AVR401: 8-bit precision A/D converter van Atmel staat wel hoe er met de analoge comparator er zelf een te maken is, maar deze was mij te complex (ook qua software). Ik heb zelf een gestripte versie gemaakt met de volgende voordelen:
Het principe is eenvoudig (zie schema 1 en ook de app note): de te meten spanning wordt op pin 12 (AIN0) aangeboden. Op pin 13 (AIN1) wordt een lineair stijgende spanning gemaakt: met behulp van een constante stroom (als ingesteld door de transistor Q1 en weerstand R2) wordt een condensator C1 opgeladen. Op hetzelfde moment is een timer gestart. Op het moment dat de spanning op de condensator dezelfde is als de spanning op de meet-ingang wordt de waarde van de timer in het timer capture register ingeklokt; dit is de gemeten waarde. Na een vaste tijd wordt de condensator leeggemaakt (in
ongeveer 20 µs), door pin 13 van de ATtiny2313 tijdelijk als output met waarde
0 te configureren (met de weerstand R1 als stroombegrenzer), en kan de cyclus
opnieuw beginnen. Het geheel loopt op Timer1 die ik toch al had lopen voor
andere taken (met name de PWM outputs, klok op 4 MHz/8 dus ~2 kHz PWM); kost
dus geen extra resources. Het enige extra is een instructie in de interrupt
routine die pin 13 van input (meten) naar output met waarde 0 (ontladen)
schakelt, en weer terug (toggle: Op de meet-ingang wel nog wat onderdelen om deze te beschermen tegen te hoge spanningen en zo; of dit nodig is hangt af van je toepassing (schema 2, zener is 5.1 Volts). Voor de precieze waarde van de condensator moet je wat experimenteren, afhankelijk van je timing, en met name de kwaliteit van je condensator en van de gebruikte transistor, waarvan de versterkingsfactor (en daarmee de stroom) niet voor elke transistor dezelfde is... De meetwaarde is uit te lezen uit het Timer/Counter 1 capture
register, Initialisatie voor A/D conversie (exclusief de PWM-initialisatie op 2 kHz fast mode): // Timer initialisation for PWM not shown Simpel, niet? HomeNode met simpel LCD displayOnderdeel van mijn home control system: een simpele ATtiny gebaseerde node die een aantal sensoren en schakelaars bestuurd. Het prototype hiernaast hangt met een flatcable aan de USBasp programmer (rechts, aangesloten op een USB hub), en aan een LCD display. Op de print daarnaast nog wat headers voor I2C en solid state relais; plus natuurlijk de blauwe 3-pin connector voor aansluiting aan het netwerk. Meeste passieve componenten zitten als SMD-onderdelen aan de onderkant van het printje. De node heeft de mogelijkheid om een simpel LCD aan te sluiten; zie plaatje. Het gaat hier om een simpel 2x16 display (hier LCM-S01602DSR) dat in allerlei uitvoeringen vrij goedkoop te krijgen is (in allerlei maten, 2x16; 2x20, 4x20, etc). Aansluiting is mogelijk via slechts zes draadjes plus de 5 Volt voeding: 4 datalijnen, een command/data selectielijn en een write puls. Heb je meer pinnen beschikbaar dan kan het wat efficienter, bijvoorbeeld via een 8-bits databus en een read/write select (totaal 11 draadjes, plus voeding). Al deze displays maken gebruik van dezelfde compatible controllers (vaak de HD44780U), dus de software is herbruikbaar voor allerlei types. Ik maak gebruik van de code van Donald Weiman, die verschillende uitvoeringen op zijn site heeft staan. Hiernaast op het scherm zijn testprogramma (aangepast voor de ATtiny HomeNode door de pinnummers te wijzigen; tekst aangevuld met "/KM" zodat ik kon zien dat het mijn aangepaste software was). Let op: voor de Arduino zijn er vergelijkbare display te vinden, die echter via een ingebouwde converter met I2C aangestuurd worden (nog minder pinnen maar trager). Zijn niet compatible met de software van Donald! Stroomgebruik in een werkelijke schakelingIn mijn vuurvlieg-project (een batterij- en zonnecel-gevoed ontwerp) heb ik eens de stroom gemeten. De details zijn verhuisd naar de vuurvlieg-pagina... |
op mijn site |