logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Assembler AVR 90S8515: Zliczanie jedynek na portach A i B, wynik w BCD na D

skoot 15 Lut 2007 19:48 1352 2
  • #1 3576115
    skoot
    Poziom 11  
    Posty: 33
    Ocena: 1
    Treść zadania:
    Napisać program w assemblerze procesora AVR (model 90S8515), który zlicza łączną liczbę "jedynek" na 8-bitowych portach wejściowych A i B.
    Wynik wyprowadzony jest w kodzie BCD na port wyjściowy D.

    Kodowanie BCD (binary coded decimal) powszechnie stosowane jest w sterowaniu wyświetlaczami 7-segmentowymi. Każda cyfra dziesiętna wyniku
    kodowana jest niezależnie na 4 bitach, np:

    04 dec = 0000 0100 bcd (bo 0 dec = 0000 bin, a 4 dec = 0100 bin)
    13 dec = 0001 0011 bcd (bo 1 dec = 0001 bin, a 3 dec = 0011 bin)


    umie ktos to zrobic ? bede wdzieczny za pomoc

    .include "8515def.inc"
    rjmp start
    
    start:
    clr r10         //czysci rejestr r20 
    sbic portA,0      
    inc r20         
    sbic portA,1
    inc r20
    sbic portA,2
    inc r20
    sbic portA,3
    inc r20
    sbic portA,4
    inc r20
    sbic portA,5
    inc r20
    sbic portA,6
    inc r20
    sbic portA,7
    inc r20
    
    
    sbic portB,0      
    inc r20         
    sbic portB,1
    inc r20
    sbic portB,2
    inc r20
    sbic portB,3
    inc r20
    sbic portB,4
    inc r20
    sbic portB,5
    inc r20
    sbic portB,6
    inc r20
    sbic portB,7
    inc r20
    
             
    clr r10         
    petla:         
    tst r20         
    breq koniec
    lsl r10         
    inc r10         
    dec r20         
    rjmp petla      
    
    koniec:         
    
    out portD, r10
    

    to jest dobrze ??
  • #2 3576643
    sydow
    Poziom 11  
    Posty: 15
    O ile sumowanie bitów rozumiem, to nie za bardzo rozumiem ostatnich linii:

    clr r10
    petla:
    tst r20
    breq koniec
    lsl r10
    inc r10
    dec r20
    rjmp petla

    koniec:

    out portD, r10

    wnioskuję, że linie te mają konwertować DEC na BCD. Myślę że to tak nie będzie działać.

    Proponuje zastosować 2 rejestry służące do zliczania. Jeden do jedności a drugi do dziesiętnych części. A na końcu zamiast konwertować złożyć te dwa liczniki w jedno BCD.

    Nie wiem czy zaprogramowałeś już swojego procka, ja polecam Tobie programator

    http://www.skylive.republika.pl/link_allegro_stk200.html,

    Myślę że jesteś początkujący więc przyda się tobie opis jak co podłączyć i jak skonfigurować , a do tego programatora jest bardzo dobra dokumentacja.
  • #3 3577632
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    skoot napisał:
    ...umie ktos to zrobic ? bede wdzieczny za pomoc ...

    Ta może bez zbędnych ceregieli "podam na tacy" gotowca , a Ty spróbuj zrozumieć jak toto działa :D
    
    .include "8515def.inc"
    .def zero = r0
    .def bcd  = r16
    .org 0x0000
    	rjmp start
    .org INT_VECTORS_SIZE
    start:
    	ldi bcd,low(RAMEND)
    	ldi r17,high(RAMEND)
    	out SPL,bcd
    
    	out SPH,r17
    	ldi bcd,0xFF
    	out DDRD,bcd
    	in r18,PINA
    	in r19,PINB
    	ldi r17,0x10 ;do zliczenia 16-bitów
    	clr bcd
    	clr zero
    lop0:
    	lsr r19
    	ror r18
    	adc bcd,zero
    
    	push bcd
    	andi bcd,0x0F
    ;korekcja ...
    	cpi bcd , 10
    	pop bcd
    	brcs lop2
    	subi	bcd,-6        ;1
    ; ... dziesiętna
    lop2:
    	dec r17
    	brne lop0
    	out PORTD,bcd
    lop3:
    	rjmp start
    

    1)Zastosowałem odejmowanie liczby ujemnej(ekwiwalent dodawania) , ponieważ brakuje AVR-kowi instrukcji dodawania wartości bezpośredniej do pojedynczego rejestru , a szkoda "marnować" kolejny rejestr .
    Piotrek
REKLAMA