HomeMade
Programowanie w języku C w środowisku AVR Studio4 - Wersja do druku

+- HomeMade (http://sp-hm.pl)
+-- Dział: Oprogramowanie (/forum-84.html)
+--- Dział: Technika programowania mikroprocesorów (/forum-85.html)
+--- Wątek: Programowanie w języku C w środowisku AVR Studio4 (/thread-1161.html)

Strony: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 25-01-2012 23:41

Zakładam że wiesz co to jest napięcie ...
Zaczne od wyjasnienia co to jest "stan logiczny":
Maszyny cyfrowe takie jak komputer, kalkulator, zegarek elektroniczny, odtwarzacz mp3, GPS.... są to urządzenia kóre dokonują obliczeń, ciągle coś liczą i liczą gdy są uruchomione. Wynikiem ich przeliczeń może być dźwięk z "empetrójki", obraz na teoim telefonie komórkowym, obraz w telewizorze, plik z rysunkiem płytki drukowanej ....
Urządzenia te zbudowane są z układów które komunikują się między sobą za pomocą 0 i 1 (zer i jedynek) - czyli "rozmawiają w języku binarnym". Ale jak syłają między sobą "słowa" zbudowane z zer i jedynek ?? Ktoś to mądrze wymyslił - za pomocą napięcia elektrycznego, które zmienia sie w czasie. Wystąpienie napięcia ( 5Volt ) oznacza 1 - inaczej "stan wysoki" , zaś brak napięcia ( 0Volt ) oznacza 0 - inaczej stan niski.
Więc jeżeli na jakimś wyprowadzeniu układu cyfrowego pojawi się taki przebieg napięcia w czasie :[attachment=4584]
(patrz tylko na czerwony wykres - dane) to będzie to oznaczało że :
w pierwszej milisekundzie na wyprowadzeniu układu jest stan wysoki ( 1 )
w 2 ms na wyprowadzeniu jest stan niski ( 0 )
w 3 jest też ( 0 )
w 4 jest ( 1 )
w 5 jest ( 0 )
w 6 jest ( 0 )
w 7 jest ( 1 )
w 8 jest ( 1 ) ... i tak dalej ...
Postać binarna ( bitowa ) będzie zatem taka jak na górze rysunku, czyli 10010011101.
Czerwony przebieg jest przykładem szeregowego sposóbu komunikacji ... bo kolejne bity następują po sobie - nie ma możliwości przesłać więcej niż jednego bitu na raz w jednej jednostce czasu. Jeżeli mieli byśmy np. 8 wyprowadzeń (tyle jest w każdym POrcie Atmegi32 ) i na każdym z tych wyprowadzeń jest co innego w tej samej jednostce czasu (możemy w jednej milisekundzie przesłać 8 bitów na raz czyli jeden bajt ) - taki sposób przesyłu danych nazywa sie równoległym.... tak w uproszczeniu.

Teraz spróbuję wytłumaczyć ci czym jest "ciąg":
Ciąg to pewnien zbiór elemmentów które sa uporządkowane w określonej kolejności - nie chodzi o uporządkowanie od najmniejszej do największej czy na odwrót. Elementy te wystepuja kolejno po sobie - czyli jeden za drugim.
Przykład ciągu liczbowego ( zapis tego przykładowego ciągu ) : ( 4, 23, 19, 36, 1, 7 ) powiedzmy że to ciąg sześciu liczb wylosowanych w dużym lotku w takiej kolejności w jekiej wypadły kule z bębna.
Przykład ciągu znakowego : ( t, o, _, j, e, s, t, _, c, i, ą, g ) .... z ilu elementów składa się ten ciąg ?? no jasne że z 12 . W języku C też używamy ciągów liczbowych i znakowych - nazywaja się tablicami Smile [/color] dla powyższych przykładów ciągów pokażę odpowiedniki tablic w języku C : nasz ciąg liczb z totolotka będzie wyglądał tak ( 4, 23, 19, 36, 1, 7, /0 ) ... znacznik /0 jest znacznikiemm końca tablicy (ciągu) - jeżeli Atmega natrafi na niego to wie że skończył się ciąg i może zakończyć operację jego przetwarzania. Podobnie z ciągiem znakowym : jego elementy to kolejno : ( t, o, _, j, e, s, t, _, c, i, ą, g, /0 ) . Można w języku C określić tablicę podobnie:
Kod:
char tab[] = {'c', 'i', 'ą', 'g', '_', 'z', 'n', 'a', 'k', 'ó', 'w', ' '};
ale my bedziemy robic to łatwiej i czytelniej czyli:
Kod:
char tab[] = "ciąg_znaków";
Czy to jest dla Ciebie zrozumiałe Janku ?

Teraz kwestia zmiennych typu char i int ....
Napisałeś, że wiesz co to jest bit i bajt ... zatem zmienną typu char jest zmienna 8-bitowa ( 1-bajtowa ) przyjmująca wartości ze zbioru liczb calkowitych od -128 do +127. Zaś zmienna typu int to zmienna 16 bajtowa przyjmująca wartości również ze zbioru liczb całkowitych od -32768 do +32767. W języku C deklarujemy (tworzymy) zmienną którą będziemy potem używać. Robi sie to tak :
Kod:
char x;
czyli deklarujemy zmienną typu char o znazwie x .
Po jej deklaracji (utworzeniu) ma ona wartość "0" (zero). Jeśli chcielibyśmy żeby miała wartość 47 to musimy napisać pod deklaracją:
Kod:
x = 47;
lub od razu zadeklarować i przypisać wartość
Kod:
char x=47;
Teraz x jest równoznaczny z licbą 47 ( x ma wartość 47 ). Jesli gdzie kolwiek w kodzie Atmega natknie sie na zmienną x to wie że "iks" musi sobie zamienić na liczbe 47. - Nie potrafię tego jaśniej wytłumaczyć. Napisz jeśli nadal nie wiesz o co chodzi z tymi zmiennymi. Może ktoś kto umie lepiej tłumaczyć załatwi to wtedy.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP9LAP - 26-01-2012 1:00

Witam!

Proponuję omówić po linijce program z lekcji nr 5, bo prawdę mówiąc "utraciłem chwilowo Wink w tym momencie kontakt z bazą" na tyle, że nawet nie wiem o co spytać. Confused


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ9JXB - 26-01-2012 8:48

Marcin teraz wszystko jasne z tym co napisałeś. Reszta pojmowana w stopniu zrozumiałym.

Co do Atmegi

11- port D
12- 4 porty we/wy , również mogą pełnić inne funkcje, ale nie bardzo rozumiem sposób numeracji wyprowadzeń Atmegi. Ale myślę że w dokumentacji Atmegi to wyczytam


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 26-01-2012 15:39

(26-01-2012 1:00)SP9LAP napisał(a):  Witam!

Proponuję omówić po linijce program z lekcji nr 5, bo prawdę mówiąc "utraciłem chwilowo Wink w tym momencie kontakt z bazą" na tyle, że nawet nie wiem o co spytać. Confused
Ale weś napisz, tu linijki kodu których nie rozumiesz. bp jak zaczne sie rozwodzić nad wszystkimi to mi dnia nie starczy Wink.

(26-01-2012 8:48)SQ9JXB napisał(a):  11- port D
Jesteś pewien ? Pamiętam jak napisałeś
SQ9JXB napisał(a):Dopiero wprowadzenie poprawki Kolegi Bogdana SP3IQ jest wyświetlenie ABCD_
a to była "poprawka" dla wyświetlacza na porcie A
SQ9JXB napisał(a):12- 4 porty we/wy , również mogą pełnić inne funkcje, ale nie bardzo rozumiem sposób numeracji wyprowadzeń Atmegi. Ale myślę że w dokumentacji Atmegi to wyczytam
może źle mnie zrozumiałeś, chodzi mi o to że np. PORT C ma wyprowadzenia:
PC0, PC1, PC3, PC4, PC5, PC6, PC7. Czyli od zera do 7.
Jeszcze Ci powiem o rejestrach ... poniżej kilka przykładów rejestrów które już mogłeś zobaczyć w moim kursie:
DDRA, DDRB, DDRC, DDRD, PORTA, PORTB, PORTC, PORTD, PINA, PINB, PINC, PIND.
Rejestr to tak jakby 8-bitowa (czyli jednobajtowa) pamięć, której zawartość zmieniasz poprzez przypisanie np.
Kod:
DDRA=0b01100101;
lub poprzez podanie pewnych stanów na wyprowadzenia w przypadku gdy port jest ustawiony jako wejścia.
DDRx to rejestry odpowiedzialne za ustawienie "kierunkowości" wyprowadzeń PORTUx - czyli ustawia poszczególne wyprowadzenia portu na wejścia lub wyjścia wedle reguły 0 to wejście, 1 to wyjście.
İmage
(tu akurat jest portA).
PORTx to rejestry które sa odpowiedzialne za stan logiczny wyprowadzeń portów, wedle tej samej reguły co powyżej. zmianę tych stanów osiągamy na przykład poprzez
Kod:
PORTx=0b11110101;
PINx to rejestry "mówiące" nam jakie są stany na poszczególnych wyprowadzeniach PORTUx - rejestry do odczytu - wykorzystywane oczywiście najczęściej w przypadku gdy port jest wejściem. Czyli zapodajemy fizycznie jakieś stany na portx i możemy za pomocą rejestru PINx odczytać je, przypisując tę wartość jakiejś zmiennej, przykład (przypuśćmy że cały PORT B jest wejściem)
Kod:
char y;
y = PINB;
po tym zabiegu zmiennej y przypisujemy wartość według stanów logicznych podanych z zewnątrz na wejścia(wyprowadzenia) portuB. Inaczej mówiąc ... y staje się jakąś liczbą, która reprezentuje stany logiczne podane na wyprowadzenia PORTU B
Dobra... czas na to abyście nie tylko korzystali z gotowców ale też umieli sami zrobić projekt w AVR Studio. I właśnie taki zrobimy:
1. Włączcie AVR Studio - powinno wyskoczyć takie okno:
[attachment=4602]
Kliknijcie na "New Project"
2. Potem wybierzcie "AVR GCC" i resztę tak jak zaznaczyłem na rysunku. wybierzcie sobie katalog w którym macie wszystkie dotychczasowe lekcje, [attachment=4603]następnie klikacie "Next" i zaznaczacie to co na rysunku [attachment=4606]
3. Otworzy sie nowy projekt i jeden pusty plik ( nowy.c ). Wklejcie do niego poniższy kod
Kod:
#include <avr/io.h>
#include <util/delay.h>
#include "lcd_alfanum.h"         // wkleja tu zawartość pliku lcd_alfanum.h

int main(void)
{
    init_lcd();                // inicjuje wyświetlacz
    napis_lcd("napis");            // wyświetla napis pomiędzy cudzysłowami
}
4. Następnie utwórzcie nowy plik - menu file. new file
[attachment=4607]
i wklejcie w jego okienko to:
Kod:
/*  Jest to plik do dziewiątej lekcji Kursu Programowania mikrokontrolera Atmega w języku C,
jednocześnie pierwsza wersja "biblioteki" obsługi wyświetlacza alfanumerycznego
uroczyście nadaje jej nazwę "lcd_alfanum.h"

Aby użyć jej w swoim projekcie należy w głównym pliku programu dodać linię:
#include "lcd_alfanum.h"

autor: Marcin Prajwocki SP4EJT */

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

/* Konfiguracja - na którym porcie i na wyprowadzeniach puszczamy sterowanie LCD */
#define DEF_PORT    DDRD    /* wpisujemy DDRA, DDRB, DDRC, DDRD - zależy który port będzie obsługiwał wyświetlacz */
#define    LCD_PORT    PORTD    /* wpisujemy, który port ma wysyłać dane do wyświetlacza - 4 starsze bity portu (7,6,5,4) */
                /* podłączamy odpowiednio do wyjść D7, D6, D5, D4 wyświetlacza */
#define    LCD_RS        3    /* które wyprowadzenie PORTU będzie linią RS */
#define LCD_E        2    /* które wyprowadzenie portu ma być linią E */
/* koniec konfiguracji. Pamiętajcie że numeracja wyprowadzeń PORTU zaczyna sie od "0" */

void bajt_lcd(unsigned char znak)
{    
    LCD_PORT = (LCD_PORT & 15)|(znak&240);            
    LCD_PORT |= (1<<LCD_E);                 
    LCD_PORT &= (~1<<LCD_E);                 
    LCD_PORT = (LCD_PORT & 15)|(znak<<4);            
    LCD_PORT |= (1<<LCD_E);                 
    LCD_PORT &= (~1<<LCD_E);                 
    _delay_ms(10);
}

void napis_lcd(char tab[])
{    
    LCD_PORT = LCD_PORT|(1<<LCD_RS);
    int i=0;
    while(tab[i]!=0)
    {
        bajt_lcd(tab[i]);
        i=i+1;
    }
}


void init_lcd(void)                            
{
    DEF_PORT = 0xf0|(1<<LCD_RS)|(1<<LCD_E);
    unsigned char i;
    for(i=0;i<3;i++)
    {
        LCD_PORT = (LCD_PORT&0x0f)|(0x30&0xf0);    
        LCD_PORT |= (1<<LCD_E);
        LCD_PORT &= (~1<<LCD_E);
        _delay_ms(50);
    }
    LCD_PORT = (LCD_PORT&0x0f)|(0x20&0xf0);
    LCD_PORT |= (1<<LCD_E);
    LCD_PORT &= (~1<<LCD_E);
    _delay_ms(50);
    bajt_lcd(0x28);                        // Interfejs 4-bit, Wyświetlacz dwuwierszowy, Matryca znaków 5x7
    bajt_lcd(0x01);                        // czyszczenie i przesuniecie na poczatek LCD
    bajt_lcd(0x0e);                        // włączenie wyświetlacza kursor widoczny niemrygający
}

/* autor nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
5. Zapiszcie ten plik pod nazwą "lcd_alfanum.h"[attachment=4608][attachment=4609]
Powinniście uzyskać efekt podobny do tego [attachment=4610]
6. Skonfigurujcie sobie na którym porcie macie wyświetlacz, Skompilujcie i uruchomcie. Napiszcie jeśli coś jest nie tak.
Plik lcd_alfanum.h jest prostą biblioteką obsługi wyświetlacza, w oddzielnym pliku - układ taki powoduje przejrzystość projektu. Pisząc programy dobrze jest właśnie tak rozbijać (na pliki) poszczególne "biblioteki" obsługi urządzeń - np. do pbsługi syntezy DDS, do klawiatury komputerowej, do zegarka/kaledarza, do wyświetlacza TFT, do dekodera dźwięku, do termometru cyfrowego, itp. itd. Do każdego urządzenia jeden plik. dołaczamy je w prosty sposób do naszych projektów urzywając [code]#include "nazwa_pliku" - plik ten musi być umieszczony w tym samym katalogu co plik główny programu (tak na prawdę nie musi ale na razie przyjmijcie że tak jest - będzie Wam łatwiej)
Na dole gotowiec.

W kolejnych lekcjach będę powolutku dążył do programu obsługującego syntezę DDS AD9951 ... ale przed nami jeszcze kawałek drogi ...


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ9RFC - 26-01-2012 17:03

Marcin proponuję uprościć zapis w C
1. W lekcjach mieszasz zapis dziesiętny, heks i binarny - przejdź wyłącznie na binarny - jest bardziej intuicyjny.

lekcja 5... -

DDRA = 255;
DDRB = 0x00;
PORTB= 0x01;
PORTA= 0b01010101;

tak jest bardziej czytelnie :
DDRA = 0b11111111; //wszystkie piny portu A ustawiam jako wyjścia
DDRB = 0b00000000; //wszystkie piny portu B ustawiam jako wejścia
PORTB= 0b00000001; // ???
PORTA= 0b01010101; // niektóre piny portu A ustawiam w stan wysoki (czyli zapalam LEDy :-)

Nie rozumiem po co robisz zapis do portu który ustawiony jest do odczytu?

Paweł sq6oxk stosowanie krótszej formy zapisu (wszelkiego rodzaju fistaszki przed czy po ...) w przypadku nauki programowania jest niepedagogiczne. Operatory matematyczne/logiczne/itd. dla początkującego muszą być identyczne z zapisem matematycznym ze szkoły podstawowej.

x=x-10; jest intuicyjne, ale x-=10 już nie
podobnie: PORTB = PORTB & 0b0000111 można się domyślić, ale PORTB &= 0x0F to już abstrakcja

Trzeba również wyjaśnić co to są operatory arytmetyczne bo większość z nas nie wie co to znaczy <<,^,%,itd - przynajmniej te używane w przykładach.

Jeszcze jedno ...

My nie wiemy co robi E i RS z wyświetlaczem. My nie wiemy jak się steruje takim wyświetlaczem ... domyślam się że do wyświetlacza wysyła się jakieś komendy, dane do wyświetlania, może coś możemy z wyświetlacza odczytać ...
Jest jakaś lista komend uniwersalnych typu: skasuj, ustaw pozycję wyświetlania, ustal wiersz ... ?


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 26-01-2012 17:37

(26-01-2012 17:03)SQ9RFC napisał(a):  Marcin proponuję uprościć zapis w C
1. W lekcjach mieszasz zapis dziesiętny, heks i binarny - przejdź wyłącznie na binarny - jest bardziej intuicyjny.

Nie rozumiem po co robisz zapis do portu który ustawiony jest do odczytu?
Zrobiłem to celowo, aby każdy zrozumiał że zapis tej samej liczby można zrobić na wiele sposobów. Ja z początku tego nie zaczaiłem i miałem przez to problemy. Zawsze możesz we własnym zakresie sobie to przekonwertować, żaden kod podany przeze mnie nie jest na tyle duży by zajęło ci to więcej niż 5 minut czasu. Tu masz pomocnika : http://easycalculation.com/hex-converter.php
SQ9RFC napisał(a):Paweł sq6oxk stosowanie krótszej formy zapisu (wszelkiego rodzaju fistaszki przed czy po ...) w przypadku nauki programowania jest niepedagogiczne. Operatory matematyczne/logiczne/itd. dla początkującego muszą być identyczne z zapisem matematycznym ze szkoły podstawowej.

x=x-10; jest intuicyjne, ale x-=10 już nie
podobnie: PORTB = PORTB & 0b0000111 można się domyślić, ale PORTB &= 0x0F to już abstrakcja
Dlatego droga do pilku obsługującego wyświetlacz była taka długa. Wprowadzanie nowych zagadnień w pierwszych lekcjach było bardzo powolne - nie sądzisz ? Takie małe dokładanie wiedzy było po to aby nie zalać Was zbyt dużą ilością nowych rzeczy. Poza tym jeśli już umiesz rozszyfrować zapis skrócony np. x-=1; lub PORTA&=0b11110000; to nie powinien on dla Ciebie stanowic już problemu bo juz to umiesz. Jeśli to ciągle sprawia ci problemy to potrenuj i po sprawie. Nauka to proces postępujący, przecierz mamy umieć coraz więcej a nie cofać się i robić coraz to bardziej prymitywne rzeczy.
SQ9RFC napisał(a):Trzeba również wyjaśnić co to są operatory arytmetyczne bo większość z nas nie wie co to znaczy <<,^,%,itd - przynajmniej te używane w przykładach.
Napisz mi, działania którego operatora używanego w lekcjach nie wyjaśniłem. Mi się wydaje, że wszystkie użyte przeze mnie zostały opisane na przykładzie. Jeśli tak nie jest to oczywiście wyjaśnię.
Nie wyjaśniłem wszystki operatorów arytmetycznych i logicznych bo gdybym to zrobił niektórzy złapali by sie za głowę i pomyśleli "O Boże ! Tego jest tyle że nigdy tego nie zakumam, rezygnuję ... ", a tak mamy praktyczną rzecz - obsługę wyswietlacza. Jeśli zaczną występować inne operatory w moich lekcjach to oczywiście wyjaśnię zasadę ich działania - chyba że kursanci życzą sobie żebym zrobił to od razu to piszcie o tym. Wszystko co chcecie wyjaśnię, o ile będę to umiał.

Jeżeli większość z Was chce, podobnie jak Jerzy, abym stosował tylko i wyłącznie zapis binarny to ja się do Was dostosuję i będzie tylko binarny - jak chcecie, tylko o tym napiszcie. Dla mnie to żadem problem, nawet będzie mi łatwiej. Tylko zastanawiam się czy to wyjdzie na dobre.
(26-01-2012 17:03)SQ9RFC napisał(a):  
Jeszcze jedno ...

My nie wiemy co robi E i RS z wyświetlaczem. My nie wiemy jak się steruje takim wyświetlaczem ... domyślam się że do wyświetlacza wysyła się jakieś komendy, dane do wyświetlania, może coś możemy z wyświetlacza odczytać ...
Jest jakaś lista komend uniwersalnych typu: skasuj, ustaw pozycję wyświetlania, ustal wiersz ... ?
Oczywiscie że jest ...
Czy zaglądaliście do tego symulatora LCD do ktorego link dałem w poście#25 ?? kliknij tu i szukaj na dole rego postu -> http://sp-hm.pl/thread-1161-post-11195.html#pid11195
Kilka linków:
http://radzio.dxp.pl/hd44780/hd44780_podstawy.htm lub
http://johnryder.wordpress.com/2007/01/24/alfanumeryczny-wyswietlacz-lcd-hd44780/
A w tym datashecie jest gdzieś ładna tabelka i algorytmy zalecanej inicjalizacji i inne takie [attachment=4612]


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ6ADE - 26-01-2012 20:32

A gdzie R/W w sterowaniu wyświetlacza Smile Smile
Dzięki niemu można więcej....


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ9RFC - 26-01-2012 20:57

(26-01-2012 20:32)SQ6ADE napisał(a):  A gdzie R/W w sterowaniu wyświetlacza Smile Smile
Dzięki niemu można więcej....

Na przykład....?


Marcin dzięki za linki do wyświetlacza :-) a ten symulator fajniusi.
Nadal dręczy mnie pytanie: po co robisz zapis do portu który ustawiony jest do odczytu?


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ6ADE - 26-01-2012 21:04

Nie tracić czasu proca i korzystać z informacji zgromadzonych w wyświetlaczu.
Lektura obsługi sterownika HD-LCD wskazana.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 26-01-2012 21:44

(26-01-2012 20:32)SQ6ADE napisał(a):  A gdzie R/W w sterowaniu wyświetlacza Smile Smile
Dzięki niemu można więcej....
Nie umiem tego , nie wnikałem w to bo nie było mi potrzebne.
(26-01-2012 20:57)SQ9RFC napisał(a):  Nadal dręczy mnie pytanie: po co robisz zapis do portu który ustawiony jest do odczytu?
Mógłbyś rozwinąć to pytanie ? bo nie do końca wiem o co chodzi ...

(26-01-2012 21:04)SQ6ADE napisał(a):  Lektura obsługi sterownika HD-LCD wskazana.
Wiesz co byłoby gdybym ja miał taki stosunek do swoich kursantów ?
Napisałbym tak:
"Lektura datashetu Atmegi, kompilatora WinAVR oraz Książki Język ANSI C wskazana.
Dziękuję i powodzenia ! " Tongue .... ale myślę że to raczej by nie pomogło w nauce. Nie sądzisz ?