vineri, 7 mai 2010

Arduino "de criza" si dimensiunea sketch-urilor

Dupa ce am terminat placa de mai jos, potrivita perioadei actuale "de criza" (cost total cca. 20 RON) am incercat sa vad cat ocupa din memoria limitata (doar 8KB) acelasi program compilat cu mai multe medii de dezvoltare.
Pe placa este un ATmega8, frecventa externa 16MHz, fara bootloader (am folosit pentru programare un Pololu USB programmer, achizitionat de aici, dar merge la fel de bine si cu vechiul meu programator pe port paralel ;-)



int ledPin = 13;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop()
{
digitalWrite(ledPin, HIGH); // set the LED on
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, LOW); // set the LED off
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, HIGH); // set the LED on
delay(1500); // wait for 1.5 seconds
digitalWrite(ledPin, LOW); // set the LED off
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, HIGH); // set the LED on
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, LOW); // set the LED off
delay(1500); // wait for 1.5 seconds
}


Restul de programe sunt cam la fel, fara niciun fel de optimizare :D

Rezultate:
Arduino - 782 bytes
BASCOM - 252 bytes
WinAVR - 206 bytes

Urmeaza sa mai incerc in assembler si cu alte medii de dezvoltare pentru care am gasit versiuni demo (IAR C, FastAVR, CodeVision, AVRco, MikroC, MikroPascal, MikroBasic etc.)

Edit: Assembler - 188 bytes (cu cate o rutina pentru 0.5 si una pentru 1.5 secunde... cred ca iesea mai mic daca o apelam de 3 ori pe cea de 0.5)

Edit: IAR Embedded Workbench (programul scris in C din WinAVR transformat pentru IAR) - 158 bytes
Hmmm... se pare ca rutinele mele in limbaj de asamblare aveau nevoie de optimizare...
;-)


In concluzie incepe sa-mi placa din ce in ce mai mult IAR Embedded Workbench, mai ales ca au fost singurii dintre cei la care m-am inregistrat care mi-au trimis email sa afle cum imi place programul si ce intrebari si sugestii am :D

