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 - 27-01-2012 19:42

(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 ??


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ9JXB - 27-01-2012 20:15

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


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 27-01-2012 22:56

(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



RE: Programowanie w języku C w środowisku AVR Studio4 - SP5IWI - 28-01-2012 0:39

(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


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ9JXB - 28-01-2012 7:54

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.


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

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.


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ9JXB - 01-02-2012 18:01

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...
"


RE: Programowanie w języku C w środowisku AVR Studio4 - SP5IWI - 01-02-2012 18:47

[/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


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 01-02-2012 18:55

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


RE: Programowanie w języku C w środowisku AVR Studio4 - SQ8MHI - 01-02-2012 21:30

(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.