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
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Lefordítottam a kódodat: 1332 byte volt. Én írtam egy másik morze programot, ami 1172 bytera fordult le és azt játssza, hogy "pistike".
Erről beszéltem, amikor azt mondtam, hogy van variáció.

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

/*
  Pistike morzéül
 */

#define END    0x80
#define TI(a)  (a >> 1)
#define TA(a)  ((a >> 1) | 0x80 )

#define MORSE_P TI(TA(TA(TI(END))))
#define MORSE_I TI(TI(END))
#define MORSE_S TI(TI(TI(END)))
#define MORSE_T TA(END)
#define MORSE_K TA(TI(TA(END)))
#define MORSE_E TI(END)

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

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

void play(uint8_t code) {
  while( code != END )
  {
    digitalWrite(led, HIGH);
    delay(( code & 0x80 ) ? 1000 : 500);
    digitalWrite(led, LOW);
    delay(200);
    code <<= 1;
  }
  delay(2000);
}

char text[] = { MORSE_P, MORSE_I, MORSE_S, MORSE_T, MORSE_I, MORSE_K, MORSE_E, 0 };

// the loop routine runs over and over again forever:
void loop() {
  char *letter = text;
  while( *letter )
    play(*(letter++));

  delay(4000);
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Itt azért erősen sikerült elmenni abba az irányba ahol a leckékkel eljutók még nem járnak. Nem ismert:
- tömb,
- pointer,
- ciklus.

És a végén még berakjátok egy karakterláncba, mindenféle define nélkül... És csak simán a delay-ok lesznek ls a kötött LED bekötés:).
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Általában nem szoktam beleszólni abba, hogy hobbi szinten ki milyen programot ír. Az a lényeg, hogy menjen és kész.

Amikor a hozzászólást olvastam, a "nincs variációtól" kirázott a hideg.

Természetesen nem lehet elvárni kezdő szinten, hogy tudja, hogy mi hány byte-ra fordul le. Sőt a példám esetén rengeteg műveletet a fordító végez el az AVR helyett, éppen ezért lett a kód rövid.
Ilyen szinten nem kell tudni, hogy egy függvényhívás mennyire drága és azt sem, hogy a kódomban a MORSE_P pontosan egy byte-ra fordul le, aminek értéke 0x68, hiába az a rengeteg shift-elős vagyolós egymásba ágyazott hókuszpókusz ( TI(TA(TA(TI(END)))) ), a fordító fordítás közben már kiszámolja és a végleges érték kerül a memóriába.

Nagyon sok olyan dolog van, amit ezen a szinten nem kell tudni. Azt akartam szemléltetni, hogy van más megoldás is, még nem értük el a C programozás csúcsát.

Mellesleg kizárólag azért tudtam rövidebb kódot készíteni, mert a függvényhívás eszméletlen drága AVR alatt. Ezt programozóként azonnal láttam. Nálam kevesebb függvényhívás van, ezért tömörebb a kódom, semmi varázslás nincs benne.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

A korábbi "sok variáció nincs" soron én átugrottam...
Ha csak itt ezt a fórumot lessük meg, itt is van már 6-8 variáció egy ilyen egyszerű feladata...
Mindenki a tanult programlogika mellett a saját elveit és megszerzett plusz ismereteit is beleviszi. Így aztán nem is lehet azonos programokról beszélni.
Visszanézve még az azonos utasítás-sorrendű programok közt is van eltérés : ki hogyan/mit kommentezik benne!
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Róbert, a pointerezés a kódomban teljesen felesleges. A feladat elkészítésénél arra koncentráltam, hogy a lefordított kód rövid legyen.

A pointeres megoldás gyorsabb és rövidebb bármilyen indexelésnél. Bekerül az X-Y-Z 16 bites regiszterek valamelyikébe és a fordító egyesével növeli.

Kezdő szempontból a megoldásomat jobb elfelejteni, mert inkább gátolja a megértést, mint segíti.
spal
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2014. február 5. szerda, 17:24

Re: 60 nap alatt Arduino #07 - SOS villogó

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

csabeszq írta:Általában nem szoktam beleszólni abba, hogy hobbi szinten ki milyen programot ír. Az a lényeg, hogy menjen és kész.