8 comentarii:

  1. Nu pot sa spun decat UAU ! Eu astept de 2 luni un atmega168-220AU pentru ca am un cod scris pentru un LCD mai mare de 8kbyte si bineinteles nu pot folosi varianta de la AVR ATMEGA88-20AU .
    Dar cum pot compila un cod scris in Arduino in Bascom sau WinAVr ? Nu trebuie scris alt cod ?

    RăspundețiȘtergere
  2. Trebuie sa rescrieti codul pentru Bascom, ceea ce e destul de simplu (exista biblioteci pentru multe componente, inclusiv LCD). Problema e cu compilatorul care, in versiunea demo, e limitat la 4KB.
    Cu WinAVR ar fi cel mai simplu, in definitv si Arduino il foloseste pentru compilare. In plus e gratuit si nelimitat!!!
    O idee buna pentru amatorii de Pascal SI de ATmega8 sau 88 este E-LAB AVRco mega8, care e gratuit in aceasta versiune care poate utiliza toti cei 8KB.
    Se gaseste aici: http://e-lab.de/AVRco/index_en.html si exista si un forum aici: http://forum.e-lab.de/
    Au si versiune gratuita pentru celelalte controllere, limitata la 4KB.

    RăspundețiȘtergere
  3. Buna ziua,
    nu pot sa spun decat jos palaria pentru acest blog si pentru informatiile postate aici. sunt putini programatori, romani care fac asa ceva.
    sunt foarte novice in ale programarii, desi am terminat AC-ul cu multi ani in urma (lucru pentru care mi-e rusine sa spun ca am aterminat AC-ul) dar imi doresc atat de mult sa invat. drept pentru care m-am apucat sa-mi readuc pe hartie cateva idei mai vechi.
    Nu de multa vreme am gasit aceste minunate placute de la Arduido si vrand sa-mi automatizez un sistem de irigatii, am si sarit pe cautari.
    si uite asa din pagina in pagina am dat de acest superb blog.
    din cate inteleg, acest "Arduido de criza" este facut si nu "cumparat de gata". se pot gasi pe undeva schemele pentru a putea fi refacut acest model? multumesc mult!

    RăspundețiȘtergere
  4. Multumesc pentru aprecieri!
    Schema... hmmm... trebuia sa fac o schema?
    ;-)
    N-a prea avut o schema anume dar voi incerca sa desenez una si sa pun si o lista de materiale si cateva indicatii, in caz ca intereseaza pe cineva.
    Singurele avantaje sunt pretul (cam 1/5 din pretul unei placi de fabrica) si faptul ca am mai invatat cate ceva.
    Mult succes!

    RăspundețiȘtergere
  5. Un cod de 154Bytes format din macrouri din SDK-ul meu:
    ;************************************************************
    .Org 0
    Rjmp M_Init
    .Org INT_VECTORS_SIZE
    ;************************************************************
    _CreateDelayMs 500
    _CreateDelayMs 1500
    M_Init:
    _StivaInit SRAM_START
    _SetPortBit DirPortLed,PinLed;Set pin led as output
    Loop:
    _SetPortBit OutPortLed,PinLed// set the LED on
    _DelayMs 500
    _ClrPortBit OutPortLed,PinLed// set the LED off
    _DelayMs 500
    _SetPortBit OutPortLed,PinLed// set the LED on
    _DelayMs 1500
    _ClrPortBit OutPortLed,PinLed// set the LED off
    _DelayMs 500
    _SetPortBit OutPortLed,PinLed// set the LED on
    _DelayMs 500
    _ClrPortBit OutPortLed,PinLed// set the LED off
    _DelayMs 1500
    Rjmp Loop
    ;************************************************************
    //Cele doua rutine de delay, 500ms si 1500ms sunt separate.
    Si un cod de 104bytes cu o singura rutina de 500ms:
    ;************************************************************
    .Org 0
    Rjmp M_Init
    .Org INT_VECTORS_SIZE
    ;************************************************************
    _CreateDelayMs 500
    M_Init:
    _StivaInit SRAM_START
    _SetPortBit DirPortLed,PinLed;Set pin led as output
    Loop:
    _SetPortBit OutPortLed,PinLed// set the LED on
    _DelayMs 500
    _ClrPortBit OutPortLed,PinLed// set the LED off
    _DelayMs 500
    _SetPortBit OutPortLed,PinLed// set the LED on
    _DelayMs 500
    _DelayMs 500
    _DelayMs 500
    _ClrPortBit OutPortLed,PinLed// set the LED off
    _DelayMs 500
    _SetPortBit OutPortLed,PinLed// set the LED on
    _DelayMs 500
    _ClrPortBit OutPortLed,PinLed// set the LED off
    _DelayMs 500
    _DelayMs 500
    _DelayMs 500
    Rjmp Loop
    ;************************************************************
    Best regards!!

    RăspundețiȘtergere
  6. Foarte interesant! Am descarcat si eu SDK-ul tau acum si-l voi incerca dupa ce citesc documentatia.
    Multumesc!

    RăspundețiȘtergere
  7. Acesta este headerul ce trebuie pus inainte de .Org 0
    ;************************************************************
    .Include "m8def.inc"
    .Include "Lib/Util.inc"
    .Include "Drivers/IO_Port.inc"
    .Equ CoreFrequ = 8000000

    .Equ OutPortLed = PORTC
    .Equ InPortLed = PINC
    .Equ DirPortLed = DDRC
    .Equ PinLed = 0

    ;************************************************************
    O documentatie detaliata nu am facut in schimb am introdus o parte din documentatie in fiecare fisier declarate cu ".message".
    Folderul SDK-ului poate fi inclus in AVR Studio: Project/Assembler Option/ La Additional include path.

    RăspundețiȘtergere
  8. Multumesc din nou!
    M-am uitat in PDF-uri si in surse, urmeaza sa si incerc rutinele cand scap de bilant, declaratii etc.
    ;-)

    RăspundețiȘtergere