Skocz do zawartości

[C] Pierwsze kroki


rezolut

Pomocna odpowiedź

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

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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.

  • Lubię! 1
Link do komentarza
Share on other sites

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

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

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

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

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

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

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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.