Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Proszę o pomoc przy ATMEGA32
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #21
RE: Proszę o pomoc przy ATMEGA32
Panowie... SUKCES !!!
Napisałem szybko to co wklejam poniżej
Wiem wiem ... nie fachowo ale działa mi wyswietlacz i zamierzam napisać programik który obsługuje kursor lewo prawo (moze jeszcze góra dół) oraz wpisywanie cyfr napoczątek.
Zachęcam do nauki programowania tych co się nie moga zdecydować albo boją się. Jestem totalnym laikiem i fajnie byłoby jakby ktos równoczeście ze mną zaczynał. Będziemy sie wspierać.
SP3SWJ, dzięki za pomoc ale nie będę próbował uruchomić tego programu bo mi na nim nie zależało, zależało mi własnie na obsłudze wyświetlacza LCD 2*16, którą chciałem z niego skopiować, a przede wszystkim zrozumieniu mechanizmu działania LCD. Ale się podjarałem ;-) mam zajęcie na kilka nastepnych dni - oby tylko czasu wolnego starczyło. Ide juz pisać procedurki.


Kod:
#include <avr/io.h>
#include <util/delay.h>

//delay 1s
void delay1s(void)
{
    uint8_t i;
    for(i=0;i<100;i++)
    {
        _delay_ms(160);
    }
}


int main(void)
{
DDRA = 0b11111111;  
DDRB  = 0b00000011;
PORTB = 0b00000011;

  delay1s();
PORTA = 0b00001111;
_delay_ms(200);
PORTB = 0b00000001;   //E=1
_delay_ms(2);
PORTB = 0b00000000;   //E=0
_delay_ms(200);
PORTA = 0b00000000;
_delay_ms(20);
PORTB = 0b00000010;   //RS=1
_delay_ms(20);
PORTA = 0b01011000;   // znak X
_delay_ms(20);
PORTB = 0b00000011;    //E=1 RS=1
_delay_ms(20);
PORTB = 0b00000010;    //E=1  RS=0
_delay_ms(20);
PORTA = 0b01100110;
_delay_ms(20);
PORTB = 0b00000011;    //E=1 RS=1
_delay_ms(20);
PORTB = 0b00000010;    //E=1  RS=0
_delay_ms(20);
}

ps. kurde, jak ten kod się wstawia ? bo zapomniałem
aha , czasy opóźnień wyssanee z palca ;-)
(Ten post był ostatnio modyfikowany: 29-08-2011 22:28 przez SP4EJT.)
29-08-2011 22:22
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP3SWJ Offline
Jarek
****

Liczba postów: 653
Dołączył: 20-03-2010
Post: #22
RE: Proszę o pomoc przy ATMEGA32
Program który ci wkleiłem jest jednym z kodów z PRZYKŁADÓW do PCB dostarczanych przez producenta - potwierdza to to co pisałem że kody są przygotowane dokładnie pod to PCB i muszą działać

Kod:
'Program przygotowany dla zestawu EvB ATmega16-32 firmy microSENSE.pl

PORADA: naprawdę warto poświęcić trochę czasu by przejrzeć instrukcję oraz źródła każdego przykładu - wgrać je... trochę pokombinować pomodyfikować. Uwierz że z przykładów jestes w stanie nie tylko nauczyć się jak co dział - ale także jak pisac program by był zrozumiały, Dodawaj komentarze - wyrób sobie to jako nawyk.

Powodzenia... widze że jakoś ci to poszło... to .... do ataku...
30-08-2011 0:53
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #23
RE: Proszę o pomoc przy ATMEGA32
(28-08-2011 15:08)ramsterdam napisał(a):  U mnie problem natomiast pojawia się prawdopodobnie w programie, niesprawnym wyświetlaczu lub w uszkodzonym AVR'ku gdyż na ekranie wyświetlają mi się tylko same czarne "kwadraciki" Big Grin
Jeśli nadal nie możesz uruchomić, to ja w zamian za naprowadzenie mnie na cel przez użytkowników forum, czuję się zobowiązany pomóc Tongue
Bo już, że tak powiem, LCD mam obcykane, hiehie
(Ten post był ostatnio modyfikowany: 31-08-2011 8:49 przez SP4EJT.)
31-08-2011 8:49
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #24
RE: Proszę o pomoc przy ATMEGA32
Nie będę zakładał nowego wątku ...
Teraz potrzebuje pomocy w wyłapaniu cyfr z poszczególnych rzędów wielkości danej liczby. Na wszelki wypadek podam przykład.
Mam liczbę 456780, jakiej użyć funkcji/procedury aby otrzymać np. cyfrę określającą ilość setek (czyli 7 w tym przypadku) ???
mowa o języku C.
07-09-2011 23:48
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 380
Dołączył: 01-02-2009
Post: #25
RE: Proszę o pomoc przy ATMEGA32
Patrz > Modulo

W bascomie to robiłem na potrzeby multipleksacji wyniku na wyświetlaczu led.
W C będzie zapewnie podobnie, łatwo to przepiszesz znając język.

Kod:
Wyswietl:
Portd = &B0000000
  If A = 4 Then
   Liczba = Wartosc \ 10000
   Portd = &B0010000
   Portb = Lookup(liczba , Tabela)
Elseif A = 3 Then
   Liczba = Wartosc Mod 10000
   Liczba = Liczba \ 1000
   Portd = &B0001000
   Portb = Lookup(liczba , Tabela)
Elseif A = 2 Then
   Liczba = Wartosc Mod 1000
   Liczba = Liczba \ 100
   Portd = &B0000100
   Portb = Lookup(liczba , Tabela)
Elseif A = 1 Then
   Liczba = Wartosc Mod 100
   Liczba = Liczba \ 10
   Portd = &B0000010
   Portb = Lookup(liczba , Tabela)
   Portb.0 = 0
Elseif A = 0 Then
   Liczba = Wartosc Mod 10
   Portd = &B0000001
   Portb = Lookup(liczba , Tabela)
End If
Incr A
If A = 5 Then
   A = 0
End If
Return

Tabela:
Data 129 , 235 , 37 , 41 , 75 , 25 , 81 , 171 , 1 , 11

Jest jeszcze inna metoda ale mniej elegancka.

...przede wszystkim nie zakłócać...
08-09-2011 8:09
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
3Z6AEF Offline
Waldek
***

Liczba postów: 237
Dołączył: 27-06-2009
Post: #26
RE: Proszę o pomoc przy ATMEGA32
(07-09-2011 23:48)sp4ejt napisał(a):  [...]Mam liczbę 456780, jakiej użyć funkcji/procedury aby otrzymać np. cyfrę określającą ilość setek (czyli 7 w tym przypadku) ??? mowa o języku C.[...]
Odpowiednikami operandów '\' i 'Mod' z BASCOM-a są w języku C operandy '/' (dzielenie całkowitoliczbowe) i '%' (reszta z dzielenia).
Używając ich po kolei z czynnikiem 10 można 'wydzielić' kolejne cyfry (najprościej kolejno, można zastosować pętlę, a 'twardziele' używają rekursji Wink ).
Inna metoda, ale to w systemach, gdzie jest biblioteka z funkcją sprintf(), można to też zrobić tak:
Kod:
char tab[6];
unsigned long moja_liczba = 456780;
unsigned char cyfra_setek;

sprintf(tab, "%06d", moja_liczba);
cyfra_setek = tab[3] - '0';

Aha, zamiast sprintf() można też użyć funkcji itoa() (integer to ascii) - na pewno mniej 'waży'...
(Ten post był ostatnio modyfikowany: 08-09-2011 9:16 przez 3Z6AEF.)
08-09-2011 9:10
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5FCS Offline
Adam
*****

Liczba postów: 1,072
Dołączył: 02-02-2009
Post: #27
RE: Proszę o pomoc przy ATMEGA32
Marcin, Koledzy podali Ci kilka sposobów rozwiązania problemu. "Gotowiec" w C znajdziesz w książce którą posiadasz, w opisie funkcji obsługi LCD, jak już kupiłeś to korzystaj.
Powyższe metody mają dwie wady: generują duży kod (gotowe funkcje języka C) oraz pochłaniają dużo czasu procesora (wielokrotne dzielenie w pętli dużych liczb, procesory AVR nie mają instrukcji dzielenia).

Ja preferuję technikę odejmowania w pętli kolejnych wag w systemie dziesiętnym: 100.000, 10.000, 1.000, 100, 10, reszta.
Ta metoda jest najszybsza ponieważ funkcje odejmowania nawet na bardzo dużych liczbach są krótkie i szybkie (sprzętowe instrukcje odejmowania).

