60 nap alatt Arduino #07 - SOS villogó
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ó!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...
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.
ha....
Ha szeretnek irni egy Morse.h -t merre kell elinduljak?
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
http://avr.tavir.hu/modules.php?name=Fo ... pic&t=1048
Sziasztok,
na én is csináltam egy hf-et:
1152 byte lett, persze lehetne még optimalizálni...
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
}
}
Na picit még lejjebb szorítottam:
1138 byte
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;
}
}
Najó, egy utolsó még, újabb 8 byte minusz:
1130 byte
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;
}
}
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:
Mivel annyira kevés az elkészült HF.-ek publikálása, remélem nem fogják törölni!
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 !
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ó .
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ó .
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.)
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.)