Gast
#2354974
Hi Leute,
ich hab einen Bootloader für den Atmega 328p (in meinem Fall Arduino)
geschrieben, der sich nach dem Reset per Internet über einen W5100
Ethernet Controller eine neue Firmware von einer gegebenen Adresse
runterlädt und ausführt.
Soweit funktioniert das auch ganz gut, aber das hochgeladene Programm
zeigt sehr merkwürdiges Verhalten. Als Beispiel habe ich hier eine
Testfunktion, die die verfügbaren Bytes im W5100 zählt:
uint8_t W5100Class::read(uint16_t _addr)
{
setSS();
SPI_transfer(0x0F);
SPI_transfer(_addr >> 8);
SPI_transfer(_addr & 0xFF);
uint8_t _data = SPI_transfer(0);
resetSS();
return _data;
}
So gibt die Funktion wenn ich sie aufrufe 1024 zurück, anstatt 0 wie
nötig.
Selbst wenn ich diese krasse Änderung vornehme, klappt es noch nicht:
uint8_t W5100Class::read(uint16_t _addr)
{
setSS();
SPI_transfer(0x0F);
SPI_transfer(_addr >> 8);
SPI_transfer(_addr & 0xFF);
uint8_t _data = SPI_transfer(0);
resetSS();
return 0;
}
Wenn ich nun diese völlig unlogischen Änderungen vornehme, gibt sie die
richtige Zahl (offensichtlich nicht mehr die Zahl der verfügbaren Bytes
aber wenigstens die Zahl die dasteht... 0) zurück:
uint8_t W5100Class::read(uint16_t _addr)
{
setSS();
SPI_transfer(0x0F);
SPI_transfer(0x426 >> 8);
SPI_transfer(0x427 & 0xFF);
uint8_t _data = SPI_transfer(0);
resetSS();
return 0;
}
Gibt es irgendwelche Optimierungen vom Kompiler, Fuses vom uC oder sonst
irgendetwas dass ich hier nicht sehe?
PS:
Das Programm mit dem offiziellen Arduino bootloader geflashed
funktioniert ohne Probleme.