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
(27-01-2012 18:01)SQ9JXB napisał(a): [ -> ]Teraz wczytałem nowy.hex i .................nie wyświetla nic.
1. Jaką masz wersję AVR Studio 4 ?
2. Czy korzystałeś z mojego gotowca czy robiłeś według przepisu z posta ?

Sciągnąłem plik który umieściłeś i wgrałem twojego hexa , u mnie też to samo - czyli nie działa. Przy próbie ponownej kompilacji pokazuje błędy.
Wlazłem w menu Project, Configuration Options i wpisałem częstotliwość tektowania atmegi w pole Frequency - pomogło - po kompilacji i wgraniu hexa działa.
Pytanie do wszystkich : Czy mieliście takie same problemy z uruchomieniem tego ??
AVR Studio 4

Korzystałem z gotowca., zmieniłem tylko port na "A"

Teraz wpisałem Frq Atmeg, kompilacja, wgranie hexa i dalej nic.

Wstaw ten katalog spakowany tu na Forum, sprawdzę gdzie mam błąd
(27-01-2012 20:15)SQ9JXB napisał(a): [ -> ]AVR Studio 4
Ja w domu mam 4.17.666 a w pracy 4.19, a jaką ty masz wersję ?
[/quote]
Mówiłes że kompilator nie wyswietla ci błędów. W takim razie wklej tu to co ci wyświetla - bo coś musi.

A przy okazji sprawdź czy nie wystarczy na samym początku pliku nowy.c dopisać
Kod:
#define F_CPU 16000000
(27-01-2012 22:56)SP4EJT napisał(a): [ -> ]
(27-01-2012 20:15)SQ9JXB napisał(a): [ -> ]AVR Studio 4
Ja w domu mam 4.17.666 a w pracy 4.19, a jaką ty masz wersję ?
Mówiłes że kompilator nie wyswietla ci błędów. W takim razie wklej tu to co ci wyświetla - bo coś musi.

A przy okazji sprawdź czy nie wystarczy na samym początku pliku nowy.c dopisać
Kod:
#define F_CPU 16000000
[/quote]

Ja mam 4.19 build 730 skompilowałem wpisałem wcześniej ręcznie częstotliwość kwarcu 16000000 i wgrałem do płytki.U mnie działa czyli kod jest ok
Witam

AVR Studio 4.19 Build 730.

Cytat:rm -rf nowy.o nowy.elf dep/* nowy.hex nowy.eep nowy.lss nowy.map
Build succeeded with 0 Warnings...
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT nowy.o -MF dep/nowy.o.d -c ../nowy.c
../nowy.c:1:0: warning: "F_CPU" redefined
<command-line>:0:0: note: this is the location of the previous definition
avr-gcc -mmcu=atmega32 -Wl,-Map=nowy.map nowy.o -o nowy.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature nowy.elf nowy.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex nowy.elf nowy.eep || exit 0
avr-objdump -h -S nowy.elf > nowy.lss
ECHO jest wyˆĄczone.
AVR Memory Usage
----------------
Device: atmega32

Program: 352 bytes (1.1% Full)
(.text + .data + .bootloader)

Data: 6 bytes (0.3% Full)
(.data + .bss + .noinit)


Build succeeded with 1 Warnings...

Teraz jest OK.

Zabrakło jednego "0" (zera) w częstotliwości kwarcu.

İmage
P.S. Przepraszam za opóźnianie lekcji.
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ą ...
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.
Cytat:Powinno się wyświetlić 3710000_ na wyświetlaczu.

A nie czasami 003710000?

Bo tak się u mnie wyświetla.

I wyświetla mi po kompilacji 3 Warnings

"Build started 1.2.2012 at 16:53:54
avr-gcc -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT nowy.o -MF dep/nowy.o.d -c ../nowy.c
../nowy.c:1:0: warning: "F_CPU" redefined
<command-line>:0:0: note: this is the location of the previous definition

../nowy.c: In function 'wys_freq':
../nowy.c:12:9: warning: array subscript has type 'char'
../nowy.c:9:16: warning: array subscript is above array bounds
avr-gcc -mmcu=atmega32 -Wl,-Map=nowy.map nowy.o -o nowy.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature nowy.elf nowy.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex nowy.elf nowy.eep || exit 0
avr-objdump -h -S nowy.elf > nowy.lss
ECHO jest wyˆĄczone.
AVR Memory Usage
----------------
Device: atmega32

Program: 532 bytes (1.6% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)


Build succeeded with 3 Warnings...
"
[/code]Powinno się wyświetlić 3710000_ na wyświetlaczu

"U mnie 003710000_"

Przy dwóch "warningach "

../nowy10.c:12:9: warning: array subscript has type 'char'
../nowy10.c:9:16: warning: array subscript is above array bounds

Janek SP5IWI
no tak, 003710000 Tongue pisałem na szybkiego. Jeszcze nasz program nie jest dopracowany i wyswietla te dwa zera na początku, będę ajmował sie tym jakos na końcu bo to nie istotne. Poprostu wyświetla zawsze 9 cyfr. A co do tych WARNINGÓW to sam nie wiem czemu komplilator sie mnie czepia Smile
(01-02-2012 18:55)SP4EJT napisał(a): [ -> ]A co do tych WARNINGÓW to sam nie wiem czemu komplilator sie mnie czepia Smile
No ale "../nowy.c:9:16: warning: array subscript is above array bounds" to jest bardzo poważny warning. Ja myślę, że on jest po to, żeby kursantom pokazać, jak w C łatwo i prosto zrobić sobie kuku, jak się nie uważa z rozmiarami tablic. Kto zgadnie dlaczego? Wskazówka: deklaracja tablicy.
Stron: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Przekierowanie