el2010tmp napisał:
Tematu nie zamykam, proszę o wypowiedź co do definicji #define XCALL
Kompilując na ten chip chyba nie masz zdefiniowanego symbolu __AVR_MEGA__, więc jest tam wstawiane rjmp, czyli tak jak być powinno. Rzuć jeszcze dla pewności okiem na wygenerowany plik lss, czy wszystko się w tabeli wektorów zgadza.
Dodano po 12 [minuty]:Tylko dwie sprawy. RJMP może adresować w obszarze +/-2k słów, więc wszelkie funkcje obsługi ISR muszą się znajdować w pierwszych 4 kB FLASH lub w ostatnich 4 kB FLASH. To może być poważny problem i jeśli twoja aplikacja jest większa, to musisz albo zdefiniować nową sekcję linkera, w której umieścisz te funkcję i ją przesunąć na początek, albo zrobić małą stację przesiadkową - rjmp z tabeli wektorów wskazuje na właściwy skok, który możesz też umieścić na końcu sekcji vectors. Ten skok jest wtedy realizowany przez jmp, możesz więc zaadresować całą pamięć. Jedyna wada to wydłużenie czasu wejścia w ISR o 2 takty.
I to rcall zamień na call. W startupie masz:
XCALL main
jeśli main będzie dalej niż 2k słów od miejsca skoku, to się to wysypie. Tak się może zdarzyć, jeśli będziesz miał dużo stałych i tekstów, lub umieścisz wcześniej np. wspomniane handlery ISR.
BTW, ciekawy błąd Microchipa. Wygląda, że wsadzili 32 k FLASH do procka, traktując go jakby miał tylko 8 k FLASH.