tento adresar je aktualni pracovni verse po 14.9.2012 Stav procesoru po RESETu lze nanjit v registru RCON 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 TRAPR IOPUWR EXTR SWR WDTO SLEEP IDLE BOR POR POR 0 0 X X X X X X 0 0 X 0 0 0 1 1 BOR 0 0 X X X X X X 0 0 X 0 0 0 1 0 BOR u u X X X X X X u u X u u u 1 0 SOFT 0 0 X X X X X X 0 1 X 0 0 0 0 0 SOFT u u X X X X X X 0 1 X 0 0 0 u u WDT0 0 0 X X X X X X 0 0 X 1 0 0 0 0 Zajimave bity 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0x0053 a hodnoty: 0x0003 POR 0x0001 BOR 0x0400 SOFT 0x0100 WDT bitz 11 .. 8 nastaveni detekce nizkeho napajeciho napeti musi byt bset RCON.#LVDEN bit 12 bit 13 BGST rika, zda napeti uz bylo stabilizovano a nastavuje to LVDIF - asi preruseni ???? LVDL = 1101 znamena napeti 4.2 - 4.45 V - pri poklesu pod toto napeti se vola delay je v main.c yakopmentovano v ip.c enc28j60.h void delay (unsigned int us); enc28j60.c popuyito a definovano delay(400); /*============================================================================ function: delay description: delay us kyz se zada 400 , ceka to 217 ms !!!! To urcite neni ono !!!! ===========================================================================*/ void delay (unsigned int us) { unsigned long delrg = (us * 100); asm("NOP"); while (delrg--); asm("NOP"); } zda se, ye to fakt maji byt mikrosekundy ale pak musi mit procesor frekvenci alespon 400 MHz, aby to fungovalo !!!!! ---------------------------------------------------------- Obsluha ARP main vola dokolecka eth_proc z file eth.c pokud eth_proc usoudi, ze prisel ARP paket, vola arp (len, buffer); z file arp.c v arp.c je asi nejdulezitejsi if (Checkbroadcast() && Check_my_ip_arp()) { // check broadcast MAC and my IP no a ja jsem k tomu jeste pridal Checkmymac(void) no a ted uz to odpovida spravne na ARP dotay s nastavenou MAC adresou - to obcas posila Ozeas !!!!!!!!!!!!!!§ skvele !!!!!!!!!!!!!!! ------------------------------------------- prisedsi UDP paket opet reaguje eth_proc a pokud je paket IP, vola se ip_in(len); z file ip.c ip_in udela: ulozi IP a MAC adesu protejsku do poli rem_ip a rem_mac --------------------------------------------- kdyz prijde ICMP ping, vola se icmp z file icmp.c do enc28j60.c do void netbuf_read (void *buffer, int len) { jsem zabudoval kontrolu len if (len > BUFFER_SIZE) len = BUFFER_SIZE; proste neprecteme vice, nez je BUFFER_SIZE; No a tim jsme yamayili hrouceni programu pri priochodu prilis dlouheho pat¨ketu. Odpovi to sice kravinu, ale neyhrouti se to !!!! ------------------------------- dest a src port - vola se v udp.c //nyní vyplníme udp hlavičku // port 15150 3B2E 15151 3B2F udp->UDP_destPort = 0x2e3b; // 15150 neco s endianem - prehodit udp->UDP_sourcePort = 0x2f3b; // 15151 a jsou tam sachy s endianem, takze se to asi moc neda udelat pomici DEFINE v main je nutno nastavit osctune, podle konkretni soucastky A TAKy V main je nutno nastavit IP a MAC adresu modulu ****** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ------------------------------------------ main volqa dokolecka eth_proc(); v eth.c pokud prijde ARP paket, volame proceduru arp pokud prijde IP paket, volame proceduru ip_in z ip.c ip_in podle prvniho byte rozhodne, co se ma delat. Taktez uklada MAC a IP adresu protejsiho stroje main pak neco posila pomoci udp_send , to je v udp.c a udp_send prehazuje MAC adresy v buf, takze to NEMUZE vysilat samo nekolik paketu, vzdy je to odpoved na prisedsi paket Regresni primka http://skomam.vsb.cz/archiv/2010/files/prednasky/P_Vodstrcil.pdf ---------------- v ap.h je struct Tzaznam { char ZV; char VET; unsigned char DTh; unsigned char DTl; }; ma to 4 byte od buffer[42] -------------------------------------------- (header->TS) - to je oznaceni akce atd. for(i=0;iDL tak evidentne DL je pocet elementu Tzaznam, ktere posilame v paketu struct Thlavicka { char TS; char DL; long int CLK; }; byte 42 byte 43 44, 45, 46, 47 - tohle je CLK - long int 48 zacina Tzaznam a v ip.c struct Tzaznam *temp_zazn; //založíme dočasnou strukturu temp_zazn = (struct Tzaznam *) & buffer[48+i*4]; //přiřadíme polohu v bufferu zv[i] = temp_zazn->ZV; //zápis jednotlivých parametrů vet[i] = temp_zazn->VET; int temp= temp_zazn->DTh<<8; dt[i] = temp_zazn->DTl + temp ; asi to je od buf[48] struct Tpolemod { unsigned short int minut; unsigned char stavv; }; struct Thlavicka *header; //založení struktury UDP hlavičky header = (struct Thlavicka *) & buffer[42]; //přiřadíme jí v bufferu