Fórum témák

» Több friss téma
Fórum » ENC28J60 ETHERNET vezérlő használata
 
Témaindító: pkedvessy, idő: Júl 4, 2006
Témakörök:
Lapozás: OK   17 / 17
(#) Sick-Bastard válasza Panhard hozzászólására (») Nov 10, 2014 /
 
Üdv!

E-mail küldése engem is érdekelne, de még nem próbáltam. Csak most lettem meg a http nagy részével(számomra szükséges).
Az SMTP Protocolról, működéséről, használatáról találtál anyagot/leírást?
(#) Mészy hozzászólása Feb 21, 2015 /
 
Üdv mindenkinek!

Nekem nem működik 255 feletti portszámokon az eszköz weboldalas elérése. Ping-re válaszol de nem tudom elérni webservert ami rajta van. Beállítom a portot de nem működik. Találkozott már valaki ilyen problémával?

Előre is köszönöm!
(#) lastewer hozzászólása Márc 25, 2015 /
 
Neked legalább válaszol a pingre , nekem semmire sem
(#) wincso hozzászólása Aug 16, 2017 /
 
Sziasztok!
Segítséget szeretnék kérni!
Szeretnék egy olyan áramkört építeni ,amivel interneten keresztül 1 relét lehet vezérelni . Mikroc-ben írt programot letöltöttem , prozeus-ba betöltöm , de nem működik , hívásakor weblap nem elérhető, és a küldő buffer túlcsordul , állandóan változó időközönként.
Ezzel próbálkozom
http://www.studentcompanion.co.za/web-based-control-and-monitoring-...ikroc/

Előre is köszi
(#) hotau hozzászólása Aug 21, 2017 /
 
Szép estét!
Abban szeretnék segítséget kérni, hogy hogy tudok UDP segítségével int vagy double típusú változó értékét kiküldeni, mert eddig csak karakter tömbnek az elemeit sikerült.
Eddig ezt a kódot próbáltam:

  1. #include <EtherCard.h>
  2. static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
  3. static byte myip[] = { 192,168,0,180 };
  4. static byte gwip[] = { 192,168,0,254 };
  5.  
  6. byte Ethernet::buffer[500];
  7. static uint32_t timer;
  8.  
  9. const int dstPort PROGMEM = 80;
  10. const int srcPort PROGMEM = 80;
  11.  
  12. void setup () {
  13.   if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
  14.     Serial.println( "Failed to access Ethernet controller");
  15.    ether.staticSetup(myip, gwip);
  16.   ether.printIp("SRV: ", ether.hisip);
  17. }
  18. char textToSend[] = "test 123";
  19. void loop () { 
  20.     if (millis() > timer) {
  21.       timer = millis() + 5000
  22.      ether.sendUdp(textToSend, sizeof(textToSend), srcPort, ether.hisip, dstPort );   
  23.   }
  24. }



Gondoltam arra, hogy a karakter tömböt módosítom, int tömbre, de nem működött.
Gondoltam még arra is, hogy az int, típust konvertálom karakterré, amit belerakok a karakter tömbbe, de az se vált be.

Ha valaki tud, valami jó ötletet erre az írja, le legyen szíves.
A segítséget előre is köszönöm.
(#) koverg70 válasza hotau hozzászólására (») Aug 22, 2017 /
 
Szia!

Nem ismerem pontosan azt a könyvárat, amit használsz, de feltételezem, hogy a sendUdp egy byte tömböt küld el. A kérdésed, tehát nem is ENC28J60 specifikus, hanem inkább C nyelv és különböző típuok (karakter tömb, egész szám, lebegőpontos szám) ábrázolása az adott nyelven és az adott platformon. Igen sajnos ez processzor, illetve mikro vezérlő specifikus is.

Hogyan konvertáljunk egy int-et byte tömbre:
1. Első lehetőség, hogy vesszük az int változó címét a memóriában. Már önmagában ez is platform specifikus, mert nem mindegy, hogy a program memóriában, a heap-en (malloc-kal allokált), vagy a stack-en (lokális változó) van. Ha ettől most eltekintünk, akkor ezt így tudod megcsinálni:
int numToSend = 1234;
ether.sendUdp(&numToSend, ...)
Ha minden jól megy az & jelenti azt a címet, amelyen a numToSend változót tárolja a programod. A cím egyben egy byte tömböt is jelent.
Itt mindjárt álljunk is meg. Egyrészt attól függően, hogy 8/16 vagy 32 bites a processzot / mikro vezérlő más lesz az átküldendő int mérete: 2 vagy 4 byte. Ezért inkább ne is int-et, hanem WORD-ot vagy DWORD-öt küldj át. A WORD 16 bit, azaz 2 byte a DWORD 32 bit, azaz 4 byte.
Ha ezen túl vagyunk, akkor következik a tárolás módja. Van olyan CPU, amely a legkisebb helyiértékeket tárolja a végén (little-endian) és van amelyik a nagyobbakat (big-endian).
Arra jutottunk, hogy ha így csinálod, akkor platform függő leszel. Ha mondjuk két ATMEGA 328 között küldözgetsz, akkor akár jó is lehet, de ha a 64 bites PC-n Windows vagy Linux alatt nézed, akkor már ne.

2. Egy előbbinél jobb lehetőség, ha te definiálod a konverziót és mind a küldő, mint a vevő oldalon ugyanúgy alakítod ki. Küldésnél pl.:

unsigned char bytesToSend[4];
DWORD numToSend = 1234;

bytesToSend[0] = (numToSend >> 24) & 0xFF;
bytesToSend[1] = (numToSend >> 16) & 0xFF;
bytesToSend[2] = (numToSend >> 8) & 0xFF;
bytesToSend[3] = numToSend & 0xFF;

ether.sendUdp(bytesToSend, 4, ...)

Ha nem baj, akkor a double-re most nem is térnék ki, mert az még bonyolultabb.

Üdv: Gábor

u.i.: a stringgé konvertálás is megoldás lehet, ha nem számít, hogy nagyobb lesz a payload. Így legalább olvashatóbb lesz a hálózati forgalom. Akkor a konverzió valahogy így kell kinézzen

int intToSend = 1234;
char strToSend[12];
sprintf(strToSend, "%d", intToSend );
ether.sendUdp(strToSend, strlen(strToSend), ...)
A hozzászólás módosítva: Aug 22, 2017
(#) pipi válasza koverg70 hozzászólására (») Aug 23, 2017 /
 
Hali!
Megpróbálnám a double-t és a char tömböt egy @nion-ba tenni.
(A '@' helyére 'u' betűt érts, úgy tünik tiltott szó a forumon, ha szerepel a válasz hozzászólásban, akkor üresen jelenik meg a hozzászólás, linket sem tudtam beilleszteni)
A hozzászólás módosítva: Aug 23, 2017
(#) wincso válasza hotau hozzászólására (») Ápr 3, 2018 /
 
Szia!
https://libstock.mikroe.com on találsz webservert ami működik, reléket kapcsolgat
(#) wincso hozzászólása Ápr 3, 2018 /
 
Sziasztok!
Tudna valaki segíteni , van egy webszerverem ami pár relét kapcsolgat meg hőmérsékleteket mér!
a http GET kérésekre válaszol. de az url mezőben benn marad a legutolsó Get kéeés és frissítéskor mindig a legutolsó parancsot ismétli. Azt javasolták , próbáljak POST -kéréssel küldeni az adatokat, de ha behelyettesítem GET szűrés helyére a POST szűrést, akkor szerver hiba üzenet jön a böngészőből.
Mit ronthatok el?
(#) Sick-Bastard hozzászólása Dec 31, 2018 /
 
Üdv! (BÚÉK)

Leginkább babonából írom le a problémám, mivel már sokszor a hozzászólás leírása után jött az EUREKA pillanat... hátha most is.

Probléma:
Jó pár éve írtam egy saját könyvtárat az ENC28J60-hoz. Be akartam rakni egy projekthez, némi "fejlesztés", az új projekthez való illesztés után, de problémám akadt a csomagok fogadásával.

Úgy tapasztalom, hogy a csomagok hiányosan érkeznek meg, ami miatt borul az egész.
Az adatlap 43. old. 7-3-as ábra alapján a csomag első 6 byte-ja a next_packet_pointer(NPP) és a receive_status_vector(RSV), majd ezután jön maga az ethernet csomag, amit a crc zár.

Az RSV- első 2 byteja lenne az ethernet csomag mérete, amit már 0-0xFFFF-ig mindennek olvastam szóval tuti nem jó. Arra tippeltem, hogy ha 0xFFFF-ként olvasom be, az még akár az ethernet csomag destination address-e (broadcast) is lehetne, ami arra enged következtetni, hogy valamiért el/csúszok a buffer memory kiolvasása során... de hol/hogyan(hogyan lehetséges)?

Mellékeltem a könyvtárat(enc28j60_partial.h) amit írtam, csak annyira lecsupaszítva, hogy még érthető maradjon. Valamit rosszul állítok be az inicializálás során? Rossz a csomag fogadó funkció?

Jelenség a debug_report-ban található alapján:
83: packet cnt 0x01 <- jött egy csomag
93: Ethernet RXD Write Pointer: 0x46 <- NPP+RSV+ 36 byte csomag +CRC (elvieg)
95: NPP 0x1A0 <- a következő csomag a 0x01A0-tól kezdődik?

Ha a Write Pointer és a NPP nincs összhangban, akkor biztos nem jó...

Jelenség 2:
Adatlap 27. old. 4.2.1 READ CONTROL REGISTER COMMAND
4-3 és 4-4 ábrák
Az adatlap alapján ha az ETH egyik regiszterét szeretném kiolvasni, akkor elég hozzá 2 SPI csomag. Ha egy MAC vagy MII regisztert olvasok, akkor 3 SPI csomagot kell küldeni.
Ha ez így van akkor az EREVID regisztert miért csak 3 SPI csomaggal tudom kiolvasni? Ez nem az ETH regiszter csoportba tartozik?
(#) Sick-Bastard válasza Sick-Bastard hozzászólására (») Jan 2, 2019 /
 
Bővült a furcsa jelenségek sora:

Ha inicializálom az ENC-t és ERDPT = RXSTART(0x0000)-ra állítom be, de a az ECON1.RXEN bitet nem kapcsolom be, akkor is az ERDPT értéke valamiért folyton módosul (növekszik). Pedig nem hajtok végre RBM parancsot.

Ha ECON1.RXEN bit be van kapcsolva akkor meg az első beérkező csomag esetében:
ERXWRPT egyenlőnek kéne lennie RXSTART(0x0000)-al mégis az első byteokat(NPP, RSV) RXEND(0x0FFF) és 0x0FFE közé kezdi írni...

Hardware hibát azzal zártam ki, hogy 2db ENC modulom is van, amiket kipróbáltam a működő kóddal rendelkező AVR-el és abban minden jól megy (ARP, ICMP(ping), UDP).
(#) Sick-Bastard válasza Sick-Bastard hozzászólására (») Jan 11, 2019 /
 
A jelenség megfejtése:

A hibakereséshez használt for() ciklussal végzett ENC28J60 regiszter tömbjei (bank 0 - 3) kiolvasása okozta a jelenséget. Ha az egyik tömb 0x1A címen található "Reserved" regiszterét olvasod ki (és ECON2.AUTOINC bit be van kapcsolva), akkor ERDPT értéke 1-el növekedni fog. Ha ezt mind a 4 tömbben elvégzed, akkor az ERDPT 4-el fog növekedni.

Következtetés:
A tömbökben az 0x1A címen található "Reserved" regiszter lehetséges, hogy maga az EDATA regiszter, amit az adatlapon csak egyszer említenek:
16. old. 3.1.2 ECON2 Register
Idézet:
„bit 7 AUTOINC: Automatic Buffer Pointer Increment Enable bit
1 = Automatically increment ERDPT or EWRPT on reading from or writing to EDATA
0 = Do not automatically change ERDPT and EWRPT after the buffer is accessed”


Utalás arra, hogy ne végezz WR/RD műveletet ezen ezen a regiszteren:
12. old. 3.1 Control Register
Idézet:
„The register at address 1Ah in
each bank is reserved; read and write operations
should not be performed on this register. All other
reserved registers may be read, but their contents must
not be changed.”

... csak a miért ne maradt ki.
(#) wincso hozzászólása Ápr 4, 2019 /
 
Sziasztok!
A kérdésem az lenne , hogy enc28j60 pic18f4620-al , webserver tcp/ip vel , és ha 4 kb feletti html oldalt írok a pic be akkor nem tölti be az oldalt. lehet ennek oka az , hogy az enc buffer mérete 4kb, és ha igen , lehet valahogy feljebb tornászni a html oldal méretét, hogy be is töltődjön?
Köszönöm...
(#) superuser válasza wincso hozzászólására (») Ápr 4, 2019 / 1
 
A MCHP TCP/IP stack kezeli ha az oldal mérete nagyobb a buffer méreténél. Mondjuk a környezetről nem írtál semmit.
(#) wincso válasza superuser hozzászólására (») Ápr 21, 2019 /
 
A MikroC fordítót használok, és a mikroelektronika libstock oldaláról töltöttem le egy példa projektet és módosítottam, de a példa program html része kicsi volt , néhány bájt, 2 relét kezelt.
http://www.studentcompanion.co.za/web-based-control-and-monitoring-...ikroc/
Következő: »»   17 / 17
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu