Fórum témák

» Több friss téma
Fórum » Arduino
 
Témaindító: groening, idő: Szept 28, 2008
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   706 / 706
(#) vargham válasza kriszrap hozzászólására (») Kedd, 9:54 /
 
Arduino kód lassú. A digitalWrite különösen. A shiftOut pedig digitalWrite-ot hívja ciklusból.
Közvetlen port regiszter írással lehetne rajta gyorsítani.
(#) kriszrap válasza vargham hozzászólására (») Kedd, 10:11 /
 
Köszönöm a gyors választ .
Akkor lenne egy bit es kérdésem Megpróbálom igy lerajzolni.
led[y][z]=BIN X;
tömb a formációja.
Azt szeretném 1. lévő értéket elkezdem balra shiftelni és amikor elérte a 8 bitet akkor át töltse
2. 8 bitjébe
aztán azt az értéket
3. 8bitjébe
........

Vagy is vizuális ha z irány is ezzel az elvel megcsinálom akkor körbe futt a pl szám az egész ledkockán.

  1. 8.00000000
  2. 7.00000000
  3. 6.00000000
  4. 5.00000000
  5. 4.00000000
  6. 3.00000000
  7. 2.00000000
  8. 1.11001100
  9.  
  10.  
  11. 8.00000000
  12. 7.00000000
  13. 6.00000000
  14. 5.00000000
  15. 4.00000000
  16. 3.00000000
  17. 2.10000000
  18. 1.10110000


Erre van valami frappáns megoldás? Hogy lehetne shiftelést áttölteni egy másik tömbbe?
(#) majkimester válasza kriszrap hozzászólására (») Kedd, 11:07 / 1
 
Ilyen alapból nincs, de megoldható:

- shifteled a legutolsó byte-ot
- teszteled az előtte lévő byte legfelső bitjét, ha az 1 akkor növeled a legutolsó byte-ot 1-gyel
- shifteled az előtte lévő byte-ot
- így tovább az összes byte-ra

Valami ilyesmi egydimenziós tömbbel:

  1. byte led[8];
  2.       for(i=7;i>=0;i--)
  3.       {
  4.          led[i] = led[i] << 1;
  5.          if (i>0 && (led[i-1] & 0x80)!=0) led[i]++;
  6.       }
A hozzászólás módosítva: Kedd, 11:08
(#) kapu48 válasza kriszrap hozzászólására (») Kedd, 12:25 /
 
A char x,y,z; értéke csak pozitív egész szám lehet 0...255-ig!
A -1 feltétel nem jó! for(z=7;z>-1;z--)...
(#) kriszrap válasza kapu48 hozzászólására (») Kedd, 13:19 /
 
Majkimester köszönöm.

Kapu48 -1 re nem igy megy az érték.
(#) majkimester válasza kapu48 hozzászólására (») Kedd, 13:45 /
 
Sajnos az Ardiuno leirás egyértelműen nem mondja ki, hogy a char előjel nélküli vagy előjeles típus, méretre is csak annyit mond hogy minimum 8 bit. Továbbá létezik az unsigned char, ami meg azt sugallja, hogy a sima char előjeles. Igazából a háttérben lévő gcc forditó a char típust alapból előjelesen kezeli, de megadható neki a -funsigned-char command line paraméter amivel meg előjel nélküli lesz. Nem tudom az Arduino használja-e ezt a paramétert. Ugyan a doksiban nincs benne, de leírhatod a char helyett azt is hogy signed char, és akkor egyértelműen előjeles. De én például mindig typedef-fel használom:

  1. typedef unsigned char u08;
  2. typedef signed char s08;
  3.  
  4. ...
  5.  
  6. u08 u = 0;
  7. s08 s = -1;
(#) kapu48 válasza kriszrap hozzászólására (») Kedd, 13:46 /
 
A feltétel z>-1 = z nagyobb mint -1! Mindig igaz marad.
Ezért sosem lesz vége a for ciklusnak!
Bővebben: char Link
The size of the char datatype is at least 8 bits. It’s recommended to only use char for storing characters. For an unsigned, one-byte (8 bit) data type, use the byte data type.
(#) kapu48 válasza majkimester hozzászólására (») Kedd, 13:52 /
 
A char típust karakter kódok tárolására találták ki.
Akkor a 128-nál nagyobb grafikus vagy ékezetes karaktereket mínusz előjelesként, hogyan tudná értelmezni a fordító?
A hozzászólás módosítva: Kedd, 13:55
(#) majkimester válasza kapu48 hozzászólására (») Kedd, 14:06 /
 
Az, hogy előjeles vagy nem a karakter tárolása szempontjából mindegy. Legyen 8 bit egymás után, és kész. Egy karakter kód esetében semmi értelme az előjelességet vizsgálni.

A előjelesség csak akkor jön képbe, ha műveletet akarsz végezni az adott változóval. Ezt nyilván karakterrel is lehet, pl. char c = 'a' + 15; Ha egyértelműsíteni akarod mi is történik, akkor mindig eléírod hogy unsigned vagy signed, vagy használod a fent említett typedef-et.

Ami inkább érdekes, hogy azt írja az arduino leírásban, hogy minimum 8 bit, azaz bizonyos platformokon, lehet, hogy UTF-16 karaktert értenek alatta?
(#) kapu48 válasza majkimester hozzászólására (») Kedd, 14:12 /
 
Éppen ezért kifogásoltam a for ciklusokban alkalmazott char z<-1 feltétel használatát!
Bővebben: Link a hsz.-re

Akkor ide teszem lefordítva az ajánlást amit szintén idéztem:
A char adattípus mérete legalább 8 bit. Javasoljuk, hogy a karaktereket csak karakterek tárolására használja. előjel nélkül, egybájtos (8 bites) adattípus esetén használja a bájtos adattípust.
A hozzászólás módosítva: Kedd, 14:18
(#) kriszrap hozzászólása Kedd, 15:31 /
 
Rendben.
Akkor kijavítom >=0 re akkor gondolom jó lesz.
char azért használom mert amikor 1...8 kell for ciklust csinálni elég rá bőven és ram ot nem pazarlom annyira.
(#) tbarath válasza kriszrap hozzászólására (») Kedd, 15:41 /
 
Idézet:
„char azért használom mert amikor 1...8 kell for ciklust csinálni elég rá bőven és ram ot nem pazarlom annyira.”

Akkor használj byte-ot: Bővebben: Link
Vagy unsigned char-t (ami ugyanaz, mint a byte).
(#) zosza18 hozzászólása Kedd, 19:29 /
 
Sziasztok!

Kérdésem a következő lenne...
Mérnem kellene egy rakodógép motorjának a fordulatát, majd a későbbiekben tovább foglalkozni vele, de jelenleg a fordulat mérés a lényeg.
PNP-s jeladó van gyárilag benne, amit ISR-el figyelek. Ez részben működik is, viszont 20x4 I2C lcd-re is ki kellene írni közben, hogy látható is legyen.
Mivel delay-t nem lehet használni, így a kijelzés konkrétan csak van, de nem látható. Ötletet várnék arra, hogyan kellene a kijelzés frissítési idejét kb 1-2mp-re kitolni, míg maga a megszakítás rész nyugodtan fut?
Előre is Köszönöm a segítséget!
Mellékletben a példaprogram.
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. LiquidCrystal_I2C lcd(0x27,20, 4);
  4.  
  5. float value=0;
  6. float rev=0;
  7. int rpm;
  8. int oldtime=0;
  9. int time;
  10. int kijelzes = 0;
  11.  
  12. void isr() //interrupt service routine
  13. {
  14. rev++;
  15. }
  16.  
  17. void setup()
  18. {
  19. lcd.init();
  20. lcd.backlight();
  21. lcd.clear();
  22. lcd.setCursor(2,0);
  23. lcd.print("- Fordulatszam - ");
  24. lcd.setCursor(9,2);
  25. lcd.print(" RPM");  
  26. attachInterrupt(0,isr,FALLING);  //attaching the interrupt
  27. }
  28.  
  29. void loop()
  30. {
  31. detachInterrupt(0);           //detaches the interrupt
  32. time=millis()-oldtime;        //finds the time
  33. rpm=(rev/time)*60000;         //calculates rpm
  34. oldtime=millis();             //saves the current time
  35. rev=0;
  36. attachInterrupt(0,isr,FALLING);
  37. lcd.setCursor(4,2);
  38. lcd.print("     ");
  39. lcd.setCursor(4,2);
  40. lcd.print(rpm);
  41. }
(#) kapu48 válasza zosza18 hozzászólására (») Kedd, 20:10 / 1
 
Itt javasoltam tanfolyamot a multitaskingra:
Bővebben: Link
22. oldal Időzítés – késleltetés nélkül
23. multitasking.ino

És fontos a time változók legyenek:
  1. unsigned long oldtime=0;
  2. unsigned long time;
A hozzászólás módosítva: Kedd, 20:16
(#) zosza18 válasza kapu48 hozzászólására (») Kedd, 20:50 /
 
Szia!
Köszönöm szépen!
Holnap átnézem a linkelt infót!
Következő: »»   706 / 706
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem