HomeMade

Pełna wersja: Programowanie w języku C w środowisku AVR Studio4
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Jacku, masz nie właściwą wersję AVRDUDE, tak przynajmniej to wygląda.
Ściągnij dokładnie tą która jest na stronie forum And-Tech-a, bo inna Ci nie zadziała. Wersja ta, pewnie jako jedyna ma przygotowany w konfiguracji programator EvB, który jest niestandardowy i dlatego w inne nie potrafi go obsłużyć.
Uwidacznia się to własnie błędem, że nie zna takiego programatora.
teraz Atmegowa "zerówka" dla tych , których przeraża obudowa Atmegi32 z 40-toma wyprowadzeniami i którzy nie są w stanie ogarnąć swoim umysłem o co chodzi w moich dotychczasowych lekcjach. Powinienem to wcześniej napisać, ale powiem wam jedno: NIE PODDAWAJCIE SIĘ. Atmega16/32/64 to bardzo przyjazny pająk.
Pinologię przewdstawia poniższy rysunek:
[attachment=4544]
Na razie udawajcie że nie widzicie napisów w nawiasach - na tym etapie są nieistotne. Istotne dla was są natomiast Wyprowadzenia PORTÓW A, B, C i D.
Jak widzicie każdy port jest "8-mio bitowy" (ma 8 wyprowadzeń) bo Atmega to mikrokontroler 8-mio bitowy. Każde z tych wyprowadzeń może spełniać role wejścia logicznego lub wyjścia - w zależności jak ją zaprogramujecie. Port A posiada wyprowadzenia od PA0 do PA7. PORT B posiada wyprowadzenia od PB0 do PB7. PORT C od PC0 do PC7 no i PORT D już pewnie wiecie jak ...
Przypuśćmy że chcemy by wyprowadzenia portu A od PA0 do PA6 były wyjściami, a PA7 wejściem ...
w kodzie programu musimy zatem umieścić taką linijkę:
Kod:
DDRA = 0b01111111;
Po "0b" wstawiamy odpowiednio 0 lub 1 (0=wejście, 1-wyjscie) które reprezentują kolejno wyprowadzenia PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0. Wyjaśnia to poniższy rysunek
[attachment=4546]
Analogicznie do powyższego przykładu ustawić można stan wyprowadzeń portu, poprzez przypisanie wartości do rejestru PORTA, np.:
Kod:
PORTA = 0b00001111;
powyższa linijka spowoduje że porty PA7, PA6, PA5, PA4 będą w stanie niskim, a porty PA3, PA2, PA1, PA0 będa w stanie wysokim. Już macie obcykany port A Smile Reszta portów czyli B, C, D działa analogicznie, musicie tylko zmienić literkę A na inną. Można powiedziec że jeśli to zrozumiecie to macie 32 wyprowadzenia Atmegi wytłumaczone zostaje 8 pinów, z których musicie tylko znać teraz dwa piny do zasilania, dwa do masy, dwa do generatora kwarcowego, jeden pin RESET, który po podaniu stanu niskiego (zwarciu do masy) resetuje nam Atmegę - potrzebne po zaprogramowaniu na płycie ewaluacyjnej. Zostaje nam ostatni PIN "AREF" - nie musicie nic wiedzieć na jego temat na tym etapie nauki. Mam nadzieję, że po takim prościutkim i króciutkim wprowadzeniu, Atmega nie jest już dla was "postrachem" lecz zaczyna być "znajomym kumplem".

lekcja 4
Kod:
/*  Jest to czwarta lekcja Kursu Programowania mikrokontrolera Atmega w języku C    
    Należy podłączyć 8 diód LED do Portu A, każdą poprzez rezystor 680 OHm (od 500 do 1k), druga noga każdej diody do masy.
    oraz przycisk (microswitch lub inny) do Wyprowadzenia B0 (PORT B wypr.0) - drugi biegun do masy.*/

/* zanim przejdziemy dalej przedstawię różne sposoby zapisu wartości, jeśli ktoś widzi to pierwszy raz to niech w internecie poszuka informacji na ten temat:

    zapis dziesiętny    zapis binarny    zapis hexadecymalny(szestnastkowy)
                 0     =      0b00000000     =    0x00
                 1     =      0b00000001     =    0x01
                10     =      0b00001010     =    0x0a
                16     =      0b00010000     =    0x10
               255     =      0b11111111     =    0xff (może byc też 0xFF)
   Jak pewnie zauważyliście do zapisu binarnego używany jest prefix "0b" a do szasnastkowego "0x" */

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

