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

traxman
-
-
Posty: 215
Rejestracja: 7 lip 2011, o 11:19

AVT5362 - AVTDuinoMega

Postautor: traxman » 27 lis 2012, o 12:50

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.
AVTDuinoMega2560_V2_MAPOWANIE.png
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:
Zwory_V1.png
Oczywiście przy programowaniu należy wybierać płytkę Arduino Mega 2560, wybranie wersji UNO niestety spowoduje dziwne zachowanie.

traxman
-
-
Posty: 215
Rejestracja: 7 lip 2011, o 11:19

Re: AVT5362 - AVTDuinoMega

Postautor: traxman » 28 lis 2012, o 12:42

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ę...):
pins_arduino.h
(12.26 KiB) Pobrany 389 razy
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:
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);
  }
}
Naciśnięcie klawisza SW2 gasi diodę LD2, SW3 gasi LD3.

Wróć do „Kity AVT”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 61 gości