Skocz do zawartości

Pomocna odpowiedź

Napisano

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?

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.

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.?

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

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?

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.

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.

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.

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.

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?

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.

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?

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ę »
×
×
  • Utwórz nowe...