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: #71
RE: Programowanie w języku C w środowisku AVR Studio4
(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 ??
(Ten post był ostatnio modyfikowany: 27-01-2012 20:40 przez SP4EJT.)
27-01-2012 19:42
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9JXB Offline
Początkujący
**

Liczba postów: 64
Dołączył: 22-03-2010
Post: #72
RE: Programowanie w języku C w środowisku AVR Studio4
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

Janek SQ9JXB
27-01-2012 20:15
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #73
RE: Programowanie w języku C w środowisku AVR Studio4
(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
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5IWI Offline
Janek
*

Liczba postów: 32
Dołączył: 01-02-2009
Post: #74
RE: Programowanie w języku C w środowisku AVR Studio4
(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
28-01-2012 0:39
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9JXB Offline
Początkujący
**

Liczba postów: 64
Dołączył: 22-03-2010
Post: #75
RE: Programowanie w języku C w środowisku AVR Studio4
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.

Janek SQ9JXB
(Ten post był ostatnio modyfikowany: 28-01-2012 7:54 przez SQ9JXB.)
28-01-2012 7:54
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
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
SQ9JXB Offline
Początkujący
**

Liczba postów: 64
Dołączył: 22-03-2010
Post: #77
RE: Programowanie w języku C w środowisku AVR Studio4
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...
"

Janek SQ9JXB
(Ten post był ostatnio modyfikowany: 01-02-2012 18:01 przez SQ9JXB.)
01-02-2012 18:01
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5IWI Offline
Janek
*

Liczba postów: 32
Dołączył: 01-02-2009
Post: #78
RE: Programowanie w języku C w środowisku AVR Studio4
[/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
01-02-2012 18:47
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #79
RE: Programowanie w języku C w środowisku AVR Studio4
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
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ8MHI Offline
 
*

Liczba postów: 39
Dołączył: 15-09-2010
Post: #80
RE: Programowanie w języku C w środowisku AVR Studio4
(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.
01-02-2012 21:30
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


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