60 nap alatt Arduino #42 - A legkisebb LED villogó
60 nap alatt Arduino #42 - A legkisebb LED villogó
Alapprogram: LED villogó.
Kódméretben a legkisebbet keressük. ASM, C, Bascom-AVR, MicroC, micropascal és Arduino játszik.
A pályaműben a következők kellenek:
- Elkövette :
- Nyelv:
- Fordítóprogram:
- Fordítóprogram verziószám:
- Méret (byte)
Kódméretben a legkisebbet keressük. ASM, C, Bascom-AVR, MicroC, micropascal és Arduino játszik.
A pályaműben a következők kellenek:
- Elkövette :
- Nyelv:
- Fordítóprogram:
- Fordítóprogram verziószám:
- Méret (byte)
Akkor elkezdem...
Mivel semmilyen paraméter nem volt megadva, így:
1. (Pl. T45) FUSE biteknél OSC OUT bekapcs, rá LED, villog,igaz elég gyorsan (0 byte)
2. Bascom:
Ez 64 byte, mivel a fordító az alsó INT táblákat befordítja.
Ha kiengedjük a RESET lábat akkor 19Hz, de a belső oszcillátort 128kHz-re állítva már lassú villogás is van (csak akkor én nem tudom újraprogramozni a chip-et, így kihagytam).
3: ASM mondjuk...de majd kijavítjátok
IN R24,DDRB
INC R24
OUT DDRB,R24
(lehet, az IN meg LD nem helyes, de a lényeg érthető, gondolom.)
Egyik "program" végén sincs END, minek, majd körbekerüli az egész ROM-ot, az is jó időzítés és nyertünk 2 byte-ot.
Igen érdekes, hogy T15-nél nem működik a memória körbefutás, ott a Bascom nullázza a portot, tehát ciklus kell. Viszont a klasszikus Wait szinte alig fogyaszt. Az egész 70 byte
Bascom 2075 elkövette Horváth Jani.
Hirtelen csak ennyi jutott eszembe, de még agyalok.
Mivel semmilyen paraméter nem volt megadva, így:
1. (Pl. T45) FUSE biteknél OSC OUT bekapcs, rá LED, villog,igaz elég gyorsan (0 byte)
2. Bascom:
Kód: Egész kijelölése
$regfile = "attiny45.dat"
$noinit
$noramclear
Incr Ddrb
'38Hz/PB4/1.2MHz CLK
Ha kiengedjük a RESET lábat akkor 19Hz, de a belső oszcillátort 128kHz-re állítva már lassú villogás is van (csak akkor én nem tudom újraprogramozni a chip-et, így kihagytam).
3: ASM mondjuk...de majd kijavítjátok
IN R24,DDRB
INC R24
OUT DDRB,R24
(lehet, az IN meg LD nem helyes, de a lényeg érthető, gondolom.)
Egyik "program" végén sincs END, minek, majd körbekerüli az egész ROM-ot, az is jó időzítés és nyertünk 2 byte-ot.
Igen érdekes, hogy T15-nél nem működik a memória körbefutás, ott a Bascom nullázza a portot, tehát ciklus kell. Viszont a klasszikus Wait szinte alig fogyaszt. Az egész 70 byte
Kód: Egész kijelölése
$regfile = "attiny15.dat"
$noinit
$noramclear
Do
Toggle Ddrb.1
Waitms 100
Loop
Hirtelen csak ennyi jutott eszembe, de még agyalok.
Külső 555 IC, 10 Hz-vel az AVR Xtal lábára.
Az AVR ClkOut bekapcsol.
DivCLK8 bekapcsol.
LED a CKOut lábra ..
0 byte, de csúnya az AVR-t frekvenciaosztónak használni.
De lehet Timer-t is, és prescale. Csak az INIT kell rá és az OCx lűábon LED.
Vagy UART és lassab a 0x55-t kiadni.... (0x55 = &B01010101)
De maradjunk az aklapfeladatnál: szoftverből - lehetőleg járulékos HW alkalmazása nélkül összehozni a digitális láb billegetést...
Arduino rendszer alatt ~600 byte.
Bascom alap (optimalizálás nélkül) ~200-250 byte
Az AVR ClkOut bekapcsol.
DivCLK8 bekapcsol.
LED a CKOut lábra ..
0 byte, de csúnya az AVR-t frekvenciaosztónak használni.
De lehet Timer-t is, és prescale. Csak az INIT kell rá és az OCx lűábon LED.
Vagy UART és lassab a 0x55-t kiadni.... (0x55 = &B01010101)
De maradjunk az aklapfeladatnál: szoftverből - lehetőleg járulékos HW alkalmazása nélkül összehozni a digitális láb billegetést...
Arduino rendszer alatt ~600 byte.
Bascom alap (optimalizálás nélkül) ~200-250 byte
Még nyomorítás:
A delayMicroseconds() kisebb, mint a delay()! ~50 byte hely....
Sőt az INIT(); is macerálható (de ez rendszerkód-piszkálás!). Itt kivehető az analóg lábakra vonatkozó rész, és itt van benne, hogy a bootloader után a D0 és D1 lábak I/O lábak legyenek, ne pedig a bootloader által inicializált Tx/Rx (soros) vonalak... Ha nem hazsnálsz időzítést, akkor annak kezelése is kivehető.
Erről jut eszembe: delay() helyett egy for ciklus? Esetleg több do-while() egymásba ágyazva?
Kód: Egész kijelölése
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delayMicroseconds(65535); // wait for a second
digitalWrite(13, LOW); // set the LED off
delayMicroseconds(65535); // wait for a second
}
Sőt az INIT(); is macerálható (de ez rendszerkód-piszkálás!). Itt kivehető az analóg lábakra vonatkozó rész, és itt van benne, hogy a bootloader után a D0 és D1 lábak I/O lábak legyenek, ne pedig a bootloader által inicializált Tx/Rx (soros) vonalak... Ha nem hazsnálsz időzítést, akkor annak kezelése is kivehető.
Erről jut eszembe: delay() helyett egy for ciklus? Esetleg több do-while() egymásba ágyazva?
Csak elméleti alapon, nem tudom kipróbálni:
Piros LED a uC +5V táppal sorban.
Watchdog beállítva mondjuk 1Hz-re
1 byte incrementálása, legalsó bit figyel.
0=Go SLEEP (majd a WD resetel)
1=zártciklus, folyamatos működés (WD majd lelövi)
Sleepben a fogyasztás pár uA, aktív módban pár
mA, tehát a tápfelvétel változásától villog a LED.
Na, ennél birkábbat már nem tudok kiagyalni
JAni
Piros LED a uC +5V táppal sorban.
Watchdog beállítva mondjuk 1Hz-re
1 byte incrementálása, legalsó bit figyel.
0=Go SLEEP (majd a WD resetel)
1=zártciklus, folyamatos működés (WD majd lelövi)
Sleepben a fogyasztás pár uA, aktív módban pár
mA, tehát a tápfelvétel változásától villog a LED.
Na, ennél birkábbat már nem tudok kiagyalni
JAni
Re: 60 nap alatt Arduino #42 - A legkisebb LED villogó
Arduino 1.0.5-el 498 byte, hmm
Kód: Egész kijelölése
void setup ()
{
DDRB |= 1<<5;
}
void loop ()
{
PINB |= 1<<5;
delayMicroseconds(65535);
}
Re: 60 nap alatt Arduino #42 - A legkisebb LED villogó
Ez már inkább C, mint Arduino ....
Re: 60 nap alatt Arduino #42 - A legkisebb LED villogó
És legkisebbnek sem nevezhető, ha sikerül 20-30 byte körülire lenyomni, akkor érdemes visszalátogatni.
Ennyiből ki kellene tudni hozni, akár C-ben is. A trükk az interrupt vektor tábla / libc / Arduino kikapcsolása, mert semmi szükséged sincs rá, ha csak villogtatni akarsz. 0-n indul a kódod és villogtatja a LED-et.
Sok küzdelem vár még a végső megoldásig, de biztosan felemelő érzés lesz látni, ahogy a 32k-s IC-re sikerült felvarázsolni egy 30 byte-os programot.
Ennyiből ki kellene tudni hozni, akár C-ben is. A trükk az interrupt vektor tábla / libc / Arduino kikapcsolása, mert semmi szükséged sincs rá, ha csak villogtatni akarsz. 0-n indul a kódod és villogtatja a LED-et.
Sok küzdelem vár még a végső megoldásig, de biztosan felemelő érzés lesz látni, ahogy a 32k-s IC-re sikerült felvarázsolni egy 30 byte-os programot.