Skocz do zawartości

[BASCOM - ATMEGA32] Dolaczenie danych do programu.


jacekk

Pomocna odpowiedź

Witam

Chciałbym dołączyć do programu napisanego w BASCOMIE tablice danych wczytaną z pliku ok 1024 bajty. Nie bardzo wiem jak się do tego zabrać, tj jakich funkcji użyć. (ps żona mi czyta przez ramię i mówi że to proste, trzeba kliknąć spinaczyk 😃 )

Link do komentarza
Share on other sites

To trochę dużo danych na tak mały procesor i jego RAM. Jeżeli to są jakieś stałe i nie będziesz ich modyfikował (albo bardzo rzadko), to umieść to w EEPROMie - rzadko jest wykorzystywany cały. Możesz tam wgrać swój plik bezpośrednio programatorem pod znany adres (np. 0) a potem w kodzie zadeklarować tablicę z atrybutem ERAM i odczytywać ją do woli.

Bardziej elegancki sposób na to samo, to konwersja za pomocą jakiegoś programu narzędziowego z pliku binarnego na tekstowy w postaci liczb i włączenie tego tekstu (1024 liczby oddzielone przecinkami) do kodu źródłowego BASCOM w linii DATA. Wtedy Twoje liczby zostaną umieszczone w pamięci FLASH, której mega32 ma pod dostatkiem. Jeżeli instrukcję DATA poprzedzisz dyrektywą $EEPROM, wtedy - podobnie jak w poprzedniej propozycji - dane trafią do EEPROMu. W obu tych przypadkach przynajmniej nic nie dzieje się "poza" kompilatorem i masz wszystkie dane w postaci jawnej w kodzie.

Link do komentarza
Share on other sites

Dzięki za odpowiedź. Dane to znaki 8x8 "skanowane" pionowo - cyferki, literki i różne znaczki do zegarka z wirującą linijką diodową. Co do sugerowanej przez Ciebie bardziej eleganckiej metody, chodzi o LOOKUP i dane umieszczone na końcu programu ? Przyznam że dość ciężko jest mi znaleźć sensowne przykłady. Jak sprawdzić ile wspomniana metoda "zjada" FLASHu tj czy na każdy kb danych idą dodatkowe dane, jakieś wskaźniki ?

Link do komentarza
Share on other sites

Wiesz, nie jestem specjalistą od BASCOMa, ale z tego co widzę metoda Data-Lookup zabiera dokładnie tyle pamięci programu (FLASH) ile danych wstawisz. Nie są potrzebne żadne dodatkowe struktury danych w pamięci, bo przydział adresów następuje statycznie w trakcie kompilacji. Z tego względu użycie etykiety w instrukcji Lookup jest równoważne wskazaniu konkretnej lokacji w pamięci kodu. Do tego (niejawnego wskaźnika) dodawany jest indeks (ew. pomnożony przez długość pojedynczej danej, ale w przypadku bajtów jest to 1) i wykonywany jest odczyt. Wystarczy, że jako indeksu użyjesz wyrażenia:

diodki = Lookup((kod_znaku*8)+numer_kolumny, gen_znakow)

gdzie gen_znaków będzie etykietą odpowiedniej instrukcji data rozpoczynającej zestaw obrazów znaków:

gen_znakow:

data 24, 138, ....

i możesz wartość zmiennej "diodki" wysłać na swoje LEDy.

http://avrhelp.mcselec.com/index.html?lookup.htm

Opisz tę swoją konstrukcję. Jak zrobiłeś synchronizację z obrotem? Jak dopasowujesz prędkość wyświetlania na LEDach do prędkości obrotowej wirnika? Może jakieś zdjęcia?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jeszcze nic nie gotowe wiec nie wiele mam do opisania. Na razie działam na dość nieporęcznej płytce demo

399682032_616.jpg

Synchronizację spróbuje zrobić z użyciem czujnika halla i małego magnesika + zewnętrzne przerwanie. Testowałem już wklejanie danych poprzez DATA i LOOKUP, bez problemu w ATMEGA32 wpakowałem 22KB WAVE'a. Zostanie jeszcze problem zegara czasu rzeczywistego ...

__________

Komentarz dodany przez: Sabre

Link do komentarza
Share on other sites

Nie wiem w jakim sensie jest to problem. Precyzyjne zliczanie czasu możesz zrobić kilkoma metodami:

1. Taktujesz swój procesor z kwarcu zamiast z wewnętrznego generatora RC. Wtedy któryś timer puszczasz w trybie CTC i masz dokładną podstawę czasu całego systemu. W obsłudze przerwania robisz programowy prescaler np. z 1000Hz do 1Hz no a potem to już łańcuch liczników sekund, minut, godzin itd.. Na Twojej płytce jest miejsce na Y1 - wstaw tam np. 8.000MHz i po sprawie. Niestety po włączeniu zasilania procesor jest "świeży" i za każdym razem musisz wpisywać aktualny czas ręcznie.

2. Masz też miejsce (Y2) na wlutowanie kwarcu tzw. zegarkowego, czyli 32768Hz. W procesorze jest specjalny, osobny oscylator podłączony tylko do wejścia Timera 2. Raz włączony pracuje niezależnie od całej reszty procesora, tak więc możesz procesor nadal taktować kiepskim generatorem RC a wciąż dysponujesz dokładną częstotliwością. Jeżeli ustawisz prescaler Timera 2 np. na 1/256 a sam timer w trybie CTC z okresem 128, dostaniesz przerwania dokładnie co 1s.

3. Możesz dospawać do płytki zewnętrzny scalak robiący zliczanie czasu i czytać go np. przez szynę I2C, do której sprzętowy interfejs masz w procesorze. Trzeba się trochę napisać kodu do obsługi protokołu komunikacyjnego albo skorzystać z gotowej biblioteki do jakiegoś bardziej typowego RTC. Zewnętrzny zegarek ma tę zaletę, że pobiera 1uA prądu i możesz go napędzać z baterii pastylkowej przez lata a po włączeniu zasilania procesor zawsze odczyta sobie aktualny czas.

4. Możesz wstawić odbiornik czasu radiowego, np. sygnału z niemieckiego nadajnika DCF-77. Takie moduły nie są drogie a dekodowanie impulsów jest proste i najpóźniej w 2 minuty po włączeniu urządzenia (i przy dobrym odbiorze radiowym) będziesz znał atomowy czas europejski. Potem musisz liczyć go już sam, jedną z metod 1 lub 2 a co jakiś czas możesz się synchronizować z Mainflingen 🙂

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.