Skocz do zawartości

[Programowanie] Szybki start z WinAVR


abxyz

Pomocna odpowiedź

Bascom jest w wiele prostszy ale uczy złych nawyków takich jak brak ;

To żeś dowalił, albo ty masz takie pojęcie o złych nawykach, albo w żadnym z tych 2 języków nie potrafisz tak do końca pisać programy. Jak można w ogóle takie brednie pisać?

Link do komentarza
Share on other sites

moim zdaniem główny zły nawyk jaki wyrabia bascom to nieznajomość architektury. Jeśli ktoś nie używa prawdziwych nazw rejestrów konfiguracyjnych i nie wie w jaki sposób niektóre operacje są realizowane, może później mieć problemy np. podczas szukania błędów albo jakiś operacji krytycznych czasowo. Ale w sumie ekspertem nie jestem bo bascoma znam tylko pobieżnie a avry programuję w innych językach.

Za to braku stawiania średników raczej bym nie nazwał złym nawykiem tylko typowym błędem początkującego który każdy musi ileś razy w życiu popełnić zanim średniki wejdą w nawyk.

Link do komentarza
Share on other sites

Kiedyś pisałem że niby kurs jest od podstaw a jednak tych podstaw brak. Do przed chwilą nie wiedziałem po co takie deklaracje:

#include <avr/io.h>
#include <util/delay.h>

Wszyscy trąbili że to biblioteki ale ja nie miałem pojęcia gdzie one się mieszczą i czemu mają akurat takie nazwy a przede wszystkim jak to zapamiętać?

Nie można było napisać że to są biblioteki zawarte w folderze instalacji programu WinAVR i znajdują się w lokalizacji ujętej znakami <> ?

Zobaczcie jakie to oczywiste a jednak nikt tego nie wyjaśnił a ja do tej pory tego nie wiedziałem. O takie podstawy mi chodzi. Co, gdzie, skąd i dlaczego tak a nie inaczej?

Rodzi się pytanie po co się nad tym zastanawiałem? Bo zastanawiałem się dlaczego na początku programu pisze się akurat na przykład:

#include czy też

#include

a nie dajmy na to:

#include czy może

#include ?

Czemu służy zapis:

void inc_adss(void)

Czy int znaczy initial ?

Link do komentarza
Share on other sites

#include <avr/io.h> 
#include <util/delay.h>

Pisze się tak, ponieważ tak masz rozmieszczone pliki nagłówkowe zaraz po instalacji. Skocz do katalogu:

tam_gdzie_masz_winavr\WinAVR-20100110\avr\include
Czemu służy zapis:[code]void inc_adss(void)
[/code]

To jest deklaracja funkcji o nazwie "inc_adss". Oczywiście ciało tej funkcji wkładamy między "{" a "}".

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

Ten zapis jest deklaracją funkcji(procedury) o nazwie inc_adss nie zwracającej żadnej wartości, nie pobierającej argumentów.

Int to integer, typ zmiennej całkowitej, występuje chyba też w bascomie.

Link do komentarza
Share on other sites

matrix, brakuje Ci ewidentnie podstaw c, weź jakąkolwiek książkę (polecam wspomnianą już Symfonię c++) z podstawami c lub c++(w podstawach niczym się nie różnią) i poczytaj o tych plikach nagłówkowych piszą przeważnie w pierwszych rozdziałach.

Ten zapis co tam podałeś to pierwsza linijka definicji funkcji która nie pobiera żadnych parametrów i też nic nie zwraca. Skąd wiem, że to definicja a nie deklaracja? A stąd, że nie ma na koniec średnika, czyli coś będzie dalej w formie instrukcji ujętych w klamry. Jest to naprawdę prosty język, ale trzeba trochę do niego przysiąść, szczególnie jak programowało się w bascomie, są duże różnice, ale da się to przeżyć.

Link do komentarza
Share on other sites

Pytając czemu służy zapis:

void inc_adss(void)

miałem bardziej na myśli nie czemu jest zmienna (?) inc_adss bo to sobie na podstawie kontekstu wyczytałem tylko dlaczego jest najpierw void bez nawiasu a później w nawiasie? I czemu to jest void skoro po angielsku znaczy nieważne? To jakaś instrukcja przywołania czy jak? Cholera, ten jeżyk jest taki trudny bo nic z niczym się nie kojarzy.

Link do komentarza
Share on other sites

Pierwsze void bez nawiasu oznacza ze ta funkcja nic nie zwraca. Potem void w nawiasie mówi jakie argumenty potrzebuje (=żadnych). Równie dobrze można napisać bez void'a w nawiasach.

Co do trudności języka - kwestia przyzwyczajenia. Ale opłaca się go umieć

Link do komentarza
Share on other sites

Void to pustka, nic, nicość. Oznacza że nic nie zwraca.

Deklarując funkcję definiujemy jaki typ wartości ma zwracać. Może być funkcja logiczna bool, jakaś rzeczywista float, całkowita int, albo nie zwracać nic(bo co ma np. zwracać procedura sterująca silnikami) i wtedy jest właśnie void.

Po nazwie funkcji w nawiasach podaje się argumenty(parametry), dokładnie tak jak w matematyce - jest f(x). Ale czasami nie potrzebujemy podawać parametrów, wtedy piszemy void.

Link do komentarza
Share on other sites

a co do tych include to standardowe biblioteki są umieszczane w nawiasach <>, ale można też pisać swoje własne pliki nagłówkowe zawierające funkcje czy definicje stałych i wtedy taki plik nagłówkowy (z rozszerzeniem *.h) dajesz w apostrofy i powstaje: #include "naglowek.h"

Link do komentarza
Share on other sites

