Odpowiedz 
 
Ocena wątku:
  • 3 Głosów - 3.33 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie w języku C w środowisku AVR Studio4
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #76
RE: Programowanie w języku C w środowisku AVR Studio4
Po dłuższej przerwie czas ruszyć dalej. Wspominałem że będę drążył temat obsługi syntezy DDS (AD9951), nię będe sie rozwodził na układach gorszych (tańszych) bo są beznadziejnej jakości - szkoda pchać ich nawet do prostych konstrukcji.
A więc zaczynam lekcję 10
Będę powoli "budował" program sterujący układem AD9951, na początku wprowadzę zmienną o nazwie frequency (po polskiemu częstotliwość). Problemem który będziemy rozwiązywać będzie wyświetlenie tej częstotliwości na naszych wyświetlaczach. Ponieważ częstotliwość naszej syntezy będzie pomiędzy 0 a 150MHz musimy użyć zmiennej typu unsigned long int - czyli zmiennej 32-bitowej bez znaku (czyli przyjmującej tylko wartości dodatnie lub 0 - bo nie ma częstotliwości ujemnej). powiedzmy że częstotliwość ta na razie będzie stała i będzie wynosić 3710000 Hz. A więc musimy w głównym programie dodać
Kod:
unsigned long int frequency;
frequency = 3710000;
Mamy już zadeklarowaną zmienną z przypisaną wartością. Jak ją wyświetlić na LCD ??
Gdyby to była stała to byśmy skorzystali z nasze biblioteki i zrobili tak
Kod:
napis_lcd("3710000");
ale problem w tym że wartość ta będzie się zmieniać. Trzeba zamienić wartość zmiennej na ciąg znaków z tabeli ASCII (wyszukajcie ją sobie w necie).
Ja rozwiązałem to tak:
Kod:
void wys_freq(unsigned long int xxx)
{
    char freq_string[9], i;
    freq_string[9]=0;
    for(i=8; i>0; i-=1)
    {
        freq_string[i]=xxx%10+48;
        xxx/=10;
    }
    freq_string[0]=xxx+48;
    napis_lcd(freq_string);
}
Po wydaniu polecenia
Kod:
wys_freq(frequency);
Powinna się wyświetlić wartość zmiennej frequency na LCD.
Teraz wyjaśnię jak działa funkcja wys_freq(jakaś_zmienna) :
1. deklarujemy tablicę 10 elementową (numerujemu od zera) o nazwie freq_string typu char oraz zmienną i tego samego typu
2. ostatniemu elementowi tablicy przypisujemy 0 - będzie ono znacznikiem końca tablicy
3. pętla for ... tu trzeba poświęcić trochę miejsca na wyjaśnienie
İmage
for(i=8; i>0; i-=1) oznacza : na początku i=8 ... wykonuj pętlę jeśli i>0 ... za każdym razem zmniejsz i o jeden.
Pętla for za każdym razem wykona instrukcje pomiędzy nawiasami klamrowymi, czyli :
i-ty element tablicy freq_stringbędzie równy reszcie z dzielenia zmiennej xxx (która dostała wartość zmiennej frequency czyli 3710000) ... wiadomo, że reszta z dzielenia liczby 3710000 przez 10 to zero ... nie możemy dosłownie wpisać 0 - musimy wpisać kod ASCII który odpowiada liczbie zero dlatego dodajemy 48.
Drugi wiersz pomiędzy nawiasami pętli for dzieli zmienną xxx przez 10 - w następnej "turze" pętli xxx będzie 10 razy mniejsza.
Pętla sprawdza czy i nadal jest większe od 0, jeśli tak to wykonują sie znowu polecenia zawarte pomiędzy nawiasami klamrowymi.

Teraz na przykładzie ... zmienna frequency = 3710000 ...
1. na początku 8 element tablicy freq_string przyjmuje wartość 0 bo reszta z dzielenia 3710000 przez 10 równa się 0
2. 7 element tablicy przyjmuje wartość 0 bo reszta z dzielenia 371000 przez 10 równa się 0
3. 6 element tablicy przyjmuje wartość 0 bo reszta z dzielenia 37100 przez 10 równa się 0
4. 5 element tablicy przyjmuje wartość 0 bo reszta z dzielenia 3710 przez 10 równa się 0
5. 4 element tablicy przyjmuje wartość 1 bo reszta z dzielenia 371 przez 10 równa się 1
6. 3 element tablicy przyjmuje wartość 7 bo reszta z dzielenia 37 przez 10 równa się 7
7. 2 element tablicy przyjmuje wartość 3 bo reszta z dzielenia 3 przez 10 równa się 3
8. 1 element tablicy przyjmuje wartość 0 bo reszta z dzielenia 0 przez 10 równa się 0
Pozostaje nam jeszcze zerowy element tablicy za który odpowiada linijka kodu:
Kod:
freq_string[0]=xxx+48;
A wyświetlenie częstotliwości ( wszystkich elementów tablicy freq_string ) następuje po wydaniu ostatniego polecenia z funkcji wys_freq(frequency) czyli:
Kod:
napis_lcd(freq_string);
napis_lcd to funkcja z naszej biblioteki obsługi LCD.
Teraz wyjaśniam nowe rzeczy:
% - to znak "modulo" czyli znak dzielenia z resztą ...
Kod:
a=x%y;
dzieli liczbę x przez liczbę y i jako wynik podaje resztę z tego dzielenia - czyli wynik przypisuje zmiennej a. przykłady:
20%10 = 0
22%10 = 2
10%3 = 1
25%7 = 4
Wyedytujcie sobie plik nowy.c z lekcji 9 tak aby jego zawartość wyglądała tak:
Kod:
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include "lcd_alfanum.h"

void wys_freq(unsigned long int xxx)
{
    char freq_string[9], i;
    freq_string[9]=0;
    for(i=8; i>0; i-=1)
    {
        freq_string[i]=xxx%10+48;
        xxx/=10;
    }
    freq_string[0]=xxx+48;
    napis_lcd(freq_string);
}

int main(void)
{
    unsigned long int frequency;
    frequency = 3710000;
    init_lcd();
    wys_freq(frequency);
}
Powinno się wyświetlić 3710000_ na wyświetlaczu.
Przeanalizujcie to kilka razy na spokojnie a pewnie zrozumiecie.
(Ten post był ostatnio modyfikowany: 01-02-2012 17:19 przez SP4EJT.)
01-02-2012 16:39
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 01-02-2012 16:39

Skocz do:


Użytkownicy przeglądający ten wątek: 41 gości