Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Konwersja liczb w AVR. Liczba 2-bajtowa na kod BCD.

Stankow 27 Feb 2005 11:15 7145 77
Computer Controls
  • #1
    Stankow
    Level 13  
    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
  • Computer Controls
  • #2
    zumek
    Level 39  
    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 :?:

    Przykład dla zmiennej typu WORD
    
    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.

    Piotrek
  • #3
    Stankow
    Level 13  
    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???.
  • Computer Controls
  • #4
    sepher
    Level 19  
    Zajrzyj na stronę:

    http://www.avrbeginners.net/

    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.
  • #5
    zumek
    Level 39  
    Stankow wrote:
    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 :wink: 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 :(
  • #6
    Stankow
    Level 13  
    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
  • #7
    zumek
    Level 39  
    Stankow wrote:
    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
    
    

    a tak można potestować :wink:
    
    .dseg
    tablica: .byte 5
    .cseg
    .org 0
    	rjmp	main
    main:
    	ldi	r16,0xdf
    	out	$3d,r16
    	ldi	r16,0xff ;LSB
    	ldi r17,0xff ;MSB
    	rcall word2cyfry
    	rjmp main
    


    Kompilator - avrasm , środowisko - AvrStudio v3.56
    Łatwo przystosować dla INTEGER - liczba ze znakiem lub rozszerzyć np. do LOONG :)

    Piotrek
  • #8
    Stankow
    Level 13  
    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
  • #9
    mikey33
    Level 11  
    Ja mam pytanie odnosnie tego algorytmu,

    push r19
    add r19,r21
    pop r19
    widze ze potem chodzi o sprawdzenie flagi C
    ale czemu w r21 jest F6 ?

    i czemu subi r19,0x0a?

    Mialby ktoś może algorytm tej procedury w postaci schematu blokowego?

    Dzieki z góry za pomoc.
  • #10
    mikey33
    Level 11  
    No panowie, napewno ktos moze mi pomoc w zrozumieniu tej procedury
  • #11
    User removed account
    User removed account  
  • #12
    User removed account
    User removed account  
  • #13
    User removed account
    User removed account  
  • #14
    User removed account
    User removed account  
  • #15
    User removed account
    User removed account  
  • #16
    User removed account
    User removed account  
  • #17
    User removed account
    User removed account  
  • #18
    User removed account
    User removed account  
  • #19
    User removed account
    User removed account  
  • #20
    User removed account
    User removed account  
  • #21
    User removed account
    User removed account  
  • #22
    tronics
    Level 38  
    Quote:
    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.
  • #23
    User removed account
    User removed account  
  • #24
    User removed account
    User removed account  
  • #25
    tronics
    Level 38  
    @Piotrus - wystarczy zerknąć w linki kolegi żeby wiedzieć jak daleko jesteś od prawdy.
  • #26
    User removed account
    User removed account  
  • #27
    User removed account
    User removed account  
  • #28
    User removed account
    User removed account  
  • #29
    User removed account
    User removed account  
  • #30
    User removed account
    User removed account