Rozdzielenie liczby dziesiętnej dwucyfrowej.
Rozdzielenie liczby dziesiętnej dwucyfrowej.
Witam.
Piszę w Bascom-AVR.
Chcę rozdzielić liczbę dziesiętną dwucyfrową na dwie osobne cyfry. Np. mam zmienne A, B i C.
A = 54 'liczba wejściowa
//fragment kodu//
B=5 'dziesiątki
C=4 'jedności
Próbowałem konwertować liczbę na BCD i rozdzielać ośmiobitowy wynik na dwie czterobitowe liczby, ale nie wiem jak to rozdzielić.
W sumie wychodzi na to samo: rozdzielać dziesiętną, czy rodzielać BCD...
Proszę o pomoc - nasunięcie pomysłu, krótkiego i skutecznego bo kombinuję już drugi dzień i nie mogę nic sensownego wymyślić.
Z góry dziękuję, pozdrawiam.
Piszę w Bascom-AVR.
Chcę rozdzielić liczbę dziesiętną dwucyfrową na dwie osobne cyfry. Np. mam zmienne A, B i C.
A = 54 'liczba wejściowa
//fragment kodu//
B=5 'dziesiątki
C=4 'jedności
Próbowałem konwertować liczbę na BCD i rozdzielać ośmiobitowy wynik na dwie czterobitowe liczby, ale nie wiem jak to rozdzielić.
W sumie wychodzi na to samo: rozdzielać dziesiętną, czy rodzielać BCD...
Proszę o pomoc - nasunięcie pomysłu, krótkiego i skutecznego bo kombinuję już drugi dzień i nie mogę nic sensownego wymyślić.
Z góry dziękuję, pozdrawiam.
Wielkie dzięki za pomoc koledzy, już wszystko działa:)
Korzystając z tego tematu (nie chcę zakładać kolejnych) mam jeszcze kilka pytań:
Robię jednostronną komunikację między dwoma układami przez podczerwień.
W jednym układzie jest tylko fotodioda w drugim tylko fototranzystor. Zastanawiam się nad interfejsem. Jeden z układów to zegar z taktowaniem 32,768kHz, więc prędkość przesyłu musi być wolna, ale na tym mi nie zależy. Jaki interfejs w takim czymś proponujecie?
I drugie pytanie. Chcę skorzystać z przerwania PCINT (dokładniej PCINT8) i są z tym pewne problemy ze względu na niezbyt dużą ilość opisów tego zagadnienia.
Moja konfiguracja wygląda tak:
Czy poprawnie?
Przerwania Pin Change Interrupts działają tylko na zmianę stanu, czy można ustawić tryb falling?
I ostatnie pytanie: Jeśli podłączę ADC do AVCC (który jest podłączony do VCC) to mikroprocesor poda napięcie zasilające, czy będzie się coś sypało?
Jeszcze raz dziękuję za pomoc, pozdrawiam.
Korzystając z tego tematu (nie chcę zakładać kolejnych) mam jeszcze kilka pytań:
Robię jednostronną komunikację między dwoma układami przez podczerwień.
W jednym układzie jest tylko fotodioda w drugim tylko fototranzystor. Zastanawiam się nad interfejsem. Jeden z układów to zegar z taktowaniem 32,768kHz, więc prędkość przesyłu musi być wolna, ale na tym mi nie zależy. Jaki interfejs w takim czymś proponujecie?
I drugie pytanie. Chcę skorzystać z przerwania PCINT (dokładniej PCINT8) i są z tym pewne problemy ze względu na niezbyt dużą ilość opisów tego zagadnienia.
Moja konfiguracja wygląda tak:
Kod: Zaznacz cały
Config Pinc.0 = Input
Enable Interrupts
Enable PCINT0
On PCINT0 Przerwanie
PCMSK1 = &B00000001
Do
Loop
End
przerwanie:
...
Przerwania Pin Change Interrupts działają tylko na zmianę stanu, czy można ustawić tryb falling?
I ostatnie pytanie: Jeśli podłączę ADC do AVCC (który jest podłączony do VCC) to mikroprocesor poda napięcie zasilające, czy będzie się coś sypało?
Jeszcze raz dziękuję za pomoc, pozdrawiam.
Jedno i drugie sluzy do odbierania podczerwieni, wiec albo masz cos ni tak ze sprzetem, albo stosujesz nieprecyzyjne slownicwo. Elementem "nadajacym" jest zwykla dioda LED, tyle ze na pasmo podczerwieni.Pev4 pisze:W jednym układzie jest tylko fotodioda w drugim tylko fototranzystor
Poza tym ani jedno ani drugie nie wystarczy, bo potrzebny bedzie wzmacniacz i filtr. Wstaw lepiej gotowy odbiornik, np. SFH5110, TSOP1736, etc.
Proponuje RC5 co najmniej z 4 powodowPev4 pisze:Jaki interfejs w takim czymś proponujecie?
- jest stosunkowo prosty do oprogramowania, Bascom ma gotowwe funkcje do odbioru
- jest dobrze udokumentowany
- kupisz pilota w standardzie RC5, wiec mozesz dokladnie przetestowac uklad odbiorczy zanim zaczniesz oprogramowywac nadajnik (WAZNE! Jak tego nie zrobisz, to w razie problemow stracisz mase czasu na dociekanie co jest winne: nadajnik czy odbiornik?)
- pojedynczy "bit" trwa 888us, czyli przy zekarze 32kHz masz okolo 30CM, jest wiec szansa sie zmiescic.
Poza tym jak bbudujesz zegar na AVR, to podlacz sobie te 32kHz, ale procka taktuj z wewnetrznego oscylatora 1MHz lub wiecej, bedzie prosciej.
Dzięki za precyzyjną odpowiedź:)
Nasunęło mi się kolejne pytanie. W sumie zdarza mi się to po raz kolejny, ale teraz mam szansę zapytać.
Mianowicie taktuję mikrokontroler z wewnętrznego generatora RC na 8MHz.
ponadto mikrokontroler ma podłączony kwarc zegarkowy 32,768kHz.
Procesor jest bardzo wolny. komenda "wait 1" trwa 10s, zegar (config soft) w ogóle nie pracuje. Całość stoi na Mega88V. Na Mega8 w tej samej konfiguracji wszystko działa poprawnie.
Miałem już taką sytuację kilka razy z innymi układami. Na jednych ukontrolerach chodzi poprawnie, na innych nie - mimo identycznej konfiguracji zarówno zewnętrznej, jak i fusebit.
Pozdrawiam.
Nasunęło mi się kolejne pytanie. W sumie zdarza mi się to po raz kolejny, ale teraz mam szansę zapytać.
Mianowicie taktuję mikrokontroler z wewnętrznego generatora RC na 8MHz.
ponadto mikrokontroler ma podłączony kwarc zegarkowy 32,768kHz.
Procesor jest bardzo wolny. komenda "wait 1" trwa 10s, zegar (config soft) w ogóle nie pracuje. Całość stoi na Mega88V. Na Mega8 w tej samej konfiguracji wszystko działa poprawnie.
Miałem już taką sytuację kilka razy z innymi układami. Na jednych ukontrolerach chodzi poprawnie, na innych nie - mimo identycznej konfiguracji zarówno zewnętrznej, jak i fusebit.
Pozdrawiam.
ATmega88 ma domyslnie wlaczone dzielenie zegara przez 8. Mozna to zmienic poprzez fuse bity (nie pamietam ktory, zerknij do dokumentacji procka) albo rejestrem konfiguracyjnym (tez nazwy nie pamietam). Fusami jest najprosciej.Pev4 pisze:Na jednych ukontrolerach chodzi poprawnie, na innych nie - mimo identycznej konfiguracji zarówno zewnętrznej, jak i fusebit.
[ Dodano: 2009-06-18, 22:55 ]
Nie dziesiec tylko 8Pev4 pisze:trwa 10s
Na prawdę dziękuję, nie wiem co bym bez Was zrobił
Fusebit C - divide clock by 8 (0 - enabled, 1 - disabled)
Te 10s tak strzeliłem, a na pewno jest tak jak mówisz. (nie mierzyłem zegarkiem
)
Już jest w porządku.
[ Dodano: 2009-06-19, 13:19 ]
Nadal nie mogę uruchomić przerwania PCINT8
Moja konfiguracja:
Procesor nie budzi się z Idle - nie przechodzi do podprogramu Przerwanie:
Czy koledzy widzą gdzieś błąd?
Fusebit C - divide clock by 8 (0 - enabled, 1 - disabled)
Te 10s tak strzeliłem, a na pewno jest tak jak mówisz. (nie mierzyłem zegarkiem
Już jest w porządku.
[ Dodano: 2009-06-19, 13:19 ]
Nadal nie mogę uruchomić przerwania PCINT8
Moja konfiguracja:
Kod: Zaznacz cały
Enable interrupts 'konfiguracja przerwań
Enable PCINT0
On PCINT0 przerwanie
PCMSK1 = &B00000001
(...)
Przerwanie:
(...)
PCIFR.PCIR1 = 1 'reset flagi przerwania PCINT
Idle
ReturnCzy koledzy widzą gdzieś błąd?
Jeśli założyć, że przerwanie jest poprawnie skonfigurowane, to widze następujący problem:
Gdy procesor zostaje uśpiony, gdy jest jeszcze w pętli przerwania. Więc jak nadchodzi następne wywołanie funkcji przerwania, to dalej jest w tej funkcji.
Instrukcje idle zastąp ustawieniem jakiejś zmiennej, natomiast w pętli głównej programu wstaw instrukcje warunkową, która przełączy procesor do stanu idle. W momencie wywołania przerwania nastąpi wykonanie przerwania, powrót do pętli, wykonanie całego przebiegu pętli, zaistnienie warunku i ponowne uśpienie procka.
Gdy procesor zostaje uśpiony, gdy jest jeszcze w pętli przerwania. Więc jak nadchodzi następne wywołanie funkcji przerwania, to dalej jest w tej funkcji.
Instrukcje idle zastąp ustawieniem jakiejś zmiennej, natomiast w pętli głównej programu wstaw instrukcje warunkową, która przełączy procesor do stanu idle.
Kod: Zaznacz cały
'pętla programu
if stan = 0 then
stan = 1
' jeśli jest spełniony warunek to ustaw odpowiedni stan,
' aby nie był zawsze spełniony
idle
' i przełącz procesor w tryb oszczędzania energii
end if
Kod: Zaznacz cały
'przerwanie
stan=0
'1 to praca, a 0 to stan wstrzymania
Return Dzięki za sugestię.
Niestety to nie rozwiązuje problemu. Coś musi być nie tak z konfiguracją przerwań, ale nie mam pojęcia co jest nie tak. Wzorowałem się na pliku PCINT.bas z pakietu Bascom-AVR oraz na strzępkach informacji z not katalogowych i internetu. Niestety ciężko cokolwiek na ten temat znaleźć. Męczę się już kilka dni i nie mogę wymyślić rozwiązania, a jest mi to bardzo potrzebne, bo urządzenie jest zasilane bateryjnie i pracuje bardzo rzadko.
Niestety to nie rozwiązuje problemu. Coś musi być nie tak z konfiguracją przerwań, ale nie mam pojęcia co jest nie tak. Wzorowałem się na pliku PCINT.bas z pakietu Bascom-AVR oraz na strzępkach informacji z not katalogowych i internetu. Niestety ciężko cokolwiek na ten temat znaleźć. Męczę się już kilka dni i nie mogę wymyślić rozwiązania, a jest mi to bardzo potrzebne, bo urządzenie jest zasilane bateryjnie i pracuje bardzo rzadko.