Jakub Rakus
Guest
Tue Mar 26, 2013 9:34 pm
Witajcie,
Jest sobie program na atmega8, coś tam mierzy na ADC, mierzy temp. przez
DS18B20, wyświetla wszystko na 7-segment i przełącza kilka przekaźników.
A problem jest taki - avr-gcc nie wiedzieć czemu (chyba) przy kompilacji
używa nieprawidłowych plików z definicjami rejestrów procesora.
Oczywiście na początku pliku mam #include <avr/io.h>, a kompilator
wywołuje z -mmcu=atmega8. Tylko, że np. taka linijka jest w ogóle pomijana:
ADCSRA = _BV(ADEN)|_BV(ADPS1)|_BV(ADPS2);
Są też błędy (a może raczej braki) przy konfiguracji innych rejestrów
(np. timerów), nie rozpoznaje mi niektórych nazw rejestrów/bitów. IDE
którego używam (CodeBlocks pod Ubuntu), pozwala mi na podejrzenie, w
którym pliku znajdują się definicje użytych nazw rejestrów/bitów - i tu
ciekawostka, wypluwa mi że definicje wziął z pliku ioat94k.h - tak jakby
w ogóle olał parametr mmcu i wybrał sobie pierwszy lepszy plik do
którego odnosi się avr/io.h. Przejrzałem ten plik (ioat94k) dokładnie -
takie nazwy nie są tam zdefiniowane (w końcu to inny procek), dla
porównania podejrzałem w iom8.h - tutaj oczywiście są. Więc faktycznie z
jakiegoś nieznanego mi powodu zostaje wywołany nieprawidłowy plik z
definicjami - dlaczego?
Walczę z tym od wczoraj i skończyły mi się pomysły, próbowałem zmieniać
ustawienia wywołania avr-gcc, ale nie ma efektów.
--
Pozdrawiam
Jakub Rakus
Zbych
Guest
Tue Mar 26, 2013 9:49 pm
W dniu 26.03.2013 21:34, Jakub Rakus pisze:
Quote:
Witajcie,
Jest sobie program na atmega8, coś tam mierzy na ADC, mierzy temp. przez
DS18B20, wyświetla wszystko na 7-segment i przełącza kilka przekaźników.
A problem jest taki - avr-gcc nie wiedzieć czemu (chyba) przy kompilacji
używa nieprawidłowych plików z definicjami rejestrów procesora.
Oczywiście na początku pliku mam #include <avr/io.h>, a kompilator
wywołuje z -mmcu=atmega8. Tylko, że np. taka linijka jest w ogóle pomijana:
ADCSRA = _BV(ADEN)|_BV(ADPS1)|_BV(ADPS2);
Są też błędy (a może raczej braki) przy konfiguracji innych rejestrów
(np. timerów), nie rozpoznaje mi niektórych nazw rejestrów/bitów. IDE
którego używam (CodeBlocks pod Ubuntu), pozwala mi na podejrzenie, w
którym pliku znajdują się definicje użytych nazw rejestrów/bitów - i tu
ciekawostka, wypluwa mi że definicje wziął z pliku ioat94k.h - tak jakby
w ogóle olał parametr mmcu i wybrał sobie pierwszy lepszy plik do
którego odnosi się avr/io.h.
-mmcu=xxx, to opcja kompilatora a nie IDE, więc skąd Codeblocks ma
wiedzieć, w którym pliku szukać definicji?
Quote:
Walczę z tym od wczoraj i skończyły mi się pomysły, próbowałem zmieniać
ustawienia wywołania avr-gcc, ale nie ma efektów.
Po prostu przejrzyj plik *.lss i sprawdź, czy kompilator zrobił to co
napisałeś (co niekoniecznie będzie się pokrywało z tym co chciałeś).
Grzegorz Niemirowski
Guest
Tue Mar 26, 2013 10:54 pm
Jakub Rakus <szczur01@op.pl> napisał(a):
Quote:
Witajcie,
Jest sobie program na atmega8, coś tam mierzy na ADC, mierzy temp. przez
DS18B20, wyświetla wszystko na 7-segment i przełącza kilka przekaźników. A
problem jest taki - avr-gcc nie wiedzieć czemu (chyba) przy kompilacji
używa nieprawidłowych plików z definicjami rejestrów procesora. Oczywiście
na początku pliku mam #include <avr/io.h>, a kompilator wywołuje
z -mmcu=atmega8. Tylko, że np. taka linijka jest w ogóle
pomijana: ADCSRA = _BV(ADEN)|_BV(ADPS1)|_BV(ADPS2);
Na pewno? Nie spotkałem się jeszcze z tym, żeby kompilator sobie coś
pomijał. Skąd wiesz, że pimija? W jaki sposób testowałeś?
Quote:
Są też błędy (a może raczej braki) przy konfiguracji innych rejestrów (np.
timerów), nie rozpoznaje mi niektórych nazw rejestrów/bitów.
Jak nie rozpoznaje? Jeśli nie rozpoznaje, to znaczy, że kompilacja kończy
się błędem.
Quote:
IDE którego używam (CodeBlocks pod Ubuntu), pozwala mi na podejrzenie, w
którym pliku znajdują się definicje użytych nazw rejestrów/bitów - i tu
ciekawostka, wypluwa mi że definicje wziął z pliku ioat94k.h - tak jakby w
ogóle olał parametr mmcu i wybrał sobie pierwszy lepszy plik do którego
odnosi się avr/io.h. Przejrzałem ten plik (ioat94k) dokładnie - takie
nazwy nie są tam zdefiniowane (w końcu to inny procek), dla porównania
podejrzałem w iom8.h - tutaj oczywiście są. Więc faktycznie z jakiegoś
nieznanego mi powodu zostaje wywołany nieprawidłowy plik z definicjami -
dlaczego?
Jest sobie warunek:
#if defined (__AVR_AT94K__)
# include <ioat94k.h>
Nie masz czasem zdefiniowanego __AVR_AT94K__?
Quote:
Walczę z tym od wczoraj i skończyły mi się pomysły, próbowałem zmieniać
ustawienia wywołania avr-gcc, ale nie ma efektów.
Dużo nie wymyślimy bez źródeł, przede wszystkim Makefile.
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express:
http://www.grzegorz.net/oe/
Uptime: 2 days, 3 hours, 48 minutes and 21 seconds
Jakub Rakus
Guest
Wed Mar 27, 2013 9:56 pm
W dniu 26.03.2013 21:49, Zbych pisze:
Quote:
-mmcu=xxx, to opcja kompilatora a nie IDE, więc skąd Codeblocks ma
wiedzieć, w którym pliku szukać definicji?
Ale tą opcje wybieram poprzez ustawienia projektu w IDE i na podstawie
tychże ustawień Codeblocks wywołuje kompilator z odpowiednimi opcjami.
Wszystkie użyte w programie funkcje/zmienne/definicje które są
zdefiniowane/zadeklarowane w plikach innych niż main.c a dołączonych do
niego dyrektywą include mogę sobie podejrzeć prawoklikiem na danej
funkcji/zmiennej/definicji - nie dociekam jak to rozwiązali programiści
piszący IDE, wiem tylko że dopiero po kompilacji mogę robić taki
podgląd, dopóki program nieskompilowany tego podglądu nie ma. Być może
jest tak, że ten podgląd szwankuje, a błąd leży gdzie indziej.
Quote:
Po prostu przejrzyj plik *.lss i sprawdź, czy kompilator zrobił to co
napisałeś (co niekoniecznie będzie się pokrywało z tym co chciałeś).
Ehh, chciałem tego uniknąć, bo jest spory... no ale zajrzałem i widzę,
że teoretycznie w asemblerze mam jak trzeba, czyli problem leży gdzieś
indziej, tylko nie mam pomysłu gdzie - wiem tylko, że wszystko zaczęło
się tak kaszanić po tym jak dodałem konfigurację timer2 jako PWM,
poprzez dwie proste linijki (na początek żeby widzieć w ogóle przebieg
na nodze):
TCCR2 = _BV(WGM21)|_BV(COM21)|_BV(CS20);
OCR2 = 127;
Z jakiegoś powodu na porcie jest stan niski, konfiguracja pinu PB3/OC2
ustawiona kilka linijek wcześniej jako wyjście z pull-down.
--
Pozdrawiam
Jakub Rakus
Kicer
Guest
Fri Mar 29, 2013 4:15 pm
Jakub Rakus wrote:
Quote:
W dniu 26.03.2013 21:49, Zbych pisze:
-mmcu=xxx, to opcja kompilatora a nie IDE, więc skąd Codeblocks ma
wiedzieć, w którym pliku szukać definicji?
Ale tą opcje wybieram poprzez ustawienia projektu w IDE i na podstawie
tychże ustawień Codeblocks wywołuje kompilator z odpowiednimi opcjami.
Tak jak napisal Zbych, parser w ide nie wie gdzie ma wejść, bo za to
odpowiedzialne jest makro automagicznie tworzone przez kompilator w czasie
kompilacji na podstawie mmcu, a którego ide nie zna. Popatrz sobie jak
wyglądają pliki które includujesz (np io.h) - sa tam dziesiątki ifdefów
sprawdzające obecnosc roznych makr np __AVR_ATtiny4313__ .
pozdrawiam
--
Michał Walenciak
gmail.com kicer86
http://kicer.sileman.net.pl
gg: 3729519