int main(void)
    {
    DDRA = 0xff;        // (tożsame z: DDRA = 0b11111111)        
    DDRB = 0;            // mógłbym napisać 0x00
    PORTB= 1;            // to jest to samo co 0x01
    PORTA= 0b01010101;    // tam gdzie jedynka dioda świeci - zatem świeci co druga dioda (co drugie wyjście PORTU A ma stan wysoki)
                        // jak widzicie stosuje sobie taki zapis jaki jest mi wygodny kiedy chcę i gdzie chcę i to działa !!!
                        // bez względu na to czy podacie wartość szasnastkowo czy binarnie - kompilator sobie to przetłumaczy
    while(1)
        {
        if(bit_is_clear(PINB, 0))    // to musicie pamiętać z poprzedniej lekcji
            {
/* UWAGA! */PORTA=PORTA^3;             // zmieńcie liczbę poprawej stronie znaku "^" , następnie skompilujcie i zaprogramujcie Atmegę (dobry efekt jest jak wpiszecie 255)
            _delay_ms(160);    
            }  
        }
    }
/* komentarz do linijki z UWAGĄ:
wstawiajcie inne liczby zamiast jedynki, za każdym razem kompilujcie i wgrywajcie  hexa do atmegi
zobaczcie co sie zmienia po przyciśnięciu przycisku (lub po jego przytrzymaniu) - to bardzo ciekawy efekt
jeżeli ktoś tego nie zrozumie po kilku(nastu) próbach - ułatwieniem będzie zamiana tej liczby na 8 bitowy zapis binarny np. 0b00001111 */

/* autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lekcja 5
Kod:
/*  Jest to czwarta lekcja Kursu Programowania mikrokontrolera Atmega w języku C    
    Należy podłączyć 8 diód LED do Portu A, każdą poprzez rezystor 680 OHm (od 500 do 1k), druga noga każdej diody do masy.
    oraz przycisk (microswitch lub inny) do Wyprowadzenia B0 (PORT B wypr.0) - drugi biegun do masy.*/

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

int main(void)
    {
    DDRA = 255;                
    DDRB = 0x00;            
    PORTB= 0x01;            
    PORTA= 0b01010101;
    while(1)
        {
        if(bit_is_clear(PINB, 0))
            {
/* UWAGA! */PORTA=(PORTA^255) & 0b00001111; // zmieńcie liczbę (poprzestawiajcie jedynki) poprawej stronie znaku "&" ,
                                            // następnie skompilujcie i zaprogramujcie Atmegę    
            _delay_ms(160);        
            }  
        }
    }
/* komentarz do linijki z UWAGĄ:
wyrażenie  "& 0b00001111" "nakłada maskę" na wcześniejsze wyrażenie w taki sposób, że pozwala na zaświecanie tylko tych diód (pojawienie sie stanu wysokiego na wyprowadzeniach portu),
które są "oznaczone" jedynką. Fachowo nazywa sie to koniunkcja (tak jak w bramce logicznej AND).
Działa to tak:

  0 1 0 1 0 1 0 1
&
  0 0 1 1 0 0 1 1
=
  0 0 0 1 0 0 0 1

autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lub w plikach poniżej

ps. następnym razem będziemy katować popularny wyświetlacz alfanumeryczny: 2linijki po 16 znaków na sterowniku HD44780, więc się zapoznajcie z jego budową i sposobem podłaczenia oraz z symulatorem który jest do pobrania poniżej. Człowiek, który go zrobił pozwala powielać i umieszczać na swojej stronie ten programik napisany w javie.
Ja właśnie z takiego symulatora wziąłem swoja umiejętność obsługi tego LCD
[attachment=4536][attachment=4548][attachment=4538]
Napisał by ktos czy za trudne rzeczy wam wciskam w głowy czy moze za łatwe i się tak nudzicie, że straciliście zainteresowanie ???
Dla tych którzy się już nudzą to zapodaje programik który ma wyświetlić na wyswietlaczu alfanumerycznym tylko cztery litery "ABCD" (na początek, potem będzie weselej). Sposób zasilenia i podłączenia potencjometru kontrastu znajdźcie w sieci, może potem wkleje schemat ( jak znajdę/zrobię). Ci , którzy maja płytę ewaluacyjną maja z górki bo tam już wszystko jest przygotowane pod wyswietlacz.
Kod:
/*  Jest to szósta lekcja Kursu Programowania mikrokontrolera Atmega w języku C    
    Należy podłączyć Wyświetlacz alfanumeryczny do Portu A, w następujący sposób:

ATMEGA    <--> wyświetlacz
A7        -        D7
A6        -        D6
A5        -        D5
A4        -        D4
A3        -        RS
A2        -        E
4 młodze bity wy świetlacza podłaczone do masy (czyli D3, D2, D1, D0 do masy)

Program wyświetla cztery litery "ABCD" na wyświetlaczu */

#include <avr/io.h>
#include <util/delay.h>
unsigned char znak;

/* TO PONIŻEJ jest to funkcja o nazwie "bajt_lcd" wykonująca linie kodu zamknięte
   w nawias klamrowy. Wywołuje się nią pisząc "bajt_out(bajt_który_chcesz_wysłać_do_LCD)"
   np. "bajt_out(0x28);" lub "bajt_out(0b00100100);" - ujrzycie to w części głównej programu.
   Funkcja ta dzieli na pół bajt który chcemy wysłać(bo używamy 4-bitowego interfejsu)
   i przesyła najpierw 4 starsze bity, a potem 4 młodsze bity bajtu, który chcemy wysłać */

void bajt_lcd(unsigned char znak)
    {    
    PORTA = (PORTA&0x0f)|(znak&0xf0);
    _delay_ms(5);
    PORTA = PORTA|0b00000100;         //wyprowadzenie PA2 w stan wysoki = E=1
    _delay_ms(5);
    PORTA = PORTA&(~0b00000100);     //wyprowadzenie PA2 w stan niski  = E=0    
    _delay_ms(50);
    PORTA = (PORTA&0x0f)|(znak<<4);
    _delay_ms(5);
    PORTA = PORTA|4;                 //wyprowadzenie PA2 w stan wysoki = E=1
    _delay_ms(5);
    PORTA = PORTA&(~4);             //wyprowadzenie PA2 w stan niski  = E=0    
    _delay_ms(50);
    }

//zaczynamy część główną programu

int main(void)
    {
    DDRA = 0xfc;
    unsigned char  i;
    for(i=0;i<3;i++)                // zaleca się 3 x tą operację c.d.n.
        {
        PORTA = (PORTA&0x0f)|(0x30&0xf0);        // inicjalicacja 8bit
        _delay_ms(5);
        PORTA = PORTA | 4;             //wyprowadzenie PA2 w stan wysoki = E=1
        _delay_ms(5);
        PORTA = PORTA & ~4;         //wyprowadzenie PA2 w stan niski  = E=0
        _delay_ms(10);
        }
    PORTA = (PORTA&0x0f)|(0x20&0xf0);    // inicjacja według zaleceń c.d.
    _delay_ms(5);
    PORTA |= 4;                     //wyprowadzenie PA2 w stan wysoki = E=1
    _delay_ms(5);
    PORTA &= ~4;                     //wyprowadzenie PA2 w stan niski  = E=0
    _delay_ms(5);

    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

    PORTA = PORTA|0b00001000;     //wyprowadzenie PA3 w stan wysoki = RS=1 (wyświetlanie znaków)

    bajt_lcd(0b01000001);        // wyświetlam literę A
    bajt_lcd(0x42);                // wyświetlam literę B
    bajt_lcd(67);                // wyświetlam literę C
    bajt_lcd('D');                // wyświetlam literę D
    }

/* autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lub plik z lekcją6[attachment=4549]
Witam wszystkich,
Nie jestem na razie aktywny, bo tego typu przykłady i inne już przerabiałem wcześniej, co prawda na Atmega8 ale to nie ma większego znaczenia. Dziś dotarł zestaw uruchomieniowy, więc sprawdziłem wszystkie przykłady Marcina SP4EJT na Atmega32 i wszystko działa. Wybrałem zestaw uruchomieniowy jak sugerował Marcin, to jest od microSENSE. Z dwóch dostępnych (jest jeszcze EvB 4.3v4) ale microSENSE wydawał mnie się ciekawszy, bo posiada klawiaturę w układzie 4x4, 16 przycisków, natomiast w EvB 4.3v4 są tylko 4 przyciski. Programuję Atmega32 poprzez wcześniej nabyty USBasp włączany do portu USB peceta a na płycie włączam do gniazda ISP (CANDA) i programuję stosując program na licencji GPL AVR8 BUT-O-MAT w wersii 1.4.2.b i napisany w Java, co można użytkować pod Linuks, Windows i Mac. Zestaw uruchomieniowy microSENSE ma własny programator na płycie, ale jeszcze nie sprawdziłem jak to działa.
73 Bogdan, SP3IQ.
w temacie FTDI ... od pewnego czasu nie jest prawdą że
(16-01-2012 12:43)SP4EJT napisał(a): [ -> ].... Nie da się(chyba że czegoś nie wiem) zaprogramować nim fabrycznie nowej ( z czystą pamięcią ) ATMEGI - tylko programatorem zaprogramujecie.

http://www.elektroda.pl/rtvforum/topic2112078.html

:-) tez jakiś czas temu natknałem się na dwa takie rozwiązania ... gdzie programator jest "softwarowy" w PC a FTDI jest jedynie "pinami" programatora.

Osobiście tego nie testowałem - ale komuś się to przyda i podzieli się dobra nowiną ....

İmage
Witam!

ad. lekcja 1

kompilcja.. i co dalej??

Jak zaprogramować procesor na płytce z microSENSE Huh

przydałby się plik *.hex Confused ??

pozdrawiam.

Jarek
Jarku.... Komplilacja to właśnie czynność, której skutkiem jest właśnie plik *.hex, jest on umieszczony w podkatalogu "default", który znajduje się w katalogu "lekcja1".
Jeśli ktoś jeszcze ma podobny problem to śmiało pytajcie. To, o co zapytał Jarek to początki początków, a wiadomo, że początki są najtrudniejsze. Przepraszam, że wcześniej nie napisałem gdzie po kompilacji znajduje się plik *.hex - popełniłem typowy nauczycielski błąd - poprostu jest to dla mnie tak oczywiste, iż myślałem że skoro ja to wiem, to wszyscy muszą to wiedzieć Smile
HeJ!

*.hex się znalazł Angel !

Tylko jak go teraz bez sprzętowego programatora wpompować do atmegi na płytce z microSENSU ??

Wygląda na to, że nie mam sterownika programatora.. Ale jak go zainstalować ?

sp9lap

ps. Na razie zajęcia w "zerówce" Smile...
Jarek ... powinieneś dostać klapa w d..e jak małe dziecko Wink
Nie przeczytałeś wszystkich postów ! Przecierz nie jest ich aż tak dużo, temat ma dopiero 3 strony ... Wróć sie do postu numer 23, jesli nie wiesz jak kliknij tu: http://sp-hm.pl/thread-1161-post-11185.html#pid11185
Przeczytaj bardzo uważnie ten post i tą instrukcję, której link jest tam zamieszczony szczegolnie strony 4, 12 i 13. Dostałeś ją na płycie CD z płyta ewaluacyjną ale widze że nie chciało ci się jej przeczytać.
Sterownik tez masz na płycie, masz tu link bo może ci CD-ROM wysiadł http://www.microsense.pl/allegro/EvB_ATm...tified.zip
Jeśli nadal nie dasz rady zaprogramować atmegi to napisz wtedy napisze ci instrukcje krok-po-kroku.
Witam - przepraszam że byłem na ...... wagarach Blush ale walczyłem z płytką EvB 4.3 - żebym mógł programować na niej - ale poległem - zakupiłem nowy programator AVRPROG MKII ( stary MULTITOOL raz zgłaszał się jako programator a raz jako dysk ) - w czwartek na spotkaniu klubowym przywróciliśmy do ustawień fabrycznych moje atmegi (16/32/644p) dzięki http://diy.elektroda.eu/atmega-fusebit-doctor-hvpp/ który przyniósł kolega ( dzięki Zdzisław ). Dzisiaj wymieniłem fash w AVRPROG MKII żeby mógł współpracować z AVR STUDIO 4 - teraz zabieram się za odrobienie lekcji 1 Blush - pozdrawiam Jacek.

P.S. - wszystkie lekcje skompilowane i przetestowane na płytce poprawnie - trochę zastanawia mnie fakt że przy "_delay_ms(1000)" teoretycznie czas powinien wynosić 1 sekundę - u mnie trwa znacznie dłużej około 4 sekund kwarc mam 16MHz i tak mam wpisane w Project -> Configuration Options -> Frequency: 16000000 hz.
Jakieś sugestie?
Własnie tego jeszcze do końca nie rozgryzłem - raz to działa raz nie - nie wiem o co chodzi.
W takim razie napewno pomoże ci wpis w głównym pliku programu (lcd.c) na samej górze #define F_CPU 16000000
Sprawdzam pracę domową z postu#4 kolegi SQ6IYY. Zadanie brzmiało:
Kto bardziej kumaty - niech spróbuje zrobic tak aby dioda i przycisk działały na tym samym Porcie np. na Porcie A dioda niech zostanie na A0 a przycisk dajcie na A7.
Chyba byłem pijany bo wcześniej nie zakumałem że on pokazał mi efekty swojej pracy. Do rzeczy ... to kod napisany przez SQ6IYY
Kod:
#include <avr/io.h>            // czyli tu dla kompilatora jest cała zawartość pliku io.h (nie wnikajcie teraz gdzie jest ten plik
#include <util/delay.h>        // tu podobna historia do powyższej

int main(void)
     {
     DDRA = 0b00000001;    
       PORTA= 0b10000000;    
      while(1)
         {
         if(bit_is_clear(PINA, 0))    
        
             PORTA=PORTA^0b00000001;  
             _delay_ms(160);            
             }  
         }
Dobrze kombinował ale to raczej poprawnie nie zadziała, poniżej kod z komentarzami do błędów Michała (nie ma tam linii z "#include...." bo szkoda miejsca - oczywiście są one potrzebne do działania
Kod:
int main(void)
     {
     DDRA = 0b00000001;    
     PORTA= 0b10000000;    
     while(1)
         {
         if(bit_is_clear(PINA, 7))  /* przycisk na A7 - Michał miał na A0, a tam jest dioda */
               {         /* nie było nawiasu "otwierającego" zawartość instrukcji "if" */
               PORTA=PORTA^0b00000001;  
               _delay_ms(160);            
               }  
          }
      }     /* brakowało mawiasu "zamykającego" funkcje główną(main) */