Void to pustka, nic, nicość. Oznacza że nic nie zwraca.

Czyli co? Znaczy że na przykład ta część kodu:

unsigned int get_code(void)

pobierze 16 bitowy numer karty i ma nie zwracać ani prawdy ani fałszu?

To zróbmy inaczej, ja coś przeanalizuję a Wy mnie poprawcie. Kawałek kodu:

unsigned int get_code(void)		 
{                          			
char i,j,k,l;   
unsigned int code=0,bin;  

IN=1;      
DDRB.1=1;   
reset(); 

code=0;

for(i=0;i<110;i++)
{ 
inc_adss();
}
wr_bit();

Rozumiem to tak:

- unsigned int get_code(void) - zadeklaruje zmienną o danej nazwie bez zwracania prawda/fałsz? Po co zwracanie czegokolwiek przy deklarowaniu zmiennej?

- char i,j,k,l; - zadeklaruje zmienne i,j,k i l jednego znaku

- unsigned int code=0,bin; - zadeklaruje dwie zmienne z czego pierwszej od razu nada wartość 0

- IN=1; - to akurat w programie jest przypisane do wyprowadzenia portb.1 (podciągnie do plusa?)

- DDRB.1=1; - ustawi portb.1 jako wyjście, czemu nie zamienione z linią wyżej?

- reset(); - co zresetuje? portb.1?

- code=0; - do zmiennej code wpisane zostanie 0

- for(i=0;i<110;i++) - co tu się dzieje? dla zmiennej i=0, i mniejszej niż 110 i i zwiększonej o 1?

- inc_adss(); - nie mam pojęcia co tu się stanie

- wr_bit(); - tu też nie mam pojęcia

Link do komentarza
Share on other sites

pierwsza linijka jest definicją funkcji a nie zmiennej! Świadczy o tym nawias () przeznaczony na argumenty funkcji. Ta funkcja zwraca wartość typu unsigned int i nie bierze argumentów. To co funkcja robi jest umieszczone w nawiasach klamrowych od następnej linii.

dwie następne linijki masz dobrze zinterpretowane, co do przypisania wartości rejestrom port i data direction - kolejność jest nie ważna, tylko to aby oba były ustawione odpowiednio zanim je do czegoś wykorzystasz. Natomiast nie wydaje mi się, żeby zapis DDRB.1 był poprawny. Zamiast tego masz kilka sposobów aby to ustawić, najbardziej obrazowy to DDRB = 0b00000010 gdzie rejestrowi b przypisujesz zmienną w postaci bitowej o czym świadczy przedrostek 0b a dalej dajesz zera albo jedynki na odpowiednich bitach tak jak ci pasuje.

Linijki reset(); inc_adss(); wr_bit(); to inne funkcje tak więc nie możemy powiedzieć co robią nie znając ich kodu. A pętla for działa tak: for (poczatkowa operacja; warunek wyjścia z pętli; instrukcja do wykonania po każdym przejściu pętli)

czyli w tym wypadku wykonuj funkcję inc_adss() 110 razy. bo i na początku będzie wynosić 0 a kiedy wyniesie 110 to spełni się warunek wyjścia. Jeśli byś napisał for(;😉 to miał byś pętlę nieskończoną.

I na koniec jeszcze raz się powtórzę - zamiast wywarzać otwarte drzwi zajrzyj w końcu do jakiś tutoriali bo tutaj opisujemy takie podstawy, że wiedział byś to wszystko po przeczytaniu dwóch rozdziałów.

Link do komentarza
Share on other sites

W sumie jedyna odpowiedź jaka mi się nasuwa to:

http://pl.wikibooks.org/wiki/C

Linijka po linijce przy pomocy tego tutoriala spróbuj sobie sam odpowiedź na te pytania.

Powiem tylko jeszcze, że jest znaczna różnica miedzy zapisaem

int koza;  //Deklarujesz zmienna
int koza(); //Deklarujesz funkcje

w zasadzie powinno być:

int koza()
{
};

Proszę dobrze się zastanowić przed następnym pytaniem ponieważ coraz trudniej będziesz znajdował się ze zrozumieniem.

Pozdrawiam

Link do komentarza
Share on other sites

unsigned int get_code(void) - zadeklaruje zmienną o danej nazwie bez zwracania prawda/fałsz? Po co zwracanie czegokolwiek przy deklarowaniu zmiennej?

- to nie deklarowanie zmiennej a funkcji

- funkcja może coś zwracać

- IN=1; - to akurat w programie jest przypisane do wyprowadzenia portb.1 (podciągnie do plusa?)

To akurat nic nie zrobi, bo PORTB nie jest strukturą, no chyba, że jest gdzieś zadeklarowana struktura portb. Kropka służy do odwoływania się do elementów struktur.

- DDRB.1=1; - ustawi portb.1 jako wyjście, czemu nie zamienione z linią wyżej?

j.w.

DDR (np. DDRB) oznacza kierunek portu

PORTB oznacza podciągnięcie bądź wymuszany sygnał na porcie

PINB pozwala na odczyt stanu portu

- reset(); - co zresetuje? portb.1?

nie wiadomo, to jedynie wywołuje funkcję reset(), której zawartość już podawałeś.

- for(i=0;i<110;i++) - co tu się dzieje? dla zmiennej i=0, i mniejszej niż 110 i i zwiększonej o 1?

pętla iteracyjna - zwiększając i od 0 do 109 co 1 będzie wykonywana zawartość pętli.

- inc_adss(); - nie mam pojęcia co tu się stanie

- wr_bit(); - tu też nie mam pojęcia

są wywoływane funkcje.

Poza tym chyba ok.

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.