Fórum témák

» Több friss téma
Fórum » RFM12BS
 
Témaindító: Thowra, idő: Márc 6, 2009
Lapozás: OK   3 / 12
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 9, 2010 /
 
Van egy ilyenem a main-ben:
  1. if(!(PINC & (1<<PC4)))
  2.                 {
  3.                         PORTD |= (1<<PD0);
  4.                         rf12_send(0x32);
  5.                 }else
  6.                 PORTD &=~(1<<PD0);

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.
(#) Ant hozzászólása Márc 9, 2010 /
 
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
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 9, 2010 /
 
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.
  1. void send_frame(char* data)
  2. {
  3.         unsigned char n;
  4.  
  5. //      crc = crcFast(length,data);
  6.  
  7.         tx_mode();
  8.         rfxx_wrt_cmd(0);
  9.         rfxx_send(0xaa);                        // PREAMBLE
  10.         rfxx_send(0xaa);
  11.         rfxx_send(0xaa);
  12.         rfxx_send(0x2d);                        // ID
  13.         rfxx_send(0xd4);
  14.         rfxx_send(length);                      // LENGTH
  15.  
  16.         for(n=0;n<length;n++) {
  17.                 rfxx_send(*data);               // DATA
  18.                 data++;
  19.         }
  20.  
  21. //      rfxx_send(crc >> 8);                    // CRC
  22. //      rfxx_send(crc & 0xff);
  23.         rfxx_send(0xaa);                        // END
  24.         rfxx_send(0xaa);
  25.         rfxx_send(0xaa);
  26.         rfxx_off();
  27.  
  28. }


Kikommenteztem neked a CRC részt. Így el fog küldeni egy adatkeretet:
send_frame("Szia!");
(#) boldivi hozzászólása Márc 9, 2010 /
 
Á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.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 9, 2010 /
 
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ó...
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 9, 2010 / 1
 
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.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 9, 2010 /
 
É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:
  1. void rf12_send(unsigned char aByte) {
  2.         while(nIRQ_HI());
  3.         rfxx_wrt_cmd(0xb800+aByte);
  4. }

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?
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 9, 2010 /
 
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:
  1. #define PORT_SDIN       PORTD
  2. #define PORT_SCK        PORTD
  3. #define PORT_nSEL       PORTD
  4. #define PORT_nIRQ       PINB
  5. #define PORT_RF_SDO     PINB
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 9, 2010 /
 
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.

main.c
    
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 9, 2010 /
 
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.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 10, 2010 /
 
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?

main.c
    
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 10, 2010 /
 
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.
(#) mtibi77 hozzászólása Márc 10, 2010 /
 
Egy német oldalon találtam, RF12B config utility.
Nem tudom ismeritek-e, meg hátha használható.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 11, 2010 /
 
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.
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define nSEL    (1<<PB2)
  5. #define nIRQ    (1<<PD2)
  6. #define SDI     (1<<PB3)
  7. #define SDO     (1<<PB4)
  8. #define SCK     (1<<PB5)
  9.  
  10. #define nSEL_PORT       PORTB
  11. #define nIRQ_PORT       PORTD
  12. #define SDI_PORT        PORTB
  13. #define SDO_PORT        PORTB
  14. #define SCK_PORT        PORTB
  15.  
  16. #define nSEL_DDR        DDRB
  17. #define nIRQ_DDR        DDRD
  18. #define SDI_DDR         DDRB
  19. #define SDO_DDR         DDRB
  20. #define SCK_DDR         DDRB
  21.  
  22. int Init()
  23. {
  24.         nSEL_DDR |= nSEL;
  25.         nIRQ_DDR |= nIRQ;
  26.         SDO_DDR |= SDO;
  27.         SCK_DDR |= SCK;
  28.  
  29.         SPCR = (1<<SPE) | (1<<MSTR);
  30.  
  31.         return 0;
  32. }
  33.  
  34. int RFM12WriteCommand(unsigned int Cmd)
  35. {
  36.         SPDR = Cmd;
  37.         while(!(SPSR & (1<<SPIF))); //while ( (SPSR & 0x80) != 0x80 );
  38.  
  39.         return 0;
  40. }
  41.  
  42. int RFM12ReadCommand()
  43. {
  44.         while(!(SPSR & (1<<SPIF)));
  45.         return SPDR;
  46. }
  47.  
  48.  
  49.  
  50. int main()
  51. {
  52.  
  53.         Init();
  54.         DDRD = (1<<PD0) | (1<<PD1); // PD0, PD1 Output for LEDs
  55.         PORTC |= (1<<PC4) | (1<<PC5); // Pullup resistor on PC4, PC5
  56.  
  57.         while(1)
  58.         {
  59.                 RFM12WriteCommand(0x12);
  60.         }
  61.         return 0;
  62. }

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.
(#) (Felhasználó 4577) hozzászólása Márc 11, 2010 /
 
Még egy kicsit méricskéltem.
Csináltam egy ilyet:
  1. while(1)
  2.         {
  3.  
  4.                 rf12_init();
  5.  
  6.         }

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.

PIC_0003.JPG
    
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 11, 2010 /
 
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.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 11, 2010 /
 
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?
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 11, 2010 /
 
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.
(#) boldivi válasza boldivi hozzászólására (») Márc 11, 2010 /
 
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á.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 11, 2010 /
 
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?
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 12, 2010 /
 
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.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 12, 2010 /
 
Értem.

Nekem 868MHz-re kell állítanom. Másra nem is állíthatom, mert 868MHz-en tud adni és fogadni csak, igaz?
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 12, 2010 /
 
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.
(#) (Felhasználó 4577) válasza boldivi hozzászólására (») Márc 13, 2010 /
 
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?
(#) boldivi válasza (Felhasználó 4577) hozzászólására (») Márc 13, 2010 /
 
Benne van rf12_send() néven. Írd át!
(#) mtibi77 hozzászólása Márc 14, 2010 /
 
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.
(#) attila2 válasza mtibi77 hozzászólására (») Ápr 3, 2010 /
 
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é?
(#) NickE hozzászólása Máj 5, 2010 /
 
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.
(#) pipi válasza NickE hozzászólására (») Máj 5, 2010 /
 
10db-ot nem rendel neked a Chipcad?
(#) NickE válasza pipi hozzászólására (») Máj 5, 2010 /
 
100db a minimum.
Következő: »»   3 / 12
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