Czy za opomocą instrukcji w Bascomie można dokonać konwersji liczby 2-bajtowej na kod BCD. Chodzi mi o wyświetlenie na wskaźnikach 7-seg LED wartości z przetwornika ADC.
Czy ktoś mógłby podać mi jakieś wskazówki. Dysponuję Bascomem AVR 1.11.7.4 demo.
Pozdrawiam wszystkich
a)Do czego są potrzebne liczby w formacie BCD b)Co to za tajemnicza liczba 2-bajtowa , to jest WORD,INTEGER czy może SINGLE c)Nie napisałeś , jak masz podłączone wyświetlacze do procka.
d)Nie będzie lepiej "pociąć" liczbę na poszczególne cyfry
Dim X As Word , S As String * 5 , S1 As String * 1 , Y(5) As Byte , I As Byte
X = 65535 'przykładowa wartość
S = Str(x) ' zamieniamy na STRING
For I = 1 To 5
S1 = Mid(s , I , 1) 'pobieramy od lewej (najstarszej) cyfry w liczbie
Y(i) = S1 And &H0F ' konwertujemy ASCII na BIN
' Y(i) = Val(s1) 'można i tak , ale to zabiera 100 bajtów pamięci programu :(
Next
Do
Loop
Po powyższej operacji , mamy w tablicy Y poszczególne cyfry w formacie BIN , gotowe do wysłania na dekoder wyświetlacza 7-segmentowego.
Chodzi mi o to aby liczbę zapisaną w dwóch rejestrach 8-bitowych w formacie Hex zapisać w kilku rejestrach (każdą cyfrę w jednym rejestrze) w postaci dzięsiętnej. I tu przepraszam za pomyłkę: nie chodzi o format BCD. Dalej mam procedurę która pobiera z tych rejestrów sekwencyjnie kolejne liczby i podaje na wyświetlacz sterując go poprzez UL2003. Chyba że jest prostrze rozwiązanie???.
do działu 'converting numbers'. Podają tam co prawda receptę na konwersję do ASCII, ale od zwykłej numerycznej różni się ona tylko dodaniem 0x30 na końcu (aby wartość odpowiadała kodowi znaku w tablicy ASCII), więc ten krok pomijasz. Na stronie jest wszystko przystępnie wyjaśnione i poparte algorytmami.
Chodzi mi o to aby liczbę zapisaną w dwóch rejestrach 8-bitowych w formacie Hex zapisać w kilku rejestrach (każdą cyfrę w jednym rejestrze) w postaci dzięsiętnej. I tu przepraszam za pomyłkę: nie chodzi o format BCD. Dalej mam procedurę która pobiera z tych rejestrów sekwencyjnie kolejne liczby i podaje na wyświetlacz sterując go poprzez UL2003. Chyba że jest prostrze rozwiązanie???.
Dlaczego jesteś taki oszczędny w słowach Czy musisz wysterować programowo wszystkie końcówki segmentów wyswietlacza Czy masz sterowanie multipleksowe Ile masz tych wyświetlaczy Bez tych danych , nie potrafie dalej Ci pomóc
Chodziło mi głównie o jakiś algorytm na konwersję np w assemblerze. A mój układ to 4-wyświetlacze, sterowanie multipleksowe poszczególnych wyświetlaczy i oczywiscie sterowanie wszystkimi segmentami
Chodziło mi głównie o jakiś algorytm na konwersję np w assemblerze. A mój układ to 4-wyświetlacze, sterowanie multipleksowe poszczególnych wyświetlaczy i oczywiscie sterowanie wszystkimi segmentami
No to może to : zamiana WORD na max 5 cyferek (wiecej nie trzeba)
word2cyfry:
;tablica=adres początku tablicy , składajacej sie z 5 kolejnych komórek w RAM
;R16=LSB WORD
;R17=MSB WORD
rcall clrtab
ldi r18,0x10
loop0:
lsl r16
rol r17
rcall tabindex0
ldi r21,0xf6
ldi r20,0x05
loop1:
ld r19,X
rol r19 ;lub addc r19,r19 - wsio ryba :)
push r19
add r19,r21
pop r19
brcc loop2
subi r19,0x0a
sec
loop2:
st X+,r19
dec r20
brne loop1
dec r18
brne loop0
ret
;wpisz adres poczatku tablicy do X
tabindex0:
ldi r26,low(tablica)
ldi r27,high(tablica)
ret
;wyzeruj tablice
clrtab:
rcall tabindex0
ldi r20,0x05
clr r21
loop3:
st X+,r21
dec r20
brne loop3
ret
Piotrek, to jest to o co mi chodziło. Już zabieram się do testowania tego kodu. Przyznam szczerze że sam zacząłem tworzyć tego typu procedurę ale ze względu na to że jest to początek mojej przygody z AVR-ami szło mi to raczej ciężko. Procedura ta potrzebna mi była do wstawiania w ramy różnych programików korzystających z wyświetlaczy LED.
Może wiesz gdzie można znaleźć jakieś inne procedury pisane w asm na AVR-y. Mógłbym się z tego wiele nauczyć, a należę do ludzi dociekliwych.
Serdeczne dzięki, pozdrawiam
Witam.
Jak napisać konwersję z BCD 10 cyfr na LONG w hexie?
Z hexa LONG nie ma problemu, dałem sobie radę - testowanie zostaje jakie było a podprogram wygląda następująco:
Quote:
long2bcd:
;tablica=adres początku tablicy , składającej sie z 5 kolejnych komórek w RAM
;R16=LSB WORD
;R17=MSB WORD
;R18
;R19
rcall clrtab
ldi r22,32
loop0:
lsl r16
rol r17
rol r18
rol r19
rcall tabindex0
ldi r21,0xf6
ldi r20,10 ;0x05
loop1:
ld r23,X
rol r23
push r23
add r23,r21
pop r23
brcc loop2
subi r23,0x0a
sec
loop2:
st X+,r23
dec r20
brne loop1
dec r22
brne loop0
ret
;wpisz adres poczatku tablicy do X
tabindex0:
ldi r26,low(tablica)
ldi r27,high(tablica)
ret
;wyzeruj tablice
clrtab:
rcall tabindex0
ldi r20,10 ;5
clr r21
loop3:
st X+,r21
dec r20
brne loop3
ret
Jeśli ma ktoś procedurkę z BCD na LONG byłbym wdzięczny.
Podłączę się do tematu. Jak dobrze pamiętam procesory AVR nie posiadają trybu BCD tak jak Z80, 6502, 6800, 68k czy 8051 (w ograniczonym zakresie). Nie jest to bardzo istotne bo piszę w C a ten nie ma standardowo operacji na liczbach bcd. Zmuszony jestem pracować w tym formacie (łatwo wyświetlić liczny nawet 64 bit w postaci dziesiętnej). Nie znalazłem gotowej biblioteki poza konwersję BIN<->BCD, która jest banalnie prosta. Zrobiłem już funkcję ADD dla liczb 4, 8, 16, 32 i 64-bit (ta jest mi najbardziej potrzebna). Może któryś z Forumowiczów spotkał się z biblioteką realizującą funkcje mnożenia i dzielenia? Nie są to operacje bardzo skomplikowane ale napisanie ich zajmuje trochę czasu, którego jak zawsze brak.
Zapoznam sie z materiałami, a zakres liczb od ułamków groszy to setek milionów złotych. Są to operacje finansowe, więc liczby zmiennoprzecinkowe odpadają.
Dlaczego? Skoro działało to na I386 (przesadnie duży) program w Pascalu, to dlaczego AVR ma nie dać rady?
Bo operacje finansowe robi się komputerach, a nie uC z bardzo ograniczonymi zasobami. Ciekawe po Ci ADC np do finansów (może to pomiaru stresu obługującego )
Pytanie raczej świadczy o zerowej znajomości tematu.
Dlaczego? Skoro działało to na I386 (przesadnie duży) program w Pascalu, to dlaczego AVR ma nie dać rady?
Bo operacje finansowe robi się komputerach, a nie uC z bardzo ograniczonymi zasobami. Ciekawe po Ci ADC np do finansów (może to pomiaru stresu obługującego )
Zły przykład. A po co Ci karta dźwiękowa w komputerze do finansów? Po co dwie karty graniczne, że o interfejsie do ekranu dotykowego nie wspomnę. Takie wyposażenie mają urządzenia z (prawie) nieograniczonymi zasobami (PC, komputery jedno płytkowe/przemysłowe).
Piotrus_999 wrote:
Pytanie raczej świadczy o zerowej znajomości tematu.
Fakt, zerowej, pytanie kto ma tą zerową znajomość?
Kilka tysięcy urządzeń trzeba wyposażyć w system licznie takiego a nie innego zakresu liczb. Jest to wymysł US. US wymaga co prawda dokładności 0,01zł ale można upiec dwie pieczenie na jednym ogniu ale zakres liczb się zwiększa (co najmniej 0,0001zł). Co jest bardziej opłacalne, opracować projekt za kilka tysięcy na sprzęt po ponad 1000zł za sztukę (zwykły PC nie zmieści się w obudowie) czy opracować projekt za 10'00zł na sprzęt po 100zł za sztukę? No i PC pobierze tyle prądu co całe nadzorowane urządzenie a często i więcej. Ponadto urządzenie może wystartować w 2..3 sekundy, a ile będzie startować komp, nawet z DOS czy komputer jedno płytkowy?
Zapomniałem napisać, że trzeba obsłużyć magistrale 1-Wire z opcją wyszukiwania urządzeń. Do PC trzeba więc dołożyć procek lub układ specjalizowany. Do AVR-ka nie będę nic dokładał bo obsłużę magistralę 1-Wire, bez zawieszania IRQ.
Czy naprawdę do migania LED-em wymagany jest procek 2GHz, 1GB RAM, dysk 4GB i system operacyjny? Startuje to "cudo" "tylko" 2 minuty, pobiera "tylko" 200W?
a ile będzie startować komp, nawet z DOS czy komputer jedno płytkowy?
20-30s, z pełną obsługą sieci. Prądu zużyje kilka razy więcej. Ale w cenie się zmieści.
Policzmy:
Urządzenie startuje nawet w 2..3 sekundy.
Jednopłytkowiec 20..30.
W najlepszym przypadku mamy rezerwę czasową równą 20sek - 3 sek równa się -17sek. Trzeba by zaimplementować podróże w czasie, niestety nie posiadam stosownych algorytmów.
Zapomniałem dodać, że muszę jeszcze zliczać sygnały z ośmiu wejść w czasie rzeczywistym (przyjmuje się, że 1000/sek).
Zapomniałem dodać, że muszę jeszcze zliczać sygnały z ośmiu wejść w czasie rzeczywistym (przyjmuje się, że 1000/sek).
A jakie doświadczenie z uC posiadasz Kolego? Po postach sądząc niezbyt wielkie, a coraz większe fantazje. Jakie języki programowania znasz?
Bo na razie wartości jakie mogą przyjmować liczby 64 i 128 bitowe nie są Ci znane
Zaprojektowane urządzenia oparte o procesory:
6502
Z80
MC68k
Mikrokontrolery:
AVR
MCS51
PIC
Z8
Piotrus_999 wrote:
a coraz większe fantazje. Jakie języki programowania znasz?
Bo na razie wartości jakie mogą przyjmować liczby 64 i 128 bitowe nie są Ci znane
Jakie fantazje? Liczenie impulsów z ośmiu wejść z max 1kHz to fantazja?
Obsługa 1-Wire bez zawieszania IRQ niemożliwe?
DLA AVR możliwe bo jeszcze obsługuję w tym czasie ethernet.
Urządzenia działają od 5 lat tyle, że obsługują liczby unsigned long co daje max 42 949 672,96zł (często jest to już za mało) a potrzeba dokładności co najmniej 0,01gr, co przy long da 429 496,7296zł. Z 128 bit przesadziłem, ale 64 bit jest koniecznością.