Таймер1 -прикачени файлове
-----------------------------
Ардуйно ботлоудер
Ардуйно има ботлоудер, програма, която се стартира при Reset ( драйвера при отварянето на порта издава сигнал, който се ползва за reset).
За този ботлоудер е характерно, че е специална секция от флаш паметта, bootloader section, от която инструкциите за запис във флаша са валидни. Това е валидно, кокто и цялата боот секкциа, размера и, правата и и т.н.) при специално установяване на така наречените FUSES, фюзове, и лок битове. Те могат да се програмират с програматор, но не и от ботлоудера.
Сорса на ботлоудера обяснява странното поведение, когато ние пращаме нещо, и очакваме отговор.
#define MAX_ERROR_COUNT 5
for (;
{
/* get character from UART */
ch = getch();
/* Hello is anyone home ? */
if(ch=='0') {...
else if(ch=='1') {...
/* AVR ISP/STK500 board commands DON'T CARE so default nothing_response */
else if(ch=='@') {
/* AVR ISP/STK500 board requests */
else if(ch=='A') {
else if(ch=='B') {
/* Parallel programming stuff DON'T CARE */
else if(ch=='E') {
/* P: Enter programming mode */
/* R: Erase device, don't care as we will erase one page at a time anyway. */
else if(ch=='P' || ch=='R') {
/* Leave programming mode */
else if(ch=='Q') {
/* Set address, little endian. EEPROM in bytes, FLASH in words */
else if(ch=='U') {
/* Universal SPI programming command, disabled. Would be used for fuses and lock bits. */
else if(ch=='V') {
/* Write memory, length is big endian and is in bytes */
else if(ch=='d') {
/* Read memory block mode, length is big endian. */
else if(ch=='t') {
/* Get device signature bytes */
else if(ch=='u') {
/* Read oscillator calibration byte */
else if(ch=='v') {
#if defined MONITOR
/* here come the extended monitor commands by Erik Lins */
/* check for three times exclamation mark pressed */
else if(ch=='!') {
ch = getch();
if(ch=='!') {
ch = getch();
if(ch=='!') {
PGM_P welcome = ""; /* end of monitor */
#endif
else if (++error_count == MAX_ERROR_COUNT) {
app_start();
Та ако искаме да се отървем от излишните символи, първо трябва да пратим някакви символи които да прескочат ботлоудера, после нашата прогграма да си изчисти USART-a и прочие
На адрес 0х0000 от флаш паметта е записаната от ботлоудера програма, самият ботлоудер е в началото на boot loader flash секция. BOOTRST fuse определя към коя секция сочи вектора reset.
Затова функцията app_start() е преход към приложението
void (*app_start)(void) = 0x0000;
Нашето приложение трябва да инициализира нанаво стека и почти всичко, за да сме сигурни.
Ботлоудер може да е всяка наша програма, компилирана с директивата за линкера --section-start=.text=0x7800 /ако сме установили 2к бот секция/ това може да се види в
arduino/hardware/arduino/bootloaders/atmega/Makefile
командата за програматора обаче е за друг случай – програмиране от програматор, за запис през ботлоудера ползваме
avrdude -pm328p -carduino -P/dev/ttyUSB0 -b57600 -Uflash:w:my_prg.hex:a