73 Adam
08-09-2011 12:15
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #28
RE: Proszę o pomoc przy ATMEGA32
masz na myśli coś takiego ? :
Kod:
unsigded char n;
unsigned long int freq, fff;     //freq = częstotliwość :) robię sterownik DDS AD9951
n=0;
fff=freq;
for(fff >= 100000000)  //nie jestem pewny czy ten zapis jest sensowny dla kompilatora
{fff = fff-100000000;
  n+=1;
}
m100(n);        //jakaś procedurka wyświetlająca cyfrę rzędu 100milionów
freq=freq-(n*10000000);  //dla dalszych obliczeń usuwam rząd 100mln
fff=freq;
n=0;
for(fff >= 10000000)
{fff = fff-10000000;
  n+=1;
}
m10(n);      //wyświetla rząd 10mln
freq=freq-(n*1000000);  //dla dalszych obliczeń usuwam rząd 10mln
fff=freq;
n=0;
for(fff >= 1000000)
{fff = fff-1000000;
  n+=1;
}
m1(n);

// itd ......
... no i proszę nie bić i powiedzieć na przyszłość jak ten kod mam tu wkleić żeby było ładnie
(Ten post był ostatnio modyfikowany: 08-09-2011 15:09 przez SP4EJT.)
08-09-2011 15:05
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP3SWJ Offline
Jarek
****

Liczba postów: 653
Dołączył: 20-03-2010
Post: #29
RE: Proszę o pomoc przy ATMEGA32
powiedz może co chcesz policzyć ??? bo zawiłe te obliczenia ...

czy może obliczasz DDS_FTW które ma być wysyłane po SPI do DDS ??

jeśli tak... to są przecież proste wzory i obliczenia na liczbach 32 bitowych w C zrobisz w kilku linijkach... ( podobnie jak w Bascom )


DDS_clock = 400000000 // 400 MHz zegar DDSa
2d32 = 2^32 //(4294967296) stała
F_generowane = 3710000 // Hz
DDS_tick = 2d32 // Stała dla DDSa
DDS_FTW = DDS_TICK * F_generowane

....

i na koniec trzeba zamienić liczbę z "ułamkami" na licznę 32 bitową bez "ułamków" i wysłać do DDSa...

tu masz rozpisany przykład w arkuszu - jedynie ostatnie obliczeni na ciąg bitów jest przepisany z palca - bo funkcje w tym arkuszu - tylko DEC2BIN potrafia na liczbach 8 bitowych liczyć.

Kod:
https://docs.google.com/spreadsheet/ccc?key=0Am6al906NEg2dE5HZndTXzlfUGJ3R2otMkJnY0k3U​Gc&hl=pl#gid=0
jest problem z linkiem coś mi nie działa ... a wklejony dział normlanie
(Ten post był ostatnio modyfikowany: 08-09-2011 15:35 przez SP3SWJ.)
08-09-2011 15:29
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #30
RE: Proszę o pomoc przy ATMEGA32
Jarek, ja chcę się pouczyć i sam główkuję, nie robię tego "żeby tylko szybciej" tylko muszę się na czyms nauczyć myśleć jak procesor Smile Wiadomo że potem i tak spojrzę na gotowce które bedą mniejsze i szybsze - żeby zobaczyć co mogłem zrobić inaczej (dużo szybciej). I pewnie z czasem zainstaluję jakiś super soft. Ale ja mam z tego FUN poprostu i bardzo mnie to wciągnęło. A że do swojego monobandera Home-Made zachciało mi sie AD9951 - to korzystam z okazji. Ja ze swojej dzialalności elektronicznej nie mam przychodów, to tylko hobby.
Wracam do tematu .... wiesz że obliczanie FTW to pryszcz, poczułem sie urażony że tak pomyślałeś Smile żart... już to wszysstko mi działa, bez impulsatora -tylko 4 guziki: krok(+i-) i zmiana f (+i-), tylko dorabiam program obsługujący wyświetlanie Liter i danej częstotliwości.
Do tego potrzebne mi te obliczenia, które zreszta już w nocy zrobiłem... musiałem :-) i działa wszystko tylko program "muli" - widać na oscyloskopie jak rzadko wysyła słowo FTW.(Adam już o tym wspomniał - bo ja dzielenie zastosowałem Tongue ) Dobrą Informację mi Adamie zapodałeś o tym dzieleniu, zastanawiałem sie dlaczego tak wolno liczy, juz wiem Smile Ogólnie to dzięki wszystkim którzy chcą pomóc.
A temat wyświetlania Liczb uważam za zamkniety, mam już pomysł.
08-09-2011 16:00
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


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