Rozdzielenie liczby dziesiętnej dwucyfrowej.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Pev4
-
Posty: 44
Rejestracja: 06 sie 2007, 19:26
Lokalizacja: Ostrowiec Św.
Kontakt:

Rozdzielenie liczby dziesiętnej dwucyfrowej.

Post autor: Pev4 » 15 cze 2009, 19:51

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.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 15 cze 2009, 20:02

Dzielisz bez reszty przez 10 i masz liczbe dziesiatek.
Potem od oryginalnej liczby odejmujesz 10*liczba_dziesiatek i zostaja Ci jednosci...
Zamiast tego drugiego kroku mozna zastosowac dzielenie modulo 10.
Jezeli o to Ci chodzilo...

Pev4
-
Posty: 44
Rejestracja: 06 sie 2007, 19:26
Lokalizacja: Ostrowiec Św.
Kontakt:

Post autor: Pev4 » 15 cze 2009, 20:45

Dzięki za super podpowiedź! zaraz tak spróbuję:)
Przy dzieleniu bez reszty wystarczy że umieszczę wynik w zmiennej byte, a wtedy reszta zostanie obcięta?

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 15 cze 2009, 21:38

Nie uzywam Bscoma, ale tak powinno byc.

aktus
Użytkownik
Posty: 379
Rejestracja: 06 sie 2007, 20:44
Lokalizacja: Tychy

Post autor: aktus » 16 cze 2009, 9:56

Przy dzieleniu bez reszty reszta będzie obcięta. 4 / 2 = 2 i 5 / 2 = 2. Ogólnie A / B = C R = A - (B * C). Odnosząc się do twojego przykładu będzie to 54 / 10 = 5. 54 - (10 * 5 ) = 4. dokładnie tak samo robi się z tysiącami, setkami tysięcy itd.

Pev4
-
Posty: 44
Rejestracja: 06 sie 2007, 19:26
Lokalizacja: Ostrowiec Św.
Kontakt:

Post autor: Pev4 » 16 cze 2009, 17:59

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:

Kod: Zaznacz cały

Config Pinc.0 = Input
Enable Interrupts
Enable PCINT0
On PCINT0 Przerwanie
PCMSK1 = &B00000001
Do
Loop
End
przerwanie:
...
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.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 16 cze 2009, 23:15

Pev4 pisze:W jednym układzie jest tylko fotodioda w drugim tylko fototranzystor
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.
Poza tym ani jedno ani drugie nie wystarczy, bo potrzebny bedzie wzmacniacz i filtr. Wstaw lepiej gotowy odbiornik, np. SFH5110, TSOP1736, etc.
Pev4 pisze:Jaki interfejs w takim czymś proponujecie?
Proponuje RC5 co najmniej z 4 powodow
- 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.

Pev4
-
Posty: 44
Rejestracja: 06 sie 2007, 19:26
Lokalizacja: Ostrowiec Św.
Kontakt:

Post autor: Pev4 » 18 cze 2009, 21:23

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.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 18 cze 2009, 21:54

Pev4 pisze:Na jednych ukontrolerach chodzi poprawnie, na innych nie - mimo identycznej konfiguracji zarówno zewnętrznej, jak i fusebit.
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.

[ Dodano: 2009-06-18, 22:55 ]
Pev4 pisze:trwa 10s
Nie dziesiec tylko 8 :D (no chyba, ze masz wyjatkowo niedokladny zegar RC)

Pev4
-
Posty: 44
Rejestracja: 06 sie 2007, 19:26
Lokalizacja: Ostrowiec Św.
Kontakt:

Post autor: Pev4 » 18 cze 2009, 22:12

Na prawdę dziękuję, nie wiem co bym bez Was zrobił :smile:
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 :wink: )
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
Return
Procesor nie budzi się z Idle - nie przechodzi do podprogramu Przerwanie:
Czy koledzy widzą gdzieś błąd?

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 19 cze 2009, 14:29

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.

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

Kod: Zaznacz cały

 'przerwanie
stan=0
 '1 to praca, a 0 to stan wstrzymania 
Return 

Pev4
-
Posty: 44
Rejestracja: 06 sie 2007, 19:26
Lokalizacja: Ostrowiec Św.
Kontakt:

Post autor: Pev4 » 20 cze 2009, 0:23

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.

ODPOWIEDZ