HomeMade
Proszę o pomoc przy ATMEGA32 - Wersja do druku

+- HomeMade (http://sp-hm.pl)
+-- Dział: Oprogramowanie (/forum-84.html)
+--- Dział: Technika programowania mikroprocesorów (/forum-85.html)
+--- Wątek: Proszę o pomoc przy ATMEGA32 (/thread-932.html)

Strony: 1 2 3 4


RE: Proszę o pomoc przy ATMEGA32 - SP4EJT - 29-08-2011 22:22

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 ;-)


RE: Proszę o pomoc przy ATMEGA32 - SP3SWJ - 30-08-2011 0:53

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


RE: Proszę o pomoc przy ATMEGA32 - SP4EJT - 31-08-2011 8:49

(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


RE: Proszę o pomoc przy ATMEGA32 - SP4EJT - 07-09-2011 23:48

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.


RE: Proszę o pomoc przy ATMEGA32 - SQ9MDD - 08-09-2011 8:09

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.


RE: Proszę o pomoc przy ATMEGA32 - 3Z6AEF - 08-09-2011 9:10

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


RE: Proszę o pomoc przy ATMEGA32 - SP5FCS - 08-09-2011 12:15

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


RE: Proszę o pomoc przy ATMEGA32 - SP4EJT - 08-09-2011 15:05

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


RE: Proszę o pomoc przy ATMEGA32 - SP3SWJ - 08-09-2011 15:29

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


RE: Proszę o pomoc przy ATMEGA32 - SP4EJT - 08-09-2011 16:00

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