Amikor a hozzászólást olvastam, a "nincs variációtól" kirázott a hideg.

Természetesen nem lehet elvárni kezdő szinten, hogy tudja, hogy mi hány byte-ra fordul le. Sőt a példám esetén rengeteg műveletet a fordító végez el az AVR helyett, éppen ezért lett a kód rövid.
Ilyen szinten nem kell tudni, hogy egy függvényhívás mennyire drága és azt sem, hogy a kódomban a MORSE_P pontosan egy byte-ra fordul le, aminek értéke 0x68, hiába az a rengeteg shift-elős vagyolós egymásba ágyazott hókuszpókusz ( TI(TA(TA(TI(END)))) ), a fordító fordítás közben már kiszámolja és a végleges érték kerül a memóriába.

Nagyon sok olyan dolog van, amit ezen a szinten nem kell tudni. Azt akartam szemléltetni, hogy van más megoldás is, még nem értük el a C programozás csúcsát.

Mellesleg kizárólag azért tudtam rövidebb kódot készíteni, mert a függvényhívás eszméletlen drága AVR alatt. Ezt programozóként azonnal láttam. Nálam kevesebb függvényhívás van, ezért tömörebb a kódom, semmi varázslás nincs benne.
Örülök, hogy sikerült egy kicsit felpezsdíteni a fórumot a "nincs sok variációval". Reméltem, hogy kezdőként nem kell a legmagasabb szintű tudást igénylő megoldást prezentáljuk. A "nincs sok variáció" beszólás arra vonatkozott, hogy a fórumon a többi kezdő által kitett kódok már szinte minden változatot tartalmaztak ami egy kezdőtől várható, három betűt kivillogtatására. Sokkal színesebb lenne a paletta ha az egész morze ABC-t kellett volna leprogramozni és abból leadni az SOS-t.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Persze itt még el lehetne menni ASM illetve Bascom/Micropascal fele is.
Azért alaptudással a meglevő 10-12 féle alapprogram sem lett körbejárva (még teljesen).
Azaz van még lehetőség!
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

> Örülök, hogy sikerült egy kicsit felpezsdíteni a fórumot a "nincs sok variációval".

Azért ne vedd sértésnek a kódomat. Alig vártam, hogy hazaérjek és bebizonyítsam, hogy kisebb kódból mennyi mindent ki lehet hozni.
Annyira felcsigázott a feladat, hogy előkaptam az Arduino-t, letöröltem a rajta lévő programot és megírtam Pistikét.
Avatar
nix
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2010. február 23. kedd, 7:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Csak a rend kedvéért az én kódom (semmi újdonság nincs benne, de bevallom, átolvastam a többi megoldást, mielőtt megírtam):

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

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


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

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH); delay(ti);      // "ti"
  digitalWrite(13, LOW);  delay(jelkoz);  // szün
  digitalWrite(13, HIGH); delay(ti);      // "ti"
  digitalWrite(13, LOW);  delay(jelkoz);  // szün
  digitalWrite(13, HIGH); delay(ti);      // "ti"
  digitalWrite(13, LOW);  delay(betukoz); // szűűűn

  digitalWrite(13, HIGH); delay(ta);      // "tá"
  digitalWrite(13, LOW);  delay(jelkoz);  // szün
  digitalWrite(13, HIGH); delay(ta);      // "tá"
  digitalWrite(13, LOW);  delay(jelkoz);  // szün
  digitalWrite(13, HIGH); delay(ta);      // "tá"
  digitalWrite(13, LOW);  delay(betukoz); // szűűűn

  digitalWrite(13, HIGH); delay(ti);      // "ti"
  digitalWrite(13, LOW);  delay(jelkoz);  // szün
  digitalWrite(13, HIGH); delay(ti);      // "ti"
  digitalWrite(13, LOW);  delay(jelkoz);  // szün
  digitalWrite(13, HIGH); delay(ti);      // "ti"
  digitalWrite(13, LOW);  delay(szokoz);  // szűűűűűűűn
}
budacsik
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2015. január 8. csütörtök, 22:36

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Sziasztok!

