rezolut Napisano Marzec 20, 2012 Udostępnij Napisano Marzec 20, 2012 Witam,Przemogłem się. Postanowiłem spróbować C. Zacząłem od Kursu AVR-GCC i przygotowania narzędzi i.... zaczęły się schody. Zainstalowałem sobie WinAVR i przechodzę do tworzenia pliku Makefile. Robię wszystko dokładnie jak w kursie. 1) Podaję nazwę Main file name = "test". 2) Podaję C source files = pełna ścieżka do "test.c" 3) Określam inne parametry MCU, kompilatora i portu usb 4) Owieram sobie Notepad 5) wklejam prosty kod #include<avr/io.h> #include<util/delay.h> int main(void) { } 6) Zapisuję plik pod "test.c" i po Make All wyskakuje mi błąd: > "make.exe" all > Failed to create process: Nie można odnaleźć określonego pliku. > Process Exit Code: 0 > Time Taken: 00:00 O czymś jeszcze zapomniałem? Link do komentarza Share on other sites More sharing options...
Grzesieq94 Marzec 20, 2012 Udostępnij Marzec 20, 2012 Po pierwsze nie potrzebnie dodajesz do C source files test.c Skoro to jest główny plik to nie dodajesz go ponownie. Po drugie test.c i plik makefile musi być w tym samym katalogu. Link do komentarza Share on other sites More sharing options...
dondu Marzec 20, 2012 Udostępnij Marzec 20, 2012 Po trzecie zainstaluj AVR Studio i zapomnij o problemach z makefile. Link do komentarza Share on other sites More sharing options...
rezolut Marzec 20, 2012 Autor tematu Udostępnij Marzec 20, 2012 Hehe.... no mam AVR Studio od dawna, używam go do programowania. Wcześniejszy problem okazał się najprawdopodobniej związany z tym, że w pracy nie mam uprawnień admina na komputerze. Czyli zaczynam w AVR Studio i nie muszę kombinować z żadnymi makefilami, liniami poleceń, zewnętrznym wywoływaniem jakichś linkerów, kompilerów, itp.? Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
dondu Marzec 20, 2012 Udostępnij Marzec 20, 2012 Czyli zaczynam w AVR Studio i nie muszę kombinować z żadnymi makefilami, liniami poleceń, zewnętrznym wywoływaniem jakichś linkerów, kompilerów, itp.? Tak, on to zrobi za Ciebie i zawsze poprawnie 🙂 No chyba że będziesz chciał ręcznie wtedy wskażesz mu plik makefile. 1 Link do komentarza Share on other sites More sharing options...
rezolut Marzec 20, 2012 Autor tematu Udostępnij Marzec 20, 2012 AVR Studio wydaje się działać 😃 Piszę najprostszą ramę programu: #define F_CPU 16000000L #include <avr/io.h> #include <util/delay.h> int main(void) { DDRA |= 1 << PA0; for (;;) { PORTA |= 1 << PA0; _delay_ms(100); PORTA &= ~(1 << PA0); _delay_ms(100); } } Deklaruję 16MHz, ale po uruchomieniu debuggera, w bocznym panelu mam info: Frequency 4.0000 MHz. Coś nie tak deklaruję? [ Dodano: 21-03-2012, 18:40 ] Ponowię zapytanie bo symulator wypluwa mi coś takiego, choć zegar ustawiam w programie i również w opcjach projektu na 16MHz. O co chodzi z tym 4MHz? Link do komentarza Share on other sites More sharing options...
ProeXtreme Marzec 22, 2012 Udostępnij Marzec 22, 2012 Nie wiem czy to ma jakiś wpływ, ale na załączonym obrazku w miejscu deklaracji częstotliwości kwarcu zjadłeś "L" Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 22, 2012 Udostępnij Marzec 22, 2012 A poniżej widzę słynną pętlę for próbującą powtarzać diabelską instukcję powrotu z main 😖 Dla symulatora te 4MHz jest tylko liczbą używaną do przeliczania liczby cykli procesora na czasy pokazywane w us. Szczerze mówiąc nie wiem, czy symbol F_CPU przenosi się do pliku elf tak, by AVR Studio mogło z tego skorzystać i nie mogę tego teraz sprawdzić. Wpisz tam 16 i (na razie) po kłopocie. Link do komentarza Share on other sites More sharing options...
rezolut Marzec 23, 2012 Autor tematu Udostępnij Marzec 23, 2012 ProeXtreme, zdaje się, że wpływu nie ma. Deklarowałem UL, samo L, bez niczego i te 4MHz pozostają niezmienione. marek1707, kod wziąłem byle jaki, byle tylko cokolwiek skompilować i pokazać te 4MHz. Pole to jest nieedytowalne, więc nie wiem, gdzie mam wpisać 16. Link do komentarza Share on other sites More sharing options...
kling Marzec 23, 2012 Udostępnij Marzec 23, 2012 Kliknij prawym na nazwe projektu w drzewku projektów (po lewej stronie), wybierz 'Edit Configuration Options' i tam wpisz 16000000 w polu Frequency. Powinno pomóc. Link do komentarza Share on other sites More sharing options...
rezolut Marzec 23, 2012 Autor tematu Udostępnij Marzec 23, 2012 To też robiłem. Zmieniłem w ustawieniach projektu na 16 000 000 (bo tam w hz każą) i nic to nie zmieniło. W symulatorze po lewej nadal Frequency=4MHz. Link do komentarza Share on other sites More sharing options...
kling Marzec 23, 2012 Udostępnij Marzec 23, 2012 Może i głupie ale nic innego już nie przychodzi mi do głowy - a fusebity? Link do komentarza Share on other sites More sharing options...
rezolut Marzec 23, 2012 Autor tematu Udostępnij Marzec 23, 2012 Kliknij prawym na nazwe projektu w drzewku projektów (po lewej stronie), wybierz 'Edit Configuration Options' i tam wpisz 16000000 w polu Frequency. Powinno pomóc. Problem rozwiązany - Menu Debug->AVR Simulator Options->Frequency. Choć nie wiem, co to zmienia 🙂 Chyba tylko obliczanie czasów wykonywania w symulatorze. [ Dodano: 24-03-2012, 14:09 ] Skoro AVR Studio zaczęło działać, przystąpiłem do popełniania pierwszego programu. #define F_CPU 16000000L #include <avr/io.h> #include <avr/interrupt.h> #define l_przod #define l_tyl #define p_przod #define p_tyl int main(void) { //konfiguracja portów DDRB = 255; // wszystko OUT DDRC = 255; // wszystko OUT DDRC &= 0xf8; // zeruje bity 0..2, czyli PD0 - PD2 to IN PORTC = 7; // B00000111 - wejścia PD0-PD2 podciągnięte DDRD = 0; // wszystko IN PORTD = 12; // B00001100 - wejścia PD2, PD3 podciągnięte //definicje zmiennych int wysokosc //konfiguracja PWM TCCR1A|=(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1); TCCR1B|=(1<<WGM13)|(1<<CS10); OCR1B=255; OCR1A=5; while(1) { } return 0 } W międzyczasie usunąłem AVR Studio 4 i zainstalowałem 5.1 - niestety, mój programator AVRprog nie jest w nowym środowisku wykrywany. Wiadomo, lepsze jest wrogiem dobrego. Trzeba było się przesiąść z powrotem na wersję 4. Wracając do programu. Nauka w moim przypadku musi się odbywać na zasadzie czytania kursów, przykładów i wyłuskiwania konkretnych kodów. Niestety nie mogę przeczytać 2,3 kursów i ruszyć z kopyta "z głowy", gdyż z racji wieku pod koniec strony kursu, zapominam co było na początku 🙁 Oczywiste jest, że rozpoczynając naukę, próbuję przerabiać działający program, napisany w Bascom, posiłkując się jego strukturą i już zdefiniowanymi portami, zmiennymi, itp. Tak więc udało mi się (sprawdzone w symulatorze) jakoś skonfigurować porty, ale utknąłem na "powiązaniu" zmiennej z pinem portu. W Bascom korzystałem z kodu: L_przod Alias Portd.6 L_tyl Alias Portd.7 ale w C zastanawiam się, czy jest sens deklarować zmienną i instrukcji #define, czy chcąc sterować konkretnym bitem portu, nie lepiej robić to bezpośrednio? PORTD |= (1<<6) Czy nie jest to optymalniejsze rozwiązanie (z pkt widzenia gospodarki pamięcią i szybkości wykonywania programu)? Jaki jest w takim wypadku "dobry styl" programowania? Link do komentarza Share on other sites More sharing options...
bartek1333 Marzec 24, 2012 Udostępnij Marzec 24, 2012 Jeżeli masz: #define l_przod PORTD |= (1<<6) to preprocesor języka C (jeszcze przed kompilacją) zastąpi wszystkie występowania zwrotu: l_przod, wyrażeniem: PORTD |= (1<<6) Tak więc dyrektywa preprocesora "define" jest ułatwieniem dla programisty i wątpie czy ma to jakieś znaczenie w gospodarce pamięci. Link do komentarza Share on other sites More sharing options...
rezolut Marzec 24, 2012 Autor tematu Udostępnij Marzec 24, 2012 W takim razie, poszedłem w złą stronę. Zmienna l_przod ma przyjmować dwie wartości 0/1 a oprócz tego jest bezpośrednio powiązana z portem. Ale czy muszę ją definiować i przypisywać l_przod = 1, czy da się to załatwić bez definiowania zmiennej? Wiem, że dzwonią, ale nie wiem w którym kościele. Czy takie definicje #define l_przod PORTD |= (1<<6) | (0<<7) #define l_tyl PORTD |= (0<<6) | (1<<7) są poprawne i czy potem użycie w kodzie programu l_przod, spowoduje ustawienie 6 bitu i wyzerowanie 7 bitu? Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »