Otrzymałem email z opisem problemów związanych z uruchomieniem AVTDuinoMega, aby nie było potrzeby odpisywania każdemu użytkownikowi z osobna, przyspieszyć uruchomienie i aby uwagi nie zaginęły zakładam właśnie ten wątek.
Zgłoszone problemy:
1. Problemy z bootloaderem Arduino.
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
Twórcy Arduino w nowszych wersjach >1.0 zmienili programator z FTDI na ATmega8/16 w związku z tym zmienił się też sposób programowania, do automatycznego resetu nie są już wykorzystywane sygnały !DTR+!RTS a tylko sygnał !RTS. Stan syganłu !DTR jest teraz nieokreślony co powoduje problemy z rozpoczęciem programowania.
Aby zapewnić zgodność z najnowszym środowiskiem 1.0.2. z płytki AVTDuinoMega należy wylutować rezystor R2. Należy też zaprogramować procesor odpowiednim bootloaderem przy pomocy ISP.
W wersji Arduino 1.0.2 jest to plik:
\\arduino-1.0.2\hardware\arduino\bootloaders\stk500v2\stk500boot_v2_mega2560.hex (05.11.12)
ustawić fusebity zgodnie z opisem w pliku
\\arduino-1.0.2\hardware\arduino\boards.txt
czyli:
##############################################################
mega2560.bootloader.low_fuses=0xFF
mega2560.bootloader.high_fuses=0xD8
mega2560.bootloader.extended_fuses=0xFD
##############################################################
oraz koniecznie zabezpieczyć obszar bootloadera (LPM/SPM) przed zapisem, inaczej Arduino przy pierwszył ładowaniu programu - skasuje bootloadera.... i nie będzie można ponownie wgrać oprogramowania.
To koniec pracy nad bootloaderem.
Uwaga dotyczy to także innych wersji-klonów arduino z FT232, oczywiście w takim należy zaprogramować bootloaderem zgodnym z użytym procesorem. Ze względu na nieoczekiwaną zmianę nazw, dzisiejsze UNO R3 nie jest zgodne z starym UNO R1, które w nowych wersjach Arduino należy traktować jako Duemilanowe, Decimilla w zależności od zastosowanego procesora 168/328 i taki bootloader należy wgrać.
2. Sprzęt.
Powodem nieporozumień jest przyjęte przez Arduino oznakowanie portów procesora, nie korzystają one z nazw wyprowadzeń procesora lecz nazw symboliczne nadane przez zespół Arduino. AVTDuinoMega nie jest w 100% PIN/PIN zgodny z Arduino UNO/Mega, bo jest to niemożliwe, właśnie przez inne przyporządkowanie pinów. Jest to w miarę oczywiste ze względu na zmniejszenie rozmiaru płytki i pominięcie kilku złącz z Mega2560, ale początkującym może sprawić problemy. Nie wpadłem na to i w artykule nie ma słowa na ten temat.
Np.: w procesorze Mega328 PIN13 (LED) jest na porcie PB5(SCK), w Mega2560 PIN13 jest na PB7 (a PB5 Mega2560 odpowiada PIN11). Powoduje to pewne zamieszanie, kompilacja przykładów 1:1 nie zawsze da spodziewany efekt. Trzeba zawsze samodzielnie zadbać, aby sterowany pin "znalazł" się w odpowiednim miejscu, po pierwsze przez odpowiednie sprawdzenie wyprowadzeń procesora, złącza oraz programowe poprzez odpowiednie modyfikacji bibliotek.
Przykładowo standardowa konfiguracja dla wyświetlacza LCD dla UNO:
// RS,E,D4,D5,D6,D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
a, dla AVTDuinoMega, gdy LCD podpięty jest do dedykowanego złącza:
LiquidCrystal lcd(22, 23, 26, 27, 28, 29);
tutaj nie jest to problemem, bo definicja pinów jest "jawna" jako argument funkcji, gorzej gdy jest "ukryta" w plikach nagłówkowych, wtedy niestety trzeba edytować źródła, ma to miejsce gdy sketch dla UNO chcemy skompilować dla Mega (np. dla Ethernetu) i jest opisane szeroko w sieci.
Mapowanie pinów dotyczy portu analogowego:
UNO - MEGA
A0 - A0
A1 - A1
A2 - A2
A3 - A3
A4 - A4/20-SDA
A5 - A5/21-SCL
oraz portu cyfrowego 8-13 dla wersji pcb V2:
UNO - MEGA
8 - 8
9 - 9
10 - 53/-SS
11 - 51/MOSI
12 - 50/MISO
13 - 52/SCK
GND
AREF
Mapowanie złącz
EXPD
37/36
35/34
33/32
31/30
GND/VCC
EXPA
A8/A9
A10/A11
A12/A13
A14/A15
GND/VCC
Adresowanie typu PORTx/PINx zawsze będzie działo poprawnie o ile z plików *.h nie zostały usunięte definicje odpowiednich pinów (tak jest w przypadku wyprowadzeń, których Arduino nie wykorzystuje oraz gdy nie są poprzestawiane zwory interfejsów sprzętowych mające za zadanie
doprowadzenie sygnałów Mega2560 I2C/SPI do odpowiadających pinów UNO.
Dla wyjaśnienia tego zamieszania opracowałem tabelę mapowania pinów.
Tak więc przy konfiguracji Mega2560, zawsze należy posługiwać się schematem i odpowiednio przemapować piny.
W wersji pierwszej niekonsekwentnie, niewygodnie i błędnie rozmieściłem piny SS/MOSI które do mapowania w trybie zgodności z UNO (np. dla SPI czyli kart sieciowych, SD itp) co wymaga używania krótkich krosówek do zamiany SS/MOSI (złacza J3/J4), w wersji V2 nie będzie to wymagane, a położenie zwór będzie "naturalne" dla Arduino czyli D13-D10 (SCK/MISO/MOSI/SS) i powrót do mapowania poprzez zworki.
Prawidłowe położenie zwór w trybie zgodności z UNO przedstawia załączony rysunek:
Oczywiście przy programowaniu należy wybierać płytkę Arduino Mega 2560, wybranie wersji UNO niestety spowoduje dziwne zachowanie.
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięAVT5362 - AVTDuinoMega
Moderatorzy:Jacek Bogusz, Grzegorz Becker, procesorowiec, robertw, Moderatorzy
Re: AVT5362 - AVTDuinoMega
Płytka zwiera dodatkowo dwa przełączniki i Ledy w celu ich wykorzystania, (porty których używają są niezdefiniowane w nagłówkach Arduino), konieczne jest podmienienie pliku:
\\arduino-1.0.2\hardware\arduino\variants\mega\pins_arduino.h
plikiem z załącznika (warto zachować starą wersję zmieniając jej nazwę...):
SW2 odpowiada PIN 71
SW3 odpowiada PIN 70
LD2 odpowiada PIN73
LD3 odpowiada PIN72
Nowa definicja nie uwzględnia funkcji specjalnych portu, to tylko "czyste" wejście/wyjście cyfrowe umożliwiające odczyt klawisza lub zaświecenie Leda.
Dla sprawdzenia poprawności można wgrać szkic:
\\arduino-1.0.2\hardware\arduino\variants\mega\pins_arduino.h
plikiem z załącznika (warto zachować starą wersję zmieniając jej nazwę...):
SW2 odpowiada PIN 71
SW3 odpowiada PIN 70
LD2 odpowiada PIN73
LD3 odpowiada PIN72
Nowa definicja nie uwzględnia funkcji specjalnych portu, to tylko "czyste" wejście/wyjście cyfrowe umożliwiające odczyt klawisza lub zaświecenie Leda.
Dla sprawdzenia poprawności można wgrać szkic:
Naciśnięcie klawisza SW2 gasi diodę LD2, SW3 gasi LD3.const int SW2 = 71;
const int SW3 = 70;
const int LD2 = 73;
const int LD3 = 72;
int buttonState = 0;
void setup() {
pinMode(LD2, OUTPUT);
pinMode(LD3, OUTPUT);
pinMode(SW2, INPUT);
pinMode(SW3, INPUT);
}
void loop(){
buttonState = digitalRead(SW2);
if (buttonState == HIGH) {
digitalWrite(LD2, HIGH);
}
else {
digitalWrite(LD2, LOW);
}
buttonState = digitalRead(SW3);
if (buttonState == HIGH) {
digitalWrite(LD3, HIGH);
}
else {
digitalWrite(LD3, LOW);
}
}
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 38 gości