Tegnap kaptam meg végre a boardom (UNO) és megírtam az első első C programom is :) Most vettem észre, hogy a házi pont egy morze villogtatás, ugyanis mielőtt nem kaptam meg, nem is kezdtem el olvasni a leckéket. Így viszont én a klasszikus HELLO WORLD-öt írattam ki, íme:

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

// HELLO WORLD program
// @budacsik
int ledPin = 13;     // 13 Pin
int dot = 200;       // short signal
int line = 500;      // long signal
int tbts = 100;      // the time between two signals
int tbtl = 250;      // the time between two letters
int tbtw = 300;      // the time between two words

void setup() {
  // initialize the digital pin as an OUTPUT
  // Pin 13 has an LED
  pinMode(ledPin, OUTPUT);
}

void loop() {
  get(4, dot);                            delay(tbtl);  // H
  get(1, dot);                            delay(tbtl);  // E
  get(1, dot); get(1, line); get(2, dot); delay(tbtl);  // L
  get(1, dot); get(1, line); get(2, dot); delay(tbtl);  // L
  get(3, line);                           delay(tbtl);  // O
  delay(tbtw);   // HELLO done, next WORLD
  get(1, dot); get(2, line);              delay(tbtl);  // W
  get(3, line);                           delay(tbtl);  // O
  get(1, dot); get(1, line); get(1, dot); delay(tbtl);  // R
  get(1, dot); get(1, line); get(2, dot); delay(tbtl);  // L
  get(1, line); get(2, dot);              delay(tbtl);  // D
  delay(3000);
}

void get(int num, int type) {
  int i;
  for(i=0; i<num; i++) {
    digitalWrite(ledPin, HIGH);
    delay(type);
    digitalWrite(ledPin, LOW);
    delay(tbts);
  }
}
szauern
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2015. január 18. vasárnap, 20:12

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Hello,

Első arduino programom.
A morseText változóban megadott bármilyen karakterláncot le tud morzézni, csak hozzá kell majd adni a printCharacter() függvényhez a többi karaktert is (a feladathoz elegendő volt annyi).
Azon a függvényen amúgy is van még mit optimalizálni, majd egyszer visszatérek hozzá.

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

//Morse rules
int baseTime = 300;           //base time
int tiTime = baseTime;        //short sign
int taTime = baseTime * 3;    //long sign
int bwSign = baseTime;        //between signs
int bwChar = baseTime * 3;    //between characters
int bwWord = baseTime * 7;    //between words -> space

//do sign
void doSign(int todo, int delayTime) {
  if(todo == 1) {
    digitalWrite(13, HIGH);     // turn the LED on (HIGH is the voltage level)
    delay(delayTime);           // wait 
    digitalWrite(13, LOW);      // turn the LED off by making the voltage LOW
  } 
  else if (todo == 0) {
    delay(delayTime);           // wait
  }  
}

// prints available characters
void printCharacter(char morseChar) {
  morseChar = toupper(morseChar);
  switch (morseChar) {
    case 'S':
      doSign(1, tiTime); doSign(0, bwSign); doSign(1, tiTime); doSign(0, bwSign); doSign(1, tiTime);  
      break;
    case 'O':
      doSign(1, taTime); doSign(0, bwSign); doSign(1, taTime); doSign(0, bwSign); doSign(1, taTime);       
      break;      
  }
}

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

// the loop function runs over and over again forever
void loop() {
  // text
  char morseText[] = "SOS ";
  int i;
  int lastChar = 1;     // 0 -> space, 1 -> other character  
  for(i = 0; i <= sizeof(morseText)-1; i++) {
    switch (morseText[i]) {
      // space
      case ' ':
        doSign(0, bwWord);
        lastChar = 0;
        break;
      // between chars
      default:
        if(i > 0 && lastChar == 1) {
          doSign(0, bwChar);
        }
        printCharacter(morseText[i]);
        lastChar = 1;
        break;
    }
  } 
}
Avatar
furbyhun
DrótVégénSzéndarab
Hozzászólások: 44
Csatlakozott: 2015. február 14. szombat, 21:18

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Sziasztok!

