60 nap alatt Arduino #07 - SOS villogó

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

Hozzászólás Szerző: Robert »

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: 10118
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Hozzászólás Szerző: Robert »

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ás Szerző: fodor99 »

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: 3360
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Hozzászólás Szerző: kapu48 »

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ás Szerző: Gumis »

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ás Szerző: fodor99 »

Ha szeretnek irni egy Morse.h -t merre kell elinduljak?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10118
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Hozzászólás Szerző: Robert »

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ás Szerző: TryMan »

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ás Szerző: TryMan »

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: 10118
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Hozzászólás Szerző: Robert »

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ás Szerző: TryMan »

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ás Szerző: TryMan »

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: 3360
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Hozzászólás Szerző: kapu48 »

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: 10118
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Hozzászólás Szerző: Robert »

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: 3360
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Hozzászólás Szerző: kapu48 »

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.)
:)
Válasz küldése