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ę

attiny2313 a atmega128

uziom
-
-
Posty: 2
Rejestracja: 1 gru 2010, o 15:53
Lokalizacja: Gliwice
Kontaktowanie:

attiny2313 a atmega128

Postautor: uziom » 1 gru 2010, o 15:58

Witam!
Od jakiegoś czasu programuje w języku C pod attiny2313 i rzekłbym wszystko było w porządku. Jednak gdy przerzuciłem się na uC atmega128 już na wstępie miałem problemy:

Kod: Zaznacz cały

void foo(int i) { PORTB ^= _BV(i); }
funkcja działa na attiny, ale na atmedze już nie... Okazało się że 128 "rozumie" tylko to, co napisze w "maini'e", bogatszy o tą wiedzę zmodyfikowałem kod:

Kod: Zaznacz cały

inline void foo(int i) { PORTB ^= _BV(i); }
i znów wszystko było w porządku, jednak do czasu. Po pewnych postępach postanowiłem stworzyć strukturę ze wskaźnikiem do mojej funkcji, okazało się jednak, że nie wiem w jaki sposób się odnieść do funkcji inline, gdyż sposób standardowy odnosi się tylko do zwykłych (nie 'obarczonych' żadnymi kwalifikatorami) funkcji (a przynajmniej tak mi się wydaje).

Programuje poprzez ISP (stk 500)- mój prowadzący mówił, że może to jest problemem...

Liczę na odzew i pomoc jak przede wszystkim pozbyć się musu tworzenia funkcji inline za każdym razem.

Czajnik
-
-
Posty: 264
Rejestracja: 17 cze 2004, o 15:40
Lokalizacja: Kraków
Kontaktowanie:

Postautor: Czajnik » 1 gru 2010, o 21:36

Nie używam C wiec nie wiem jaki to może mieć wpływ ale duże procki AVR mają inne rozkazy do obsługi obszaru pamięci. Może masz zdefiniowane nieodpowiednie biblioteki i stąd wywala błędy? Jeżeli działa w mainie to może świadczyć o tym że kompilator jakieś funkcje wywala w odległe obszary pamięci i nieodpowiednio zdefiniowany procek powoduje że kompilator nie jest w stanie skoczyć tak daleko.

Pozdrawiam
Czajnik

Guru
-
-
Posty: 250
Rejestracja: 30 cze 2003, o 13:26
Lokalizacja: Kraków

Postautor: Guru » 1 gru 2010, o 23:15

Odnosząc się do pierwszej funkcji to powinna ona działać zarówno pod attiny2313 jak i atmega128 być może jest to kwestia wstawienia pliku nagłówkowego #include <avr/io.h>

Czyli:

Kod: Zaznacz cały

int main(void) //WinAVR wymaga takiego zapisu funkcji main { foo(3); return 0; }
powinno kompilować się i działać z attiny2313 jak i atmega128, a i jeszcze jedno funkcja foo powinna być zdeklarowana przed main.

Nie rozumiem drugiego pytania, albo rozumiem je tak: jak zdefiniować wskaźnik do funkcji inline posiadającej jeden argument typu int i nic nie zwracającej?
Więc:

Kod: Zaznacz cały

void(*wsk)(int) = &foo;
zmienna wsk jest wskaźnikiem do funkcji (dlatego jest w nawiasie) nic nie zwracającej a wywoływanej z jednym argumentem typu int. Wskaźnikowi temu został przypisany adres funkcji inline void foo(int).
O ile dobrze pamiętam to wywoływanie funkcji przez wskaźnik polega na umieszczeniu na stosie adresu do miejsca w pamięci gdzie znajduje się ta funkcja i wykonaniu rozkazu RET.

Wydaje mi się że programator tutaj nic nie ma do rzeczy.

Awatar użytkownika
r-mik
-
-
Posty: 351
Rejestracja: 14 cze 2005, o 19:18
Lokalizacja: Wawa
Kontaktowanie:

Re: attiny2313 a atmega128

Postautor: r-mik » 2 gru 2010, o 16:54

Witam!
Od jakiegoś czasu programuje w języku C pod attiny2313 i rzekłbym (...)
Nie napisałeś co to za kompilator!!!
Programuje poprzez ISP (stk 500)- mój prowadzący mówił, że może to jest problemem...
Głupoty pier..... mówi, ale to już norma "u prowadzących".

uziom
-
-
Posty: 2
Rejestracja: 1 gru 2010, o 15:53
Lokalizacja: Gliwice
Kontaktowanie:

Postautor: uziom » 2 gru 2010, o 18:39

Dostałem podpowiedź na elektrodzie, że to "wina" jednego fusebita...

Chodziło o to, że był zaprogramowany jeden z fusebitów (M103C znajdujący się w bajcie extended fusebits- tabela 117 z datasheet atmega128), który jest odpowiedzialny za kompatybilność z atmega103- należy tą kompatybilność wyłączyć- ustawić jedynkę na tym bicie. Pisze na przyszłość, jakby kto miał podobny problem :).

Programuje pod linuxem z avr-gcc z rozszerzeniem c99. Zwykły gcc radzi sobie z wskazywaniem inline'ów, ale avr-gcc (jeśli damy ten sam kod) już nie.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

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