60 nap alatt Arduino #07 - SOS villogó

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. július 21. szombat, 14:49

Vagy valami hasonlóra is jó lesz. Sőt, az elmentett nevedet lemorzézza :) Jó lesz házinak :P .

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. július 21. szombat, 14:51

fodor99:

Csak egy észrevétel:
- nagyon sok alprogramra bontod szét. Később ez gond lehet, mivel itt nem megy a RAM bővítése, mint PC esetén...

A későbbi leckékben lesz szó a buffertúlcsordulásról, memóriaínségről...

Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00
Tartózkodási hely: Esztergom
Kapcsolat:

HozzászólásSzerző: fodor99 » 2012. július 21. szombat, 14:52

Robert írta:fodor99:

Csak egy észrevétel:
- nagyon sok alprogramra bontod szét. Később ez gond lehet, mivel itt nem megy a RAM bővítése, mint PC esetén...

A későbbi leckékben lesz szó a buffertúlcsordulásról, memóriaínségről...


aham.... sejtettem hogy azért jól át kell majd gondolni az optimalizálást. Lehet lesz egy "csúnyább" gyorsabb kód kevesebb tárigénnyel, és pont az jó! :-)

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 21. szombat, 17:34

Tudjunk kicsit többet a morze kódról:
http://www.morse.hu/hu/morse/code.html


:arrow: :wink:

Avatar
Gumis
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2011. augusztus 25. csütörtök, 6:00

HozzászólásSzerző: Gumis » 2012. július 22. vasárnap, 7:08

BraskoS írta:Sziasztok!

Az én SOS házifeladat megoldásom:

Kód: Egész kijelölése

/*
 SOS jelzés a 13-as lábon
 A Morse időzítése:
 Rövid (ti):                                   1 egység
 Hosszú (tá):                                3 egység
 Betün belüli szünet a jelek között: 1 egység
 Betük közti szünet:                      3 egység
 Szavak közti szünet:                    7 egység
 10 WPM (Word Per Minute) sebesség esetén 1 egység = 120ms
*/

void setup() {               
  pinMode(13, OUTPUT);     // a 13 láb beállítása kimenetnek!
 }
void loop() {
 // az S betű kivilogtatása
 digitalWrite(13, HIGH);    // LED bekapcsol
 delay(120);                    // 1 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
                   
 delay(360);                  // betük közti 3 egységnyi várakozás
 
 // az O betű kivilogtatása
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(360);                   // 3 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(360);                   // 3 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(360);                   // 3 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 
 delay(360);                  // betük közti 3 egységnyi várakozás
 
 // az S betű kivilogtatása
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, HIGH);   // LED bekapcsol
 delay(120);                   // 1 egységnyi várakozás
 digitalWrite(13, LOW);    // LED kikapcsol
           
 delay(840);                   // szó végi 7 egységnyi várakozás
}



Mivel nagyon kezdő vagyok szeretném ha a leckék kódjait így kapnám ismétlés a tudás anyja nekem nagyon bejönne és nem kéne vissza olvasnom mi mit jelent.

Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00
Tartózkodási hely: Esztergom
Kapcsolat:

ha....

HozzászólásSzerző: fodor99 » 2012. július 22. vasárnap, 10:13

Ha szeretnek irni egy Morse.h -t merre kell elinduljak?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. július 22. vasárnap, 10:36

Ez a Házi feladat témáján túlmutat. Így önálló heyet kapott:
http://avr.tavir.hu/modules.php?name=Fo ... pic&t=1048

Avatar
TryMan
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. május 10. csütörtök, 6:00

HozzászólásSzerző: TryMan » 2012. július 25. szerda, 13:15

Sziasztok,
na én is csináltam egy hf-et:

Kód: Egész kijelölése


int lighttime[9] = {100,100,100,1000,1000,1000,100,100,100};
int waittime[9] = {200,200,500,200,200,500,200,200,2000};

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(13, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  for(int i=0;i<9;i++)
  {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(lighttime[i]);               // wait for a second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(waittime[i]);               // wait for a second
  }
}


1152 byte lett, persze lehetne még optimalizálni...

Avatar
TryMan
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. május 10. csütörtök, 6:00

HozzászólásSzerző: TryMan » 2012. július 25. szerda, 13:24

Na picit még lejjebb szorítottam:

Kód: Egész kijelölése

int time[18] = {100,200,100,200,100,500,1000,200,1000,200,1000,500,100,200,100,200,100,2000};
boolean led = 1;

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

void loop() {
  for(int i=0;i<18;i++)
  {
    digitalWrite(13, led);   
    delay(time[i]);   
    led=!led;
  }
}


1138 byte :)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. július 25. szerda, 13:32

Fontos! _csak_ az adott szintig megszerzett tudásból írható a házi! Háttérismeret, és egyéb tudás a haladó szint :P.

Avatar
TryMan
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. május 10. csütörtök, 6:00

HozzászólásSzerző: TryMan » 2012. július 25. szerda, 13:32

Najó, egy utolsó még, újabb 8 byte minusz:

Kód: Egész kijelölése

byte time[18] = {1,2,1,2,1,5,10,2,10,2,10,5,1,2,1,2,1,20};
boolean led = 1;

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

void loop() {
  for(int i=0;i<18;i++)
  {
    digitalWrite(13, led);   
    delay(time[i]*100);   
    led=!led;
  }
}


1130 byte

Avatar
TryMan
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. május 10. csütörtök, 6:00

HozzászólásSzerző: TryMan » 2012. július 25. szerda, 13:34

Robert írta:Fontos! _csak_ az adott szintig megszerzett tudásból írható a házi! Háttérismeret, és egyéb tudás a haladó szint :P.


Jó hát ettől most tekintsünk el :) Túl nagyot azért nem szaladtam előre...

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 25. szerda, 18:19

Mi az ördögért kel ekkora hej, ennek a csöpp programnak?

Kíváncsiságból át írtam Bascomra. És fele területet foglal el.
Bátorkodom ide rakni mintának, összehasonlításul:

Kód: Egész kijelölése


'  SOS.bas

$regfile = "m328def.dat"  'MCU header
$crystal = 16000000  'Kristály Frekvencia
' Vermek beállítása
$hwstack=40
$swstack=16
$framesize=32

' Változók létrehozása
Dim Times(18) As Word                                       'Tömb az időzítéshez.
Dim Led As Bit                                              ' LED kimenet állapota
Dim I As Byte                                               'Ciklusszámláló

' Kezdő értékek feltöltése
Times(1) = 100
Times(2) = 200
Times(3) = 100
Times(4) = 200
Times(5) = 100
Times(6) = 500
Times(7) = 1000
Times(8) = 200
Times(9) = 1000
Times(10) = 200
Times(11) = 1000
Times(12) = 500
Times(13) = 100
Times(14) = 200
Times(15) = 100
Times(16) = 200
Times(17) = 100
Times(18) = 2000
Led = 1

'Setup
Config Pinb.5 = Output                                      'pinMode(13, OUTPUT)

' Fö program hurok
Do
   For I = 1 To 18
       Pinb.5 = Led                                         'LED kimenet írása
       Waitms Times(i)                                      'Várakozás miliSec
       Toggle Led                                           'Led állapot váltás
   Next I
Loop

End                                                         'end program

' Az egész területfoglalás: 556 BYTES !



Mivel annyira kevés az elkészült HF.-ek publikálása, remélem nem fogják törölni!
:lol:

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. július 25. szerda, 18:29

Bascomhoz: $noramclear és még pár init finomság is bejátszhat :)

A különbség a legjobban a kapott HEX állomány ASM visszafejtésével játszik. Az Arduino objektumorientált C++ alapkönyvtárakat használ.

A Bascom meg natív ASM kódot a háttérben, ASM megírt eljárásokkal...


De ezeknek más célra, más célközönségnek készültek! De maradjunk a fórum eredeti témájánál: SOS villogtató :).

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 25. szerda, 19:57

OK! Arduino.
Miért használtok ciklusváltozónak INT-et?

Mikor az 2 Bytes: http://arduino.cc/en/Reference/Int
Szerintem elég lenne a Byte-is: http://arduino.cc/en/Reference/Byte

Igy nem kellene a For ciklusban állandóan ellenőrizni, hogy történt e átvitel L > H Byte között.

Eredmény: Rövidebb, gyorsabb program! (Most 8 bites gépet programozunk. Nem 64 bites pentiumot.)
:)


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég