Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   14 / 852
(#) szitko hozzászólása Dec 9, 2013 /
 
Sziasztok.

Egy kicsit elkeveredtem a Timer kusza ösvényén.
Inicializálásnak ennyi a beállításom:
TCCR1A = 0;
TCCR1B = 0x01;
Ezt követően ugye elindul a számlálás a TCNT1 regiszterben. Eddig érthető is. A problémám a TIFR1 OCF1A bitjével van. Mikor törlődik, illetve áll 1-be ez a bit/flag? Ha a TCNT1 = OCR1A-val?
Arduino uno (Atmega328p), Arduino IDE keretrendszer.
(#) csabeszq válasza szitko hozzászólására (») Dec 10, 2013 /
 
Pontosan.

TIFR1

- Amikor esemény történik a bit egybe állítódik.
- Amennyiben engedélyezed a megszakítást az eseményen (interrupt), akkor a megszakítás meghívódik és a bit automatikusan törlődik.
- Amennyiben nincs megszakítás, a bitet neked kell törölni

TIFR1 = _BV(OCF1A) -val

- Amikor a regisztert írod, azok a bitek fognak törlődni, ahol 1-et állítottál be. A fenti utasítás kizárólag a OCF1A-t fogja törölni.

Az egyes bitek jelentése:

ICF1 - Input Capture flag - van egy komparátor is az Atmega328P-ben. A timer1-et rákötheted a komparátorra. Amikor a komparátoron felfutó / lefutó él esemény történik, akkor bekapcsol és TCNT1 beíródik az ICR1-be, amivel pontosan tudsz például periódusidőt mérni.

OCF1B - TCNT1 eléri az OCR1B-ben tárolt értéket

OCF1A - TCNT1 eléri az OCR1A-ban tárolt értéket

TOV1 - a számláló túlcsordul. Ez attól függ, hogy milyen üzemmódban van, beállítástól függően 0xFFFF-nél, OCR1A elérésénél, vagy ICR1 elérésénél tud túlcsordulni
A hozzászólás módosítva: Dec 10, 2013
(#) szitko válasza csabeszq hozzászólására (») Dec 10, 2013 /
 
Nagyon szépen köszönöm.

Így már érthetőbb. Akkor az alábbi kis kódrészletem is jó lesz: Legalábbis remélem.
  1. #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
  2. ....
  3.  
  4. timer1_value = TCNT1 + PERIOD; // Timer érték másolása változóba
  5. OCR1A = timer1_value; // változó másolása output compare regiszterbe
  6. ...
  7. sbi(TIFR, OCF1A);  // OCF1A bit=1, flag törlése
  8. loop_until_bit_is_set(TIFR, OCF1A); // egy túlcsordulás kivárása, fontos! OCF1A bit = 0?
  9. ...

(Ez a törlés, 1-be állítás zavar össze.)
(#) csabeszq válasza szitko hozzászólására (») Dec 10, 2013 /
 
Ezt nem így kell csinálni (bocs).

timer1_value = TCNT1 + PERIOD;

Ez simán késik. Gondolj bele, hogy egy assembly utasítás 1-8 órajelet is igénybevehet. A leghalványabb fogalmad sincs ebben az esetben arról, hogy milyen időközönként jár le a timer. Ha meg még interrupt is van mellette (márpedig Arduinon van), akkor brutális késések lehetnek (>100 órajel).

A WGM10-WGM11-WGM12 biteket állítsd 1-re (fast pwm mód), az OCR1A-t pedig PERIOD-ra.

Ezután azt kell ellenőrizned, hogy a TOV1 bit beállításra került-e (overflow). Vedd észre, hogy a OCR1A (PERIOD) elérése és TOV1 beállítása után a timer magától azonnal! újraindul 0-ról. Teljesen független tőle, hogy az éppen végrehajtott utasítás 1 vagy 10 órajelet vett igénybe.

Ha az aktuális TCNT1-hez igazítod az órát, akkor simán késhetsz vele, nem is keveset. Az átlalam javasolt megoldás garantálja, hogy a timer hajszálpontosan PERIOD órajel után fog újraindulni. Mintavételezéshez ezt javaslom.

Ha 1000-re állítod a PERIODOT és 100 minavételezést szerentél, akkor a megoldás pontosan 100.000 órajelet fog igénybevenni. Se többet. se kevesebbet. Emellett rövid interruptok is lehetnek.
A hozzászólás módosítva: Dec 10, 2013
(#) szitko válasza csabeszq hozzászólására (») Dec 11, 2013 /
 
Kösz, így már lassan világossá válik a Timer.
(#) icserny hozzászólása Dec 12, 2013 /
 
HMC5883L mágneses szenzorhoz ("iránytű") a Love Electronics honlapján találtam leírást és mintapéldát Arduino-hoz. Mivel a mintapélda kiterjesztése .pde volt, nyilvánvalóan régebbi Arduino környezethez készült. Emiatt a kódot aktualizálnom kellett az Arduino 1.05-höz (anélkül le sem fordult). Mellékelem, hátha valakinek kell.

A mintaprogam (HMC5883L_Example.ino) elején a
  1. float declinationAngle = 0.0457;

sort aktualizálni kell: az adott hely deklinációját kell megadni, radiánban. Az adott földrajzi hely deklinációja a http://magnetic-declination.com/ webhelyen tudható meg.

A loop() függvény végére beraktam egy 2 másodperces késleltetést, mert nem győztem olvasni a terminálablakba kiöntött adatokat. Akinek nem kell, vegye ki!

Nekem a képen látható kivitelű szenzorom van, ezen már rajta vannak az I2C busz felhúzó ellenállásai.
(#) acerola hozzászólása Dec 12, 2013 /
 
Sziasztok. Most érkezett egy kijelző modul kínából, de nem tudtam feléleszteni.
http://tronixstuff.com/2012/03/11/arduino-and-tm1638-led-display-modules/

Először fordítva kötöttem rá a gnd és 5v-ot. A hátulján van a jelmagyarázat de az eleje felől kell érteni.
Amikor a helyes irányból kötöm rá az arduinora, akkor leáll az arduino is. Az on led elhalványodik majd kialszik.
Rámértem a gnd és vcc bemenetekre és 10 k az ellenállás köztük. Ez már zárlat?
Szerintetek hibás modul vagy én rontottam el? Csak hogy próbáljak-e reklamálni a forgalmazónál.
(#) Gafly válasza acerola hozzászólására (») Dec 13, 2013 /
 
Ezt szerintem te rontottad el. Szegény forgalmazó nem tehet róla...

Ha nincs rátéve a modul, akkor megy az Arduinó?
Miről táplálod őket? Nem lehet hogy csak a tápod nem bírja a terhelést?
Idézet:
„Please note that each module set to full brightness with every LED on consumes 127mA, so it would be wise to use external power with more than one module and other connections with Arduino boards.”
(#) acerola válasza Gafly hozzászólására (») Dec 13, 2013 /
 
Ha nincs rátéve, akkor megy. Amint rádugom elhalványul az on led és kialszik. Mintha zárlatos lenne. Próbáltam 2A tápról is ugyanaz a helyzet. Alapból egyébként nincs bekapcsolva rajta semmi a terhelésnek is kisebbnek kéne lennie.

Egyébként ajánlom a modult. Nagyon olcsón lehet numerikus kijelzőhöz 8 kapcsolóhoz és 8 db két színű ledhez jutni, aminek a vezérlése csak 3 portot foglal.

http://dx.com/p/8x-digital-tube-8x-key-8x-double-color-led-module-81873
(#) acerola válasza valaki2 hozzászólására (») Dec 14, 2013 /
 
Sikerült megoldani az eclipse-es dolgot?
Szerintem az 1-es ponttal lesz a gond.
(#) tcsonka hozzászólása Dec 18, 2013 /
 
Sziasztok

Adott egy egyszerű Webszerver arduino-val megvalósítva és egy ENC28J60 ethernet vezérlő. Az IP címe jelen esetben 192.168.1.10. Belső hálózatról a böngészőbe beírva az IP címet megjelenik a Webszerver által küldött információ. A hálózaton kívülről (Internet) hogyan tudom elérni a mikrovezérlőt? A routert sikerül elérnem, de hogyan jutok el az ENC28J60-ig? A routerben csináltam 'portforwarding'-ot a 80-as portra.
(#) Norberto válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
Idézet:
„A hálózaton kívülről (Internet) hogyan tudom elérni a mikrovezérlőt?”


Ha a port forwarding megfelelően be van állítva, azaz aktivált/éles, akkor 2 módszer lehetséges. A router-ből kiolvasható, hogy a szolgáltatódtól milyen IP címet kaptál. Ezt az IP címet a világháló felől beírva, elvileg már látszódnia kell az Ethernet vezérlődnek. A másik lehetséges mód, amikor webcím alapján szeretnéd elérni az internet felől a vezérlőt; ekkor a vásárolt/ingyenes weblap DNS-beállításainál kell állítgatni, hogy ha a szolgáltatód új IP-t oszt ki neked, akkor az internet felől "követve" legyen a hálózatod / vezérlőd tartalma.

Szóval elméletileg a port továbbítás funkció az jó irány. Esetleg tűzfal, ami még eredményezhet olyat, hogy nem látszik elérhetőnek a hálózatod az internet felől.
(#) tcsonka válasza Norberto hozzászólására (») Dec 18, 2013 /
 
A portforwarding elvileg jó. DE mit kell beírnom a böngészőbe, hogy a 192.168.1.10-es belső IP-jű eszközt lássam. A router-re ugye több eszköz is csatlakozik (számítógép egy másik belső IP címmel)
(#) Norberto válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
Idézet:
„DE mit kell beírnom a böngészőbe, hogy a 192.168.1.10-es belső IP-jű eszközt lássam.”


A router-ből kiolvasható, hogy a szolgáltatódtól milyen IP címet kapott a router-ed, amikor a szolgáltatódhoz csatlakozni sikerült. Ezt az IP címet a világháló felől beírva, elvileg már látszódnia kell az Ethernet vezérlődnek.

Pl. ilyesmi IP cím lesz, amit keresned kell a router hálózati státusz / diagnosztikai oldalán: 89.152.120.31, tehát valószínűleg 89-cel fog kezdődni...
A hozzászólás módosítva: Dec 18, 2013
(#) kokozo válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
(#) kocsgab002 válasza Norberto hozzászólására (») Dec 18, 2013 /
 
Az a baj, ha a szolgáltató dinamikus IP-t osztogat, akkor minden újracsatlakozáskor megváltozik az IP-d. Erre a problémára találták ki a myip.com, vagy a DynDNS.com oldalt, ahol regisztrálsz, és fix IP-t kapsz, és onnantól bármikor eléred a gépedet, vagy a routert.
(#) tcsonka válasza Norberto hozzászólására (») Dec 18, 2013 /
 
Ha a router külső IP címét írom be, akkor megjelenik a router felhasználónév és jelszóbekérő ablaka. Ha beírom ezeket akkor pedig belépek a router kezelőfelületébe. De az ethernet vezérlőt így nem tudom elérni. Ha az ethernet vezérlőnek megadom, hogy mondjuk a 15000-es porton működjön, akkor a belső hálózatból a 192.168.1.10:15000-et beírva a böngészőbe elérem. Ha kívülről próbálom a router IP címével Pl: 87.97.x.x:15000 akkor nem. (portforwarding természetesen beállítva) Így kellene egyébként elérni?
A hozzászólás módosítva: Dec 18, 2013
(#) Norberto válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
Idézet:
„Így kellene egyébként elérni?”


Igen, elvileg ilyen módon kellene tudni elérni.
(#) szitko válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
Plusz még, vagy a Windows tűzfalnál, vagy a vírusirtódban is engedélyezned kell a portot, hogy elérd "kívülről".
(#) tcsonka válasza szitko hozzászólására (») Dec 18, 2013 /
 
A windows-ban miért kell? Nem feltétel, hogy a számítógép bekapcsolt állapotban legyen.
(#) szitko válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
Belső hálózatnál gondoltam. Nekem nem engedte a hozzáférést, míg a Windows tűzfalán nem engedélyeztem a port hozzáférését. (Win7x64)
(#) Norberto válasza tcsonka hozzászólására (») Dec 18, 2013 /
 
Annyi lehet még a dolog hátterében, hogy lehetséges, hogy a szolgáltatód blokkolta a 80-as portot, azaz nem volt alapvetően engedélyezve saját, "otthoni" weblap működtetése. Ilyenről is hallottam már...
(#) szitko hozzászólása Dec 22, 2013 /
 
EEPROM írás/olvasási hibába ütköztem. rövid prg.:
  1. #define EEPROMval 16
  2. byte EEvalue = 0;
  3. ...
  4. void write_eeprom(){
  5.   if (EEvalue != EEPROM.read(EEPROMval))
  6.     EEPROM.write(EEPROMval, EEvalue);
  7. }

A lényeg: minden új értékadás után mentem az "EEvalue" értékét az EEPROM-ba. (Értéket "kívülről /gombokkal/" adok a változónak, és a mentés is gombnyomásra történik.) A gondom az, hogy 2-3 mentés után, a kiolvasott érték 1. Ha pl. mentek decimális 10-et, és kiolvasom, akkor a kiolvasott érték 1 lesz. Mitől lehet ez? Írás előtt törölnöm kéne a kiválasztott EEPROM címen lévő bájtot?
(#) pepe1125 hozzászólása Dec 26, 2013 /
 
Sziasztok! Itt a karácsonyi játékban egy olyan problémába futottam bele, hogy:
  1. if (Serial.find("L")) {
  2.         rgb();
  3.         }
  4.   if (Serial.find("T")) {
  5.     processSyncMessage();
  6.     }

miért nem működik ez így?

Soros porton küldök a kontrollernek a beállításhoz szükséges adatokat:
RGB LED színe pl: L255,255,255 -> Ezzel tudom a LED-ek fényerejét 0-255 között változtatni, működik is. Viszont a T1388024810 kódot nem veszi be, csak akkor ha együtt küldöm L255,255,255T1388024810 ebben a formában! De mi a baj az if függvénnyel? Miért nem tudja eldönteni ha az L karaktert kapja akkor az rgb() függvényem hívja meg, és miért nem tudja ha a T karaktert kapja akkor a processSyncMessage() -et hívja meg?!

Tipp? Miben van a hiba?!
A hozzászólás módosítva: Dec 26, 2013
(#) icserny válasza pepe1125 hozzászólására (») Dec 26, 2013 /
 
Idézet:
„De mi a baj az if függvénnyel?”
Azzal semmi. A gondot a Serial.find() függvény használata okozza, ami a meghívásakor minden bejövő karaktert eldob, amíg egy 'L' karakter nem érkezik. A program tehát pontosan azt csinálja, amit előírtál neki.

Idézet:
„Serial.find() reads data from the serial buffer until the target string of given length is found. The function returns true if target string is found, false if it times out.”
(#) pepe1125 válasza icserny hozzászólására (») Dec 26, 2013 /
 
Értem! Köszi!

Viszont akkor nincs lehetőség ilyesmit megmondani neki, hogy ha L betűt kap akkor arra ezt csinálja, vagy ha T-t kap akkor azt.
(#) icserny válasza pepe1125 hozzászólására (») Dec 26, 2013 / 1
 
Idézet:
„Viszont akkor nincs lehetőség ilyesmit megmondani neki”
Van lehetőség, csak másik függvényt kell használni. Például a Serial.available() mintapéldájából is ki lehet indulni:
  1. int incomingByte = 0;   // for incoming serial data
  2.  
  3. void setup() {
  4.         Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
  5. }
  6.  
  7. void loop() {
  8.  
  9.         if (Serial.available() > 0) {
  10.                 // read the incoming byte:
  11.                 incomingByte = Serial.read();
  12.  
  13.                 //Itt lehetne vizsgálni, hogy az incomingByte
  14.                 //értéke 'L', 'T', vagy valami más.
  15.         }
  16. }
(#) pepe1125 válasza icserny hozzászólására (») Dec 26, 2013 /
 
  1. while (Serial.available() > 0) {
  2.  
  3.     incomingByte = Serial.read();
  4.  
  5.   if (incomingByte=='L') {
  6.         rgb();
  7.         }
  8.   if (incomingByte=='T') {
  9.     processSyncMessage();
  10.     }
  11.   }
  12. }


Kösz, így megoldva

Mi a különbség a 'L' és "L" között?
(#) icserny válasza pepe1125 hozzászólására (») Dec 26, 2013 / 1
 
Idézet:
„Mi a különbség a 'L' és "L" között?”
Ugyanaz, ami a betű és a szó között.

'L' - egy darab karakter
"L" - egy szövegkonstans (itt és most egybetűs, de lehetne több is), amelyhez többnyire hozzáértendő egy lezáró nulla értékű bájt is.
(#) ISF79 válasza icserny hozzászólására (») Dec 27, 2013 /
 
Szia!

Azt meg tudod mondani, hogyan lehetne egy karakter helyett szövegkonstans-t figyeltetni?

"on" -ra kapcsoljon be a led, ne mondjuk 'L' -re.

Előre is köszi.
Következő: »»   14 / 852
Bejelentkezés

Belépés

Hirdetés
XDT.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