logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8] [Atmega8][C] enc28j60 - brak komunikacji Ethernet, pomarańczowa dioda, brak kwarca

sirbalkonik 12 Mar 2014 01:37 3906 24
  • #1 13395129
    sirbalkonik
    Poziom 8  
    Witam

    Od ładnych paru dni podejmuję próbę jakiejkolwiek komunikacji Atmeg z ukladem enc28j60. Niestety przy żadnym konkretnym typie mikroprocesora nie uzyskałem połączenia przez sieć ethernet. Ostatnio podjąłem próbę połączenia procesora Atmega8 wykorzystując tutorial ze strony:
    pocketmagic.net/2012/07/atmega8-and-enc28j60-for-ethernet-support/#.Ux-jXvl5MrX
    Niestety i w tym przypadku pozostało to bez echa. Co dziwne( a właściwie nie wiem czy dziwne bo nie miałem wcześniejszego doświadczenia z tym ukłądem) po podłączeniu kabla sieciowego mieży układem enc28j60 a routerem, lampka połąćzenia pali się na pomarańczowo a nie zielono. Schemat połączenia mam tak sam jak na podanej wyżej stronie. Jedyną różnicą jest to żę nie mam zewnętrznego kwarca do taktowania, jednak z informacji wyczytanych w innych wątkach widziałem iż częstotliwość 8Mhz nie jest stabilna jednak zapewni jakąkolwiek prace- takiej niestety nie uświadczyłem. Kod jaki jest na procesorze to:

    Napięcie podane na układ enc28j60 oczywiście równe 3,3V. Układ jest zakupiony w module. Nie był wlutowywany przeze mnie. Niestety moje pomysły co może być nie tak powoli się wyczerpują :/
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    /* @project
    *
    * License to access, copy or distribute this file.
    * This file or any portions of it, is Copyright (C) 2012, Radu Motisan ,
    All rights reserved.
    * @author Radu Motisan, radu.motisan(_at_)gmail.com
    *
    * This file is protected by copyright law and international treaties. Unauthorized access, reproduction
    * or distribution of this file or any portions of it may result in severe civil and criminal penalties.
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    *
    * @purpose Eth interface for Atmega microcontrollers
    *
    */

    /*
    * CS can be configured in hw_enc28j60.h
    * Configure mymac and myip below
    */

    #include <avr/io.h>
    #include <stdlib.h>
    #include <string.h>
    #include "timeout.h" // defines F_CPU

    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    #include <util/delay.h>
    // ethernet interf
    #include "net/ip_arp_udp_tcp.h"
    #include "net/enc28j60.h"
    #include "net/net.h"

    // sensors
    #include "sensors/ds1820.h"
    #include "sensors/dht11.h"



    // HD44780 LCD Class

    // enc28j60 Ethernet Class


    // please modify the following two lines. mac and ip have to be unique
    // in your local area network. You can not have the same numbers in
    // two devices:
    static uint8_t mymac[6] = {0xcd,0x15,0x16,0x17,0x18,0x19};
    static uint8_t myip[4] = {192,168,2,24};
    // listen port for tcp/www (max range 1-254)
    #define MYWWWPORT 80
    // working buffer
    #define BUFFER_SIZE 500
    static uint8_t buf[BUFFER_SIZE+1];
    // servers counters
    static int nPingCount = 0, nAccessCount = 0;
    // Objects




    void PingCallback(uint8_t *ip) {
    nPingCount++;
    }


    /*
    * Main entry point
    */
    int main(void) {

    //=====init green led
    LEDInit();

    //=====setup eth interface
    uint16_t plen = 0, dat_p = 0;
    //initialize enc28j60
    enc28j60Init(mymac);



    _delay_ms(100);

    // Magjack leds configuration, see enc28j60 datasheet, page 11
    // LEDB=yellow LEDA=green
    // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit
    // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);
    enc28j60PhyWrite(PHLCON,0x476);


    _delay_ms(100);

    //init the ethernet/ip layer:
    init_udp_or_www_server(mymac,myip);
    www_server_port(MYWWWPORT);
    register_ping_rec_callback(PingCallback);


    while(1){

    // handle ping and wait for a tcp packet:
    dat_p=packetloop_arp_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf));

    // dat_p will be unequal to zero if there is a valid http get
    if(dat_p==0){
    // do nothing
    continue;
    }
    // tcp port 80 begin
    if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){
    dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
    dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>"));
    goto SENDTCP;
    }
    if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){
    nAccessCount++;
    dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
    // webcontent
    char szWebText[130] = {0};
    sprintf(szWebText,
    "ATmega8 Webserver / ENC28J60<br><br>Server stats:<br>Acc:%d Png:%d<br><br>(C) Radu Motisan 2012, ",
    nAccessCount, nPingCount);
    dat_p=fill_tcp_data(buf,dat_p,szWebText);
    //
    goto SENDTCP;
    }
    // all other URLs:
    dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>"));
    SENDTCP:
    www_server_reply(buf,dat_p); // send web page data


    }

    return (0);
    }
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 13395787
    mickpr
    Poziom 39  
    Zacznij od sprawdzenia komunikacji Atmega -> (SPI) -> ENC28J60.
    Korzystanie z gotowych bibliotek ma to do siebie, że zwykle nie działają.
    Trzeba "usiąść samemu i zakasać rękawy". Inaczej to wróżenie z fusów.
    Zwłaszcza - że nie dałeś ani schematu połączeń, ani kompletnego kodu.
    Nie wiemy więc jak wygląda konfiguracja projektu.
  • #3 13395825
    mi14chal
    Poziom 28  
    mickpr napisał:
    Zwłaszcza - że nie dałeś ani schematu połączeń, ani kompletnego kodu.


    Podał linka w swoim poście, ale nie napisał z którego konkretnie schematu korzysta bo ja tam widzę kilka.
  • #4 13395914
    mickpr
    Poziom 39  
    mi14chal napisał:
    Podał linka w swoim poście, ale nie napisał z którego konkretnie schematu korzysta bo ja tam widzę kilka.
    Tyle, że bez schematu i bez konfiguracji z plików "net/enc28j60.h" i "net/net.h" niewiele można powiedzieć. Raczej można "gdybać".
  • #5 13396158
    sirbalkonik
    Poziom 8  
    [Atmega8] [Atmega8][C] enc28j60 - brak komunikacji Ethernet, pomarańczowa dioda, brak kwarca

    To jest schemat mojego połączenia między atmega8 a enc28j60

    Nie wiem czy też prawidłowe to jest że na module enc28j60 pali się cały czas czerwona dioda.
  • #6 13401428
    mickpr
    Poziom 39  
    sirbalkonik napisał:
    Nie wiem czy też prawidłowe to jest że na module enc28j60 pali się cały czas czerwona dioda.
    Ja też nie wiem, bo nie wiem co znaczy "czerwona dioda". Jeśli to dioda sygnalizująca połączenie (link) - to poprawnie. Powinna być normalnie zgaszona i zapalać się po włożeniu kabla podpiętego do switch'a.
    mickpr napisał:
    Tyle, że bez schematu i bez konfiguracji z plików "net/enc28j60.h" i "net/net.h" niewiele można powiedzieć. Raczej można "gdybać".
    Rozwinę tą myśl - czy skonfigurowałeś poprawnie SPI (prawdopodobnie konfiguracja jest w enc28j60.h) przez które podłączony jest ENC28J60? My tego nie wiemy - bo nie pokazałeś tych plików.
    Kolejna sprawa - w twoim programie nie widzę funkcji odbierania ramek.
    Pokażę na przykładzie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zwróć uwagę, że w pętli while w funkcji main jest instrukcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A u ciebie ... pusto.

    Jeszcze jedna sugestia. Lepiej zacząć od oryginalnego kodu - i go zmieniać, niż "odkrywać Amerykę" od nowa.
    Tyle na teraz.
  • #7 13411462
    sirbalkonik
    Poziom 8  
    To jest plik enc28j60.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a to kod dla net.h:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co do pisania własnych plików i przerabiania to musze powiedzieć że z konwerterem ethernet/SPI mam dopiero pierwsze podejście więc to jest kod skopiowany z projektu a nie moj. Nie ma w nim żadnych moich wlasnych przeróbek, chciałem poprostu odpalić najprostszy program żeby chociaż pingowało a dopiero samemu dopisywać dalsze rzeczy.

    http://www.pocketmagic.net/wp-content/uploads/2012/07/webserver_atmega8.zip

    To jest projekt który próbuje odpalić. Moduł enc28j60 napewno działa bo zielona dioda stanu cały czas się świeci a żółta miga przy odpytywaniu sieci lokalnej. Niestety ukłąd nic nie zwraca.
  • #8 13411748
    mickpr
    Poziom 39  
    sirbalkonik napisał:
    Moduł enc28j60 napewno działa bo zielona dioda stanu cały czas się świeci a żółta miga przy odpytywaniu sieci lokalnej. Niestety ukłąd nic nie zwraca.
    No dobrze - teraz wiadomo, co może być nie tak.
    Napisz - czy Atmega sama działa - najprościej podepnij jakąś diodę LED i każ Atmedze nią mrugać.
    Co do poprawności połączeń - to ja bym dał pull-up na linię RESET samego ENC28J60 (10k) - tak dla pewności.

    sirbalkonik napisał:
    Jedyną różnicą jest to żę nie mam zewnętrznego kwarca do taktowania, jednak z informacji wyczytanych w innych wątkach widziałem iż częstotliwość 8Mhz nie jest stabilna jednak zapewni jakąkolwiek prace- takiej niestety nie uświadczyłem.
    Tutaj chodzi o częstotliwość pochodzącą z ENC28J60 (CLKOUT).
    Testowałem Atmegę z zewnętrznym kwarcem 8MHz , wewnętrznym rezonatorem RC - 8MHz, a nawet przetaktowaną Atmegę 32A/32L z 8MHz na 11,0592 MHz (zewnętrzny kwarc) i zawsze działało bez problemów.
    W twoim przypadku jaką wybrałeś częstotliwość?
  • #9 13412193
    sirbalkonik
    Poziom 8  
    Atmege przetestowałęm i jest sprawna. Zarówno mruga diodą jak i wysyła dane po RS232 do innego procesora.

    Co do kwarcu:
    W opcjach programatora wybałem w zakładce SUT_CKSEL:
    Int. RC Osc. 8MHz; Start-up time: 6CK + 64ms
  • #10 13412270
    mickpr
    Poziom 39  
    A co ze wspomnianym przeze mnie pinem RESET układu ENC28J60? Podciągnąłeś do 3,3V przez 10k?
  • #11 13412367
    sirbalkonik
    Poziom 8  
    Też wykonałem to podciągniecie. Narazie bez żadnego efektu. Co dziwen, mimo że napięcie idzie przez low dropout, napięcie które jest podawane do układu enc28j60 wynosi 3,23V. Czy taka różnica może mieć znaczenie?

    Edit
    Najpierw przylutowalem bez sprawdzania, ale jak multimetrem połączyłem nóźki VCC i Reset to już na dzień dobry pokazało że jest 10k rezystancji między nimi więc nie wiem czy to jest napewno potrzebne
  • #13 13412743
    sirbalkonik
    Poziom 8  
    Przejechałem miernikiem przez wszystkie nóżki a ich wyjścia wg schematu połączenia
    me.eu/pl/katalog/?idp=1&search=ds18b20&cleanParameters=1
    I teoretycznie wszystkie były sprawne. niestety w lutowaniu jestem amatorem wiec cięzka mi powiedzieć czy napewno wszystko jest poprawnie. Jedyne co wiem to to że kupiłem dwa takie same moduły i oba nie działaja, więc mam albo wilekie 'szczęście' albo coś w uC żle ustawiam bądź programuje
  • #14 13412746
    mickpr
    Poziom 39  
    Powiedz mi jeszcze jedną rzecz: używasz Atmega8 czy 8A/8L?
    Z tematu wynika, że to zwykła Atmega8, a ona powinna być zasilona z 5V i powinieneś zastosować bufory (np. 74HC125/74HC08) przy dołączeniu do niej modułu.
    Czy może moduł już ma odpowiedni bufor - a ty próbujesz połączyć się z nim z Atmegi 8A/8L zasilanej z 3,3V - więc znów niepoprawnie?
    Co to za moduł?
  • #15 13412979
    mopsiok
    Poziom 14  
    Gdzieś w tym moim temacie powinny być namiary na stronę z której korzystałem podczas testów. ATmega była zasilana z 5V, a moduł z 3.3V i wszystko śmigało bez buforów. ENC28J60 dopuszcza 5V na wejściu, a 3.3V na SPI Atmegi już się zalicza do stanu wysokiego, więc wszystko jest okej.
  • #16 13413020
    sirbalkonik
    Poziom 8  
    Dokładnie. Nie używam żadnego buforu tylko TS1117 do zmniejszenia napięcia do 3,3V w celu zasilania enc28j60. Procesor to Atmega8L i idzie na niego zasilania 5V. Masa obu układów jest ta sama
  • #17 13413047
    mickpr
    Poziom 39  
    mopsiok napisał:
    ATmega była zasilana z 5V, a moduł z 3.3V i wszystko śmigało bez buforów.
    Do czasu.. aż przestanie.

    mopsiok napisał:
    ENC28J60 dopuszcza 5V na wejściu, a 3.3V na SPI Atmegi już się zalicza do stanu wysokiego, więc wszystko jest okej.
    Nie tak bardzo "OKEJ".

    Cytat:
    The ENC28J60 is a 3.3V part; however, it was designed to be easily integrated into 5V systems. The SPI CS , SCK and SI inputs, as well as the RESET pin, are all 5V tolerant. On the other hand, if the host controller is operated at 5V, it quite likely will not be within specifications when its SPI and interrupt inputs are driven by the 3.3V CMOS outputs on the ENC28J60. A unidirectional level translator would be necessary.

    http://ww1.microchip.com/downloads/en/DeviceDoc/39662a.pdf

    Gdyby nie był potrzebny - w datasheet nie pisali by słowem o konwerterach, a piszą.
    Kolega zrobił układ - który jednemu zadziała, a drugiemu nie i teraz się zastanawia - co jest źle.

    Atmega zasilana z 5V + na module ENC28J60 napięcie 3,3V = konflikt (chyba, że moduł ma bufor już wbudowany).
    Albo zasil całość z 3,3V (co ograniczy możliwą częstotliwość taktowania Atmegi do 8MHz), albo zastosuj bufor.
    P.S.
    Właśnie przez takie "hocki-klocki" zawsze proszę o kompletny schemat + nazwę/specyfikację modułu. Gdyby był podany - być może te tysiące postów dało by się zastąpić jednym.
  • #18 13413099
    sirbalkonik
    Poziom 8  
    Podłączyłem 3,3V ale bez większych zmian. Pingując aktualnie adres IP który odpowiada enc28j60 dostaję zwrot : [Atmega8] [Atmega8][C] enc28j60 - brak komunikacji Ethernet, pomarańczowa dioda, brak kwarca

    Gdy jestem podłączony do internetu to na pingowanie dostaje jedynie komunikat: Requesttimed out
  • #19 13413828
    mopsiok
    Poziom 14  
    @mickpr
    Racja, zwracam honor. Najwyraźniej przeczytałem to gdzie indziej i zapamiętało mi się, że to było w datasheecie.

    @sirbalkonik
    Odnośnie Twojego problemu, proponuję spróbować połączenia i kodu z tej strony: http://tuxgraphics.org/electronics/200606/article06061.shtml . W sekcji "The circuit diagram" jest link do kodu źródłowego i schematu. Osobiście używałem pierwszej wersji projektu (pliki eth-remote-device-v200606.pdf i eth_rem_dev-1.0.tar.gz). W pliku README jest opis uruchamiania. Aby sprawdzić czy wszystko działa proponuję zrobić najpierw przykład (plik test1) - przy każdym odebraniu pinga dioda na PB1 powinna zmienić swój stan.
  • #20 13413885
    michalko12
    Specjalista - Mikrokontrolery
    mickpr napisał:

    Atmega zasilana z 5V + na module ENC28J60 napięcie 3,3V = konflikt (chyba, że moduł ma bufor już wbudowany).


    Cytat:
    2.5 I/O Levels
    The ENC28J60 is a 3.3V part; however, it was
    designed to be easily integrated into 5V systems. The
    SPI CS, SCK and SI inputs, as well as the RESET pin,
    are all 5V tolerant. On the other hand, if the host
    controller is operated at 5V, it quite likely will not be
    within specifications when its SPI and interrupt inputs
    are driven by the 3.3V CMOS outputs on the
    ENC28J60. A unidirectional level translator would be
    necessary


    Dla pinu wejściowego ATmegi8 najniższe gwarantowane napięcie dla stanu wysokiego to 3V przy 5V zasilania więc spokojnie łapie się na to, żeby nie stosować żadnych konwerterów.

    https://www.elektroda.pl/rtvforum/topic1509149.html
  • #21 13413892
    mickpr
    Poziom 39  
    michalko12 napisał:
    Dla pinu wejściowego ATmegi8 najniższe gwarantowane napięcie dla stanu wysokiego do 3V przy 5V zasilania więc spokojnie łapie się na to, żeby nie stosować żadnych konwerterów.
    Nie dyskutujesz ze mną, tylko z datasheetem, którego zresztą sam cytujesz:
    Cytat:
    On the other hand, if the host controller is operated at 5V, it quite likely will not be within specifications when its SPI and interrupt inputs are driven by the 3.3V CMOS outputs on the ENC28J60. A unidirectional level translator would be necessary.
    Czyli (bez obrazy) - wiesz lepiej niż panowie z Microchip?

    Równie dobrze można powiedzieć, że Atmegę 16MHz można taktować 20 MHz, albo STM32F407 standardowy 168MHz - taktować 250 MHz...
    Z reguły pójdzie, ale jak będzie w szczególnym przypadku to już nie takie pewne.

    Trzymajmy się datasheet.
  • #22 13414314
    sirbalkonik
    Poziom 8  
    Zacząłem analizować kod linijka po linijce, żeby wychwycić czy(i co się dzieje z uC na starcie). Znalazłem moment w którym się procek zatrzymuje:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wrzucahąc pokolei zapalanie diody doszedłem do tego momentu. Na początku porcesor inicjuje funkcję:

    enc28j60Init(mymac);

    Funkcja ta ustawia rejestry; wykonuje funkcje:

    enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);

    która przechodzi. Następnie funkcja:

    enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);

    Ma w sobie kolejny raz wywoływaną funkcję enc28j60WriteOp(). Jednak tym razem się zacina, w kodzie przedstawionym powyżej dodałem linjki:

    if(address!=0)
    LED1_OFF;

    I jest to ostatnie miejsce gdzie dioda się zapala. Gdy wstawię te instrukcję za linijką:

    waitspi();

    Dioda już się nie pali
  • #23 13414474
    michalko12
    Specjalista - Mikrokontrolery
    mickpr napisał:
    Czyli (bez obrazy) - wiesz lepiej niż panowie z Microchip?


    Mistrzu! Panowie z Microchipa wiedzą co piszą, tylko co niektórzy nie wiedzą co czytają!
    A panowie z Microchipa napisali, że ENC toleruje 5V na wejściach i że wymagany jest translator poziomów jeśli procesor nie radzi sobie z napięciem 3,3V w stanie wysokim. Z kolei panowie z Atmela też dobrze wiedzą co piszą i wyraźnie napisali, że ATmega8 bardzo dobrze sobie radzi z 3,3V w stanie wysokim.

    mickpr napisał:
    Trzymajmy się datasheet.

    Wolę go czytać ze zrozumieniem niż trzymać i wprowadzać w błąd.
  • #24 13415214
    mickpr
    Poziom 39  
    michalko12 napisał:
    A panowie z Microchipa napisali, że ENC toleruje 5V na wejściach i że wymagany jest translator poziomów jeśli procesor nie radzi sobie z napięciem 3,3V w stanie wysokim. Z kolei panowie z Atmela też dobrze wiedzą co piszą i wyraźnie napisali, że ATmega8 bardzo dobrze sobie radzi z 3,3V w stanie wysokim.
    Zgadza się. Teraz spojrzyj sobie w datasheet - http://ww1.microchip.com/downloads/en/DeviceDoc/39662c.pdf strona 82 - VOH (wartość minimalna =Vdd-0.7V) . Czyli dla zasilania 3,3V minimalna wartość napięcia na wyjściu SO układu ENC28J60 wyniesie (może wynieść, a przecież nie gdybamy tylko sprawdzamy) .... 3,3V-0.7V = 2,6V...
    To już z pewnością nie wystarczy Atmedze... zasilanej 5V dla której słusznie napisałeś - minimalne VIH jest na poziomie 3V.

    michalko12 napisał:
    Wolę go czytać ze zrozumieniem niż trzymać i wprowadzać w błąd.
    Życzę uśmiechu...
  • #25 13726473
    piotrekk8403
    Poziom 11  
    kolego sirbalkonik rozwiązałeś swój problem bo utknąłem w tym samym momencie
REKLAMA