60 nap alatt Arduino #08 - Házi feladatok - Knight Rider

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Nyomogomb - antiprell – IF Modelezés:

Ha (digitalRead(6) == LOW.
A programunk igy fut:

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

void loop() {
az  feltétel nem teljesül ezért át ugorja.
delay (100);
  digitalWrite(7, HIGH);
az  feltétel nem teljesül ezért át ugorja.
delay (100);
  digitalWrite(7, LOW);
}
Láthatóan kevesebb lesz a várakozás, ezért gyorsabb a LED villogás.

A Prel elemzését meghagyom másnak!
8)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

És az eredeti program (Aki még nem kaptavolna meg.):

Nyomogomb - antiprell - IF
Demonstracios program
60 nap alatt arduino tanfolyam része

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

void setup(){
  pinMode(6, INPUT);       // Input switch
  pinMode(7, OUTPUT);      // Output LED
  digitalWrite(6, HIGH);   //Pull-up
}
 
void loop() {
  if (digitalRead(6) == HIGH) { 
    delay (5);
    if (digitalRead(6) == HIGH) { 
      delay(900);
    }
  }
  delay (100);
  digitalWrite(7, HIGH);
  if (digitalRead(6) == HIGH) {
     delay(5);
     if (digitalRead(6) == HIGH) {     
       delay(900);
     }
  }
  delay (100);
  digitalWrite(7, LOW);
}
(kérdés: ha épp prell alatt/közben vagyunk és nem érzékeljük az IF-fel, akkor mi történik? Próbáld lemodellezni...).
:wink:
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 »

Nekem van egy motorshieldem, amin van 4 led, ezekkel csináltam:

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

byte led[6] = {8,11,12,13,12,11}; 

void setup() {                
  pinMode(8, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
} 

void loop() { 
  for(int i=0;i<6;i++) 
  { 
    digitalWrite(led[i], HIGH);    
    delay(100);
    digitalWrite(led[i], LOW);    
  } 
} 
sry a ciklusért :)
1114 byte így, ha ciklusban menne a ledek inicializálása, az 8 bytetal több :)
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

knight rider v3

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

Robert írta:OK. Témában megnyitom az Arduino - haladóknak részt :P.
Ez vicc volt? Mert kerestem, de valszeg nem jól, ui nem találtam ilyen topikot.

Ha mégis lenne kérek iránymutatást, h hova kellene írni.
// Knight rider futofeny v3
// irta Kapu48 (Arduino hardverre) C nyelven 
// belepiszkalt Macsek: ket egymas utani ciklus helyett irany_jelzo

char debug=1; // akarunk-e futasi uzeneteket
char d; // valtozok nevet alapvetoen kis betuvel irjuk ;-)
char irany=0; // ha 1: D0->D7, ha 0: D7->D0 iranyba futunk eppen

void setup()

  DDRD = B11111111;   // sets Arduino pins 0 to 7 as outputs
  d = B00000001;      // kezdeti kimeneti minta
  if(debug)
  {
    Serial.begin(9600);
    Serial.println("Futofeny indul"); // azert kell, h tutira jo eredmenyt irjon egybol
  }


void loop()

  char i;
  irany = !irany;  // minden ujabb loop korben iranyt valtunk

  for(i=1; i<8; i++)
  {
    PORTD = d;
    if(debug)
    {
      Serial.print(millis());
      Serial.print(" irany:");
      Serial.print(irany);
      Serial.print(" ");
      Serial.print(d, BIN);
      Serial.print(" (");
      Serial.print(d);
      Serial.println(")");
    }
      
    delay(200);
    if(irany) // tanuloknak: ez azt jelenti, h if(irany != 0) tehat, h nem nulla
      d = d<<1;  // tanuloknak: 1 bittel balra tolas, azaz 2-vel szorzas
    else
      d = d>>1;  // tanuloknak: 1 bittel jobbra tolas, azaz 2-vel osztas
  } //for vege
// loop vege

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

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

http://avr.tavir.hu/modules.php?name=Fo ... forum&f=23
Ez a standard Arduino fórum...

Itt a programhoz pár kiegészítés (Fontos! Ez a haladó szint és az Arduino jónéhány belső szabályát áthágod! Keveredik a sima C nyelv és az Arduino nyelvezet!)

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

for(i=1; i<8; i++) 
Számolj I=1-től 8-ig, úgy hogy minden lépésnél az i-t eggyel növeled. Ha I=8, akkor léphetsz tovább.

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

 DDRD = B11111111;   // sets Arduino pins 0 to 7 as outputs
Minden egyes kivezetés 3 ún. regiszterrel bír:
DDRx - Data Direction Register: azaz a láb ki/bemenet. És minden egyes ilyen regiszter DDRD (D port (lábcsoport) regisztere, mely az Arduinonál a D0...D7-et jelenti), DDRB (B port regisztere: Arduino D8...D13 es a D14/D15 nincs kivezetve a tokon kívülre)
PINx: Adott lábcsoport milyen szinten van (kívülről lehúzva vagy felemelve H szintre)
PORTx: Adott lábcsoport ha kimenet, akkor ez mondja meg, hogy magas vagy alacsony szinten legyen. Ha a láb bemenet, akkor a belső felhúzóellenállás.
FONTOS!Arduino alatt _TILOS_ használni, erre a DigitalWrite() [kb. PORTx] / DigitalRead() [PINx] és a pinMode() [DDRx] való [zárójelben, hogy melyiknek mi felel meg. DE csak komplett lábcsoportra értelmezhetőek a PINx, PORTx és DDRx utasítások!]


