Fórum témák
» Több friss téma |
Van egy ilyenem a main-ben:
A PC4 egy nyomógomb, felhúzó ellenállással, a PD0 egy LED. Ha megnyomom a gombot, lefagy az egész program. Csatolom a teljes main.c-t és a kapcsolási rajzot. Mi lehet a gond? A programot minimálisan módosítottam, egy kicsit a send függvényt is, mert volt benne pár ismeretlen változó és egy if, ezeket kitöröltem.
Sziasztok!
Egy ilyen modulról van téma a taviron. Ott FIFO-val próbálkoznak, én is építettem ezzel kommunikációt, csak FIFO nélkül. Ha érdekel a bascom kód, akkor szívesen küldök ![]()
Szia!
Az recv függvényre gondolsz szerintem. Abban egy primitív kiléptető volt, nem fontos bele. Azt tesztelted, hogy ha átküldesz 1 byte-ot, akkor azt a vevő oldalon kiolvasod a regiszterből? Mert a programodban nem látok preamble-t és ID-t sem.
Kikommenteztem neked a CRC részt. Így el fog küldeni egy adatkeretet: send_frame("Szia!");
Ám nekem is lenne kérdésem.
![]() Csináltam egy pici nyomógombos távkapcsolót és egy pici rádiós hőmérőt. Az áldozat ezúttal az RFM02 modul. Más lábkiosztás, más programozás. Sajnos csapnivaló hatótáv és ha elaltatom a uC-t és a WDT miatt újraindul - ezáltal újra lefut az init rész -, nem ad semmit. Dokumentáció gyenge. Egy német fórumon találtam egy nagyon jó kódot, persze nem azt használom azért se, hanem a sajátjaimat. Nem értem mi lehet a gond. Gyárilag gyengébb az adóteljesítménye, mint az RFM12BS-nek? Mert ez utóbbival majdnem 500m-ig mértem stabil kapcsolatot /nem sétáltam messzebb/. Ha módosítom a kimeneti teljesítményt, akkor szintén bedöglik.
Szia!
Köszi a választ! Nem, nem ezt szeretném. Egyenlőre csak azt szeretném kiküldeni, hogy megnyomom az egyik gombot, hogy pl 0xd2 és a fogadót pedig beállítom, hogy ha olyat fogad, hogy 0xd2, akkor világítson egy LED. De a probléma az, hogy az nIRQ láb mindig 0 szinten marad. A kódban küldés előtt pedig arra vár, hogy magas szintre mennyen, de sosincs magas szinten, mindig 0-n van. Egyébként nagyon tetszik ez a modul. Csak jó lenne ha már működne. Ha működni fog, akkor bespajzolok még belőle kb. 4-et. Most kettő projekt van, amihez ilyen kellene, az egyik egy robot, a másik egy hőmérő, ami két helyen mér hőmérsékletet, jelzi ha a két hely közül az egyiken elmegy az áram, jelzi ha a hőmérséklet 5 fok alatt van, mindezt kb. 100m-re, 3 falon keresztül. Ha 500m-ig elmentél vele, az nagyon jó...
De ha a vevő oldalon engedélyezve van a bit sync akkor addig nem fog jelezni semmit, míg a preamble után meg nem érkezik az a két bájt.
Majd valaki kijavít ha rosszul tudom... Tehát ezt kellene kiküldened: 0xaa 0xaa 0xaa 0x2d 0xd4 0xd2 0xaa 0xaa 0xaa Ekkor a vevő oldalon a következőt fogod venni: 0xd2 ... a többi 0xaa is megérkezik, de ezzel nem kell már foglalkoznod. (a 0xd2-d nagyon hasonlít az ID egyik bájtjára ![]() Tehát a modul elintéz egyfajta azonosítást az ID segítségével.
Értem én.
Na de az a baj, hogy el sem küldi. Ezzel a függvénnyel próbálok küldeni, csak egy bitet, semmi többet, semmi premable-t, egy rém egyszerű adatküldést szeretnék:
A 2. sorban lévő while miatt nem megy tovább, mert amikor megnyomom valamelyik gombot, folyamatosan világít a LED, tehát ott megáll, az nIRQ nem megy magas szintre. Szkóppal vizsgálva az SDO és SDIN se nagyon változik, az SCK-se, az SCK-n bekapcsoláskor párszor magas szintre kerül egy pillanatra, kb. 10X (szkóp 10msec/DIV), az SDI is csak egy párszor, aztán magas szintre kerül és semmi, megállt az adat, nem küld többet. Az nem lehet, hogy rosszul inicializálódik? Nekem 868MHz-es modulom van, pontosan egy ilyen: http://www.hestore.hu/termek_10027960.html Az megfelel, ha inicializálásnál a frekvencia kiválasztásál a Reserved-et választja ki a szoftver? Nem inkább a 868MHz-et kellene? Felkommenteztem a while(nIRQ_HI());-t és megnyomtam a gombot, amíg nyomtam a LED világított, és az összes kommunkációs láb, kivéve az SDO magas szintre került annyi időre, amíg nyomtam a gombot, aztán alacsonyra, a szkópot több időállásban is kipróbáltam, de ez folyamatos magas szinten van, tehát szerintem nem is inicializálódik. Nem lehet, hogy az elején a #define-oknál rosszul állítottam be valamit? Mi lehet a hiba?
Elnézést. Ez van amikor az ember egyszerre több helyre figyel és fáradt.
Úgy látom az nIRQ nincs jól konfigurálva. A PORT_RF_nIRQ ne PORTx, hanem PINx legyen! Ez minden bemenetnél így legyen megadva! Példa egy programomból:
Semmi gond! Én is kezdek fáradni, 2 órakor elkezdtem hozzá NyÁK-ot gyártani és azóta nyúzom a két modult.
Tényleg! Javítottam. A jelenlegi állás szerint így néz ki a main-em, de még mindig semmi, csak magas szinten vannak a lábak. A kimeneti portok se voltak konfigurálva, ezt is megcsináltam, de semmi. Viszont az adatlapban található programmal működött! Láttam az adatforgalmat a buszon, viszont a zöld LED portján kb. 2V-ot mértem, ez érdekes. A vevő is működött, de mindkét LED folyamatosan világított. Már azt se tudom, hogy melyik kóddal foglalkozzak. ![]()
Kicsit meg lett kavarva. Működő kódot küldtem.A PORT_nIRQ nem használt, de a PORT_RF_nIRQ igen. De úgy látom még nem javítottad az előbbi hibát:
Helytelen: #define PORT_RF_nIRQ PORTB Helyes: #define PORT_RF_nIRQ PIND Mert úgy látom a csatolt rajzodon nem is a B porton van. De a bemenet miatt PIND-t kell mindenképp. Továbbá a PORT_RF_SDO se PORT legyen, hanem PIN! Mivel bemenet.
Tényleg, igazad van. A fáradtság.
![]() Kijavítottam, de még mindig nincs forgalom a buszon, semmi adat nincs, nem küld, nem fogad... Hiányos kódot küldtél, a definíció egy kisebb része hiányzott. Átnéznéd nekem még egyszer? A main-ben nem kell beállítani a rf12_freq függvénnyel a frekvenciát és a rf12_speed függvénnyel a sebességet?
A definiciókat neked kell elvégezned korrektül, áttekinthetően az adott környezethez.
Nézd át még egyszer az egész bekötését, vedd le a uC-ről a modult, mérd meg a lábakat, ez is árulkodik, hogy kimenet -e vagy bemenet. Egyelőre hanyagold a nyomógombos dolgokat.Késleltetés után kezdjen el adni valamit. Én szoktam az init után freq és speed beállítást is, de nem kötelező, mert az init részben - ha megfigyeled - benne van mindenhez egy alap beállítás. Biztos, hogy nincs semmi, pl amikor ráadod a tápfeszt? Nekem egyből működik, ezt a függvénygyűjteményt használom egyelőre - majd átírom szebbre. Egyébként elkészült az RFM02-höz is egy fájl, megoldottam az adatátviteli problémát (a moduláción kellett állítani). Megtaláltam a vezérlő IC-t és annak részletes adatlapja alapján írtam meg. Ha igény van rá szívesen megosztom.
Egy német oldalon találtam, RF12B config utility.
Nem tudom ismeritek-e, meg hátha használható.
A definíciókat újra átnéztem, mindent rendben találtam.
A bekötést megnéztem újra, kisípoltattam, hogy jó-e a NyÁK, minden rendben volt. Esetleg valami egyszerűbb projekted kódját megosztanád velem, amiben ilyen modul van és működik? Írtam egy kisebb programot, csak hardveres SPI-n küld és fogad és persze inicializál.
Valamiért nem küld semmit, ugyan az a probléma, ugyan azokon a lábakon és mindent újraírtam. A szoftver rendben van? Szerintem a szoftverben van valami hiba, mert két AVR közötti kommunikációt is próbáltam SPI-n, de akkor se akart működni.
Még egy kicsit méricskéltem.
Csináltam egy ilyet:
Rámértem az SCK-ra, megvolt az órajel, majd az SDI-re (modul SDI - AVR MOSI, modul SDO - AVR MISO igaz?) és a képen látható a szkóp ábra (1V/DIV), szerintem csak azért nem láttam, mert csak 1MHz-es a szkópom. Lehetséges ez? Az nSEL rendben van, csak pár mikroszekundumra kerül magas szintre. Akkor mégiscsak jó lenne, csak én nem látom? Triggerelni viszont tudom.
Ezek szerint jó.
Illeszd be a send_frame függvényt és azt tedd a ciklusba! A main pedig: rf12_init(); _delay_ms(50); rf12_speed(BPS_19200); rf12_freq(400); while(1) { send_frame("Hello!"); _delay_ms(500); } A csomag hoszza legyen beállítva "Hello!"-nál 6-ra!! Figyelheted szkóppal a buszt, de jobb ha beszerzel egy 433MHz-es vevőmodult és a kimenetére kötsz egy audio erősítőt és hallod benne a kattanásokat ha ad. Ez után jöhet a vevő rész.
Ma már nincs erőm kipróbálni, mert iszonyatosan fáj a fejem.
rf12_freq(400); Nekem 868MHz-es modulom van. Akkor nekem ez rf12_freq(868); lesz?
Nem!
Tanulmányozd az adatlapot! Szépen le van írva. Egyébként a Configuration Setting Command-nál is mást kell megadni, nem csak a freq setting-nél! Itt az adatlapja a vezérlő IC-nek: IA4421 adatlap Mint az elején írtam, nekem 433-as modulom van. De az adatlapból szépen kiderül mit kell mire módosítani 868MHz-es modul esetén. Pár regiszter értékét, a függvények változatlanok maradnak. Azt hittem van előtted adatlap és ezeket a beállításokat átnézted. Ha lenne 868-as modulom, nagyon szívesen megosztanám a konfigját. De az adatlap tanulmányozása után nem okozhat neked sem gondot. ![]()
Ezt le kell neked cserélni:
rfxx_wrt_cmd(0x80d7); Erre: rfxx_wrt_cmd(0x80e7); Adatlap 13. oldal. Nézd át, szükséges -e mást is módosítani! Illetve ha a példaprogram 868-ashoz készült, az ottani konfigra is pillants rá.
Természetesen olvasgatom az RFM12B adatlapját, még az asztalomra is kitettem a gépen, ki is nyomtattam.
Át fogom írni a megfelelőre. Én már egyszer átnéztem, úgy láttam, hogy mást nem kell átírni, csak ezt. Holnap délután jelentkezek az eredményekkel. Sajnos nem tudok beszerezni vevő modult, hogy vehessem a jelét, csak egy másik ilyenem van. Adat küldéskor a preample-t muszáj elküldeni? Egyébként mi lenne ez a preamble?
Még nézd át a frequency setting-et is. A 15. oldalon van a számítási módja.
f0 = 10 * C1 * (C2 + F/4000) [MHz] 868MHz modul esetén: C1=2, C2=43 Pl: ha a 400-at hagyod a freq függvényben, akkor 862MHz-re lesz állítva. Ha 1600, akkor pontosan 868MHz-re állítod. A preamble kell. A vevő ez idő alatt felkészül az adatok vételére. Ez után várja az ID-t: 0x2d 0xd4. Ha ez a két bájt is megérkezett az ez után következő bájtok bekerülnek az adatregiszterbe (vagy fifo-ba) és innen kiolvashatod.
Értem.
Nekem 868MHz-re kell állítanom. Másra nem is állíthatom, mert 868MHz-en tud adni és fogadni csak, igaz?
Kb. 868MHz-re. Az adatlapban szintén benne van a tartomány, amit tud. Illetve figyelembe kell venni az aktuális frekvenciákra vonatkozó engedélyt.
A send_frame függvényben meg van hívva a rfxx_send függvény. Elküldenéd nekem, mert még nem küldted el.
Vagy rfxx_send = rf12_send?
Benne van rf12_send() néven. Írd át!
Egy kis help kéne:
A vétellel van egy kis gondom. Teljesen jól tudom olvasni a status reg-et, az FFIT bit mindig 1, de az nIRQ láb soha nem megy 0-ba. Hogyan használjátok, interrupt vagy polling módban? Az nFFS, FFIT lábak be vannak kötve? VDI-re led-et rakva folyamatosan összevissza villog, másoknak is? Én úgy képzelem a dolgot, hogy kellene egy megszakitás, amire el tudnám indítani a vevő subrutint. Ha csak folyamatosan $B000, CA80, CA83 irok, olvasok, akkor soha nem kapom el az elejét a vételnek. Köszi előre is a válaszokat.
Nem vagyok nagy guru a témában, de ha a FIFO command-ban beállítod a synchron pattern szűrőt, akkor a csomag elején küldendő AA,AA,AA,2D,D4....... utáni rész fog összegyűlni a fifóban, annyi bit amennyit FIFO IT level-en beállítottál. Amikor eléri a beállított számú bitet a FIFO, küld egy megszakítást az nIRQ lábra. És máris olvashatod a szinkronizált adataidat.
Az nIRQ azért van folyton alacsonyan, mert elfelejtetted törölni a státusz regisztert és ugye nIRQ-nak feladata hogy figyelmeztessen. Még ha néhányan hibának is vélnénk a dolgot. Az nIRQ egy korrekt megoldás! A FIFO olvasásnak több modja is van, mindegyik egyszerűb mint ahogyan leírták! Sokáig tudám még írni a működéssel kapcsolatos dolgokat de kicsit leköt a saját nyűgőm De ha már témánál vagyok! Elkélne egy kis segítség nálam is. Van köztetek valaki, aki segítene összehozni egy működő szoftvert RFM01 és RFM02 közé?
Nekem RFM12 kellene, mert az 5V verzió. Sajnos sem a ChipCAD-ben, sem máshol nem látok ilyet.
A HopeRF honlapján van egy Sample/low volume order link, amire klikkelve lehet rendelni, amiből arra lehet következtetni, hogy kis mennyiséget rendelőkkel is szóba állnak, de nem jött válasz. Írtam a sales email címükre is, hogy 10db érdekelne, de semmi. Van itt olyan, aki rendelt már tőlük? Nem tudom, hogy komolytalan a cég, vagy a mennyiség nem túl motíváló tényező, ..., azért legalább válaszra méltathatnának. |
Bejelentkezés
Hirdetés |