Csak úgy felmerült, meg a későbbi projektemhez kell is majd: msec-nél rövidebb várakozást hogyan tudok beállítani a delay-hoz hasonló pontossággal? (Ha mondjuk 5 kHz-cel szeretnék mintavételezni egy analóg jelet.)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #07 - SOS villogó

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

delayMicrosecundum() illetve a belső timer. Későbbi leckékben lesz.
Avatar
furbyhun
DrótVégénSzéndarab
Hozzászólások: 44
Csatlakozott: 2015. február 14. szombat, 21:18

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Robert írta:delayMicrosecundum() illetve a belső timer. Későbbi leckékben lesz.
Köszi, csak türelmetlen az ember :D
Claude
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2013. április 6. szombat, 14:35

Re: 60 nap alatt Arduino #07 - SOS villogó

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

Sziasztok!
Az oldalt olvasva látom eddig több megoldási mód is született. Én is elkészítettem a saját verziómat, amit most közre adok.

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

/*  SOS generator
  Morzekód esetén nemcsak a bekapcsolás ténye, hanem a bekapcsolt állapot hossza is információt közvetít, 
  így a megfelelő sorrendű ki- és bekapcsol(gat)ással több állapot is közölhető:

  rövid jel (ti – 1 egység hosszú);
  hosszú jel (tá 3 egység hosszú);
  rövid szünetjel (jelköz – 1 egység hosszú);
  hosszú szünetjel (betűköz – 3 egység hosszú);
  nagyon hosszú szünetjel (szóköz és mondatköz - 7 egység hosszú).
  
  Az SOS nemzetközi morzekód vészjelzés. Három rövid, három hosszú és újabb három rövid jelzésből áll (· · · — — — · · ·)
  */


void setup() {              // kezdőbeállítások megadása  
   pinMode(13, OUTPUT);    // az arduino 13 lábát beállítjuk kimenetnek
}


void loop() {               // a program fő része, ami egészében, vagy részleteiben többször is végrehajtásra kerülhet
  for(int i=1; i<4; i++){    // ismétlődések beálítása
  digitalWrite(13, HIGH);   // a 13 láb tápfeszültségre helyezése (LED bekapcsoása) 
  delay(100);               // rövid impulzus idejének beállítása (egy egységnyi idő)
  digitalWrite(13, LOW);    // a 13 láb kikapcsolása, (LED kikapcsolása)
  delay(100);               // jelköz idejének beállítása (egy egységnyi idő)
}                           // az ismétlődés vége
delay(200);                 // betüköz idejének beállítása összesen három egységnyi idő(itt kető egységnyi idő + az előtte lévő egy egységnyi idő)
           
  for(int i=1; i<4; i++){    // ismétlődések beálítása
  digitalWrite(13, HIGH);   // a 13 láb tápfeszültségre helyezése (LED bekapcsoása)
  delay(300);               // hosszú impulzus idejének beállítása (három egységnyi idő)
  digitalWrite(13, LOW);    // a 13 láb kikapcsolása, (LED kikapcsolása)
  delay(100);               // jelköz idejének beállítása (egy egységnyi idő)
}                           // az ismétlődés vége
delay(200);                 // betüköz idejének beállítása összesen három egységnyi idő(itt kető egységnyi idő + az előtte lévő egy egységnyi idő)
            
  for(int i=1; i<4; i++){    // ismétlődések beálítása
  digitalWrite(13, HIGH);   // a 13 láb tápfeszültségre helyezése (LED bekapcsoása)
  delay(100);               // rövid impulzus idejének beállítása (egy egységnyi idő)
  digitalWrite(13, LOW);    // a 13 láb kikapcsolása, (LED kikapcsolása)
  delay(100);               // jelköz idejének beállítása (egy egységnyi idő)
}                           // az ismétlődés vége
delay(600);                 // szóköz idejének beállítása összesen hét egységnyi idő (itt hat egységnyi idő + az előtte lévő egy egységnyi idő)
}

Az alappanelem még nem érkezett meg, így sajnos nem volt módom a program feltöltésére és kipróbálására. A fordító az ellenőrzés után nem adott hiba üzenetet.

Üdv: István
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Válasz küldése