d = d<<1; // tanuloknak: 1 bittel balra tolas, azaz 2-vel szorzas
Azaz ha a D BINÁRIS értéke:
00100100, akkor a d<<2 esetén balra tolom, így a d értéke:
01001000 lesz. A felső bit kiesik és alsóban bejön a 0.
A d=d<<1 pedig ennek az ellentéte. Az 1 azt mondja, hogy 1 ilyen léptetést kell végezni.

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

if(debug)
Az if utasítás attól függően, hogy a paramétereként megadott változó/művelet vagy műveletsor értéke igaz vagy hamis, attól függően megy tovább a normál vagy az else ágra. A debug értéke IGAZ esetén lehet:
1, true
minden más: HAMIS



irany=!irany
Ez azt jelenti, hogy irany= NOT irany. Azaz legyen az ellenkezője.
Csalóka, mert ha az értéke 0 és char (8 bit / 1 byte) definíciójú, akkor (ha jól emlékszem), minden egyes _bit_ negatív lesz. Azaz ha irany=0000.0000, akkor !irany= NOT irany = 1111.1111
Szerk: HIBÁS a leírásom! Lentebb 2 hsz-l javítva!
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. augusztus 7. kedd, 17:16-kor.
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

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

Robert írta:http://avr.tavir.hu/modules.php?name=Fo ... forum&f=23
Ez a standard Arduino fórum...
Köszönöm

Tök jó magyarázatokat írtál.
Robert írta: Itt a programhoz pár kiegészítés (Fontos! Ez a haladó szint és az Arduino jónéhány belső szabályát áthágod! Keveredik a sima C nyelv és az Arduino nyelvezet!)
Én csak Kapu48 programját módosítottam, de attól még igazad van.
Robert írta: A d=d<<1 pedig ennek az ellentéte. Az 1 azt mondja, hogy 1 ilyen léptetést kell végezni.
Elírás, kérlek javítsd, az én hsz-omból meg kitörölheted ezt a részt :)
Robert írta: irany=!irany
Ez azt jelenti, hogy irany= NOT irany. Azaz legyen az ellenkezője.
Csalóka, mert ha az értéke 0 és char (8 bit / 1 byte) definíciójú, akkor (ha jól emlékszem), minden egyes _bit_ negatív lesz. Azaz ha irany=0000.0000, akkor !irany= NOT irany = 1111.1111
Nem, az a bináris negálásnál (~ operátor) igaz, itt (mint a soros monitor mutatja is) 1 -> 0 -> 1 -> 0
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Az irany =! irany pontosan az irany = NOT irany. Binarisan a háttérben:
irany=0000.000
.
irany = !irany //0000.0001
.
irany = !irany //0000.0000

Azaz csak az utolso bit valtozik meg!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha már megtanultuk mi a különbség (! = bináris NOT) és (~ = bináris negálás) között szemléltessük is!

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

// Knight rider futofeny v3 
// irta Kapu48 (Arduino hardverre) C nyelven  
// belepiszkalt Macsek: ket egymas utani ciklus helyett irany_jelzo 

char debug=1; // akarunk-e futasi uzeneteket 
char d; // valtozok nevet alapvetoen kis betuvel irjuk  
char irany=0; // ha 1: D0->D7, ha 0: D7->D0 iranyba futunk eppen 

void setup() 
 {  
   DDRD = B11111111;   // sets Arduino pins 0 to 7 as outputs 
   d = B00000001;      // kezdeti kimeneti minta 
   if(debug) 
   { 
     Serial.begin(9600); 
     Serial.println("Futofeny indul"); // azert kell, h tutira jo eredmenyt irjon egybol 
   } 
 }  

void loop() 
 {  
   char i; 
   irany = !irany;  // minden ujabb loop korben iranyt valtunk 
   d = ~d;            //Szemléltetés képen (d = d bináris negálása)
   
   for(i=1; i<8; i++) 
   { 
     PORTD = d; 
     if(debug) 
     { 
       Serial.print(millis()); 
       Serial.print(" [i="); 
       Serial.print(i); 
       Serial.print("] irany:"); 
       Serial.print(irany); 
       Serial.print(" "); 
       Serial.print(d, BIN);       // Majd itt figyeljetek!
       Serial.print(" ("); 
       Serial.print(d); 
       Serial.println(")"); 
     } 
        
     delay(200); 
     if(irany) // tanuloknak: ez azt jelenti, h if(irany != 0) tehat, h nem nulla 
       d = d<<1;  // tanuloknak: 1 bittel balra tolas, azaz 2-vel szorzas 
     else 
       d = d>>1;  // tanuloknak: 1 bittel jobbra tolas, azaz 2-vel osztas 
   } //for vege 
 } // loop vege
Csak egy kevés módosítás és más lett az eredmény!
:wink:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

int inByte = 0; // bejovo adat

void setup()
{
  Serial.begin(9600); // start serial port 9600 bps
  Serial.println("Start...");
  
}

void loop()
{
  inByte=!inByte; //itt a lenyeg!
  Serial.println(inByte,HEX);
    delay(100);
}
Mintakód (Edit -> Copy for Forum).
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Van még 1 rossz hírem!

Az a debug módszer jól néz ki.
De már nem fér bele az M168-asba!

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

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

SRAM vagy FLASH hiba?
Ekkora nem lehet a kód..... :(

Mondjuk az Arduino nem az, aki szűken bánik a kódmérettel :P .
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

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

kapu48 írta:Az a debug módszer jól néz ki.
De már nem fér bele az M168-asba!

:(
Ott valami más bibi lesz.
nálam a fordító ezt írta:Binary sketch size: 2,838 bytes (of a 30,720 byte maximum)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Arduino verzió? Panel? Telepítés ideje?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Nem tudom mi lehetett a tegnapi fordítási hiba oka?
Mára megszűnt! És nem tudom megismételni.
:lol:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Windows csillagállás.... :P
Válasz küldése