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
[
attachment=4644]
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ą ...
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.