Jak w temacie. Zestaw uruchomieniowy, testowałem na nim na razie ledwie jeden program (hello world):
Jak widać jest to przykładowy program z Elektroniki Praktycznej 12/2006.
Wszystko oczywiście działało.
Problemy zaczęły się kiedy wgrałem program (przykład - serwer http) z EP 1/2007:
Ethernet (ZL1ETH) nie zadziałał, w ogóle nawet nie zaświeciły się kontrolki (błysnęły tylko podczas startu zestawu, norma). Załadowałem z powrotem HelloWorld i tu nastąpiła kraksa: zestaw nic nie wypisuje na UART. Nie wypisywał zresztą nawet wtedy, gdy był wrzucony ten serwer.
Do programowania używam USBasp, WinAVR (2010.01.10) i AVR8 Burn-O-Mat (v2).
Co zrobiłem źle? I jak to odkręcić?
EDIT: Fusów nie dotykałem nawet.
#include <dev/board.h>
#include <stdio.h>
#include <io.h>
#define UART_SPEED 38400
main()
{
u_long baudrate = UART_SPEED;
NutRegisterDevice (&DEV_DEBUG, 0, 0);
freopen (DEV_DEBUG_NAME, "w", stdout);
_ioctl(_fileno(stdout), UART_SETSPEED, &baudrate);
printf("Witaj swiecie! \n");
for(;;);
}
Jak widać jest to przykładowy program z Elektroniki Praktycznej 12/2006.
Wszystko oczywiście działało.
Problemy zaczęły się kiedy wgrałem program (przykład - serwer http) z EP 1/2007:
#include <cfg/os.h>
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <dev/board.h>
#include <dev/urom.h>
#include <sys/version.h>
#include <sys/thread.h>
#include <sys/timer.h>
#include <sys/heap.h>
#include <sys/confnet.h>
#include <sys/socket.h>
#include <sys/atom.h>
#include <arpa/inet.h>
#include <pro/dhcp.h>
#define UART_BAUDRATE 38400
// statyczny adres IP naszego urz?dzenia
#define MY_IP_ADDR "10.1.108.222"
// statyczna maska podsieci
#define MY_NETMASK "255.255.0.0"
// statyczny adres domy?lnej bramy
#define MY_GATEWAY "10.1.0.1"
// czy konfigurowa? sie? statycznie (wykomentowa? lini? ni?ej), czy z u?yciem DHCP?
//#define USE_DHCP
void init_network()
{
// rejestrujemy w systemie urz±dzenie kontrolera Ethernet
if(NutRegisterDevice(&DEV_ETHER, 0, 0))
{
printf("Blad inicjalizacji kontrolera RTL8019\n");
return;
};
#ifdef USE_DHCP
if(NutDhcpIfConfig("eth0", 0, 20000))
#endif
{
NutNetIfConfig("eth0", NULL,
inet_addr(MY_IP_ADDR),
inet_addr(MY_NETMASK));
// NutIpRouteAdd(0, 0, inet_addr(MY_GATEWAY), &DEV_ETHER);
}
}
void initialize()
{
u_long speed;
// inicjalizacja urz±dzenia Debug (czyli UARTa)
NutRegisterDevice (&DEV_DEBUG, 0, 0);
// inicjalizacja urz±dzenia systemu plików UROM
NutRegisterDevice (&devUrom, 0, 0);
// Przekierowanie standardowego wyj¶cia na UART. Od tej pory
// funkcje typu printf() pisza do UARTa
freopen (DEV_DEBUG_NAME, "w", stdout);
// Ustawienie predkosci UARTa
speed = UART_BAUDRATE;
_ioctl(_fileno(stdout), UART_SETSPEED, &speed);
printf("Kurs Ethernut EP - TCP Server by T.W. 2006\n");
printf("Wersja Nut/OS: %s\n", NutVersionString());
printf("\n");
}
int main(void)
{
TCPSOCKET *s;
FILE *f;
initialize();
init_network();
DDRF|=1;
for (;;)
{
char buf[256];
// tworzymy gniazdo TCP
s = NutTcpCreateSocket();
// blad - czekamy 3 sekundy i probujemy ponownie
if(!s)
{
printf("Bł±d przy tworzeniu gniazda sieiowego\n");
NutSleep(3000);
continue;
}
// oczekujemy na polaczenie na port 80 (HTTP)
NutTcpAccept(s, 80);
// tworzymy plik polaczony z gniazdem s
f = _fdopen((int) s, "r+b");
// przetwarzamy zapytanie HTTP
if(f)
{
NutHttpProcessRequest(f);
// zamykamy plik
fclose(f);
}
// zamykamy gniazdo
NutTcpCloseSocket(s);
}
return 0;
}
Ethernet (ZL1ETH) nie zadziałał, w ogóle nawet nie zaświeciły się kontrolki (błysnęły tylko podczas startu zestawu, norma). Załadowałem z powrotem HelloWorld i tu nastąpiła kraksa: zestaw nic nie wypisuje na UART. Nie wypisywał zresztą nawet wtedy, gdy był wrzucony ten serwer.
Do programowania używam USBasp, WinAVR (2010.01.10) i AVR8 Burn-O-Mat (v2).
Co zrobiłem źle? I jak to odkręcić?
EDIT: Fusów nie dotykałem nawet.