ogólnie z tymi nawiasami jest tak że liczba nawiasow " { " powinna być równa liczbie nawiasów " } " bo każda funcja ma postać :
Kod:
jakas_funkcja_lub_instrukcja(jakis_warunek_lub_arr​gument)
    {                // nawias "otwierający"
    jakies_polecenia;
    }                // nawias "zamykający"
Nie ważne czy w liście poleceń funkcji/instrukcji są inne funkcje/instrukcje - trzeba ZAWSZE trzymać się tej zasady
Chyba czas opisać teraz zasadę działania kilku instrukcji z których juz korzystalismy:
Instrukcja <b>for</b>
Kod:
for(wyrażenie)
    {   ciąg poleceń które wykonają się jesli wyrażenie jest spełnione(prawdziwe) }
Instrukcja <b>if</b>
Kod:
if(wyrażenie)
    {   instrukcje wykonywane jeśli wyrażenie jest prawdziwe   }
else
    {   instrukcje wykonywane jeśli wyrażenie nie jest prawdziwe    }
"else" nie musi występować jesli nie jest potrzebne.
Instrukcja <b>while</b>
Kod:
while(wyrażenie)
    {  instrukcje wykonywane "w kółko" aż do momentu kiedy wyrażenie przestanie być prawdziwe   }
Uwaga na nawiasy ! Ja umieszczałem { i } w jednej linii ale żeby sie nie pomylić który nawias jest do której instrukcji/funkcji stosujcie zasadę: "zamykajacy" nawias funkcji/instrukcji x stawiajcie zawsze pod nawiasem tejże funkcji, przykład wyjasniający poniżej:
Kod:
funcja_x(wyrażenie)
{                                       // <-- to jest nawias "otwierający" zawartość funkcji_x
    jakieś_polecenia;
    instrukcja_y(wyrażenie)
    {                                   // <-- nawias "otwierający" zawartość instrukcji_y
        jakieś_polecenia;
        instrukcja_z(wyrażenie)
        {                               // <--  nawias "otwierający" zawartość instrukcji_z
             jakieś_polecenia;
        }                               // <--  nawias "zamykający" zawartość instrukcji_z
       znowu_jakieś_polecenia;
    }                                   // <--  nawias "zamykający" zawartość instrukcji_y
}                                       // <--  nawias "zamykający" zawartość funkcji_x
Czy to jest zrozumiałe ???
Stron: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Przekierowanie