Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

dsm i 8-bitowy sumator, klawiatura matrycowa, asembler.

11 Gru 2006 20:29 3452 35
  • Poziom 10  
    powitac wszystkich,
    potrzebuje pomocy z projektem na dsm-8051, dokladnie to musze zaprogramowac 8-bitowy sumator(budowa strukturalna, liczby wpisywane z klawiatury matrycowej), a wynik wyswietlany na lcd - i wszystko wg ponizszego schematu:
    dsm i 8-bitowy sumator, klawiatura matrycowa, asembler.

    2 bity na wejsciu i wychodza tez dwa bity czyli razem musi byc 8 takich ukladow jak powyzej

    moze ktos z Was ma pomysl na jakis latwy algorytm, lub ewentualnie dysponuje kodem bramek logicznych w asemblerze, badz sumatora z innymi bramkami logicznymi, mniej lub wiecej bitowego??
  • Poziom 10  
    Przecież w asm, masz funkcję XOR i AND, nie rozumiem w czym problem
  • Poziom 10  
    w tym ze nie moge korzystac z podprogramow epromu - pozatym jestem slaby w asm wiec moglbys podac przyklad ... :)
  • Poziom 10  
    załóżmy że liczba P jest w R0 a liczba B w R1, wynik S w R2, wynik C w R3:

    mov A, R1
    xrl A, R0
    mov R2, A
    mov A, R1
    anl A, R0
    mov R3, A

    każda liczba jest 8-bitowa, bo 8 bitowe są rejestry, XRL i ANL to XOR i AND
  • Poziom 10  
    zrobilem sumator dzialajacy na pojedynczych bitach, teraz potrzebuje pomocy - co dalej z tym fantem ??

    L1 EQU 21.0H ;A
    L2 EQU 21.1H ;B
    L3 EQU 21.2H ;S WYNIK II BRAMKI XOR
    L4 EQU 21.3H ;Cin PRZEPELNIENIE
    L5 EQU 21.4H ;Cout
    LS1 EQU 21.5 ;WYNIK Z I BRAMKI XOR
    LS2 EQU 21.6 ;WYNIK Z I BRAMKI AND
    LS3 EQU 21.7 ;WYNIK Z II BRAMKI AND
    LS4 EQU 22.0 ;WYNIK Z III BRAMKI AND
    LS5 EQU 22.1 ;WYNIK Z I BRAMKI OR

    LJMP START
    ORG 100H

    SUMATOR:
    MOV A, #L1
    MOV R1, #L2 ;W R1 B
    XRL A, R1 ;I BRAMKA XOR
    MOV LS1, A ;WYNIK I BRAMKI XOR W LS1
    MOV A, #L1 ;W AKU JEST WARTOSC 'A'
    ANL A, R1 ;I BRAMKA AND
    MOV LS2, A ;WYNIK I BRAMKI AND W LS2
    ANL A, #L4 ;II BRAMKA AND
    MOV LS3,A ;WYNIK II BRAMKI AND W LS3
    MOV A, #L4 ;
    ANL A, R1 ;WYNIK III BRAMKI AND W LS4
    MOV LS4, A ;
    XRL A, LS1 ;DRUGA BRAMKA XOR
    MOV L3, A ;WYNIK II BRAMKI XOR W L3
    MOV A, LS2 ;
    ORL A, LS3 ;I BRAMKA OR
    ORL A, LS4 ;II BRAMKA OR NA L5
    MOV L5,A
    RET
  • Poziom 10  
    Ale namieszałeś, to co CI napisałem wyżej załatwia całą sprawę, to co Ty napisałeś jest mało praktyczne. Pisząc programy zawsze kładzie sie nacisk na szybkość, czyli jak najmniej instrukcji
  • Poziom 10  
    a dalej cos podpowiesz ?? :)
  • Poziom 10  
    mam zrobiony praktycznie caly sumator - tylko teraz nie mam pojecia co zrobic, zeby wpisac z klawiatury do danej komorki liczbe 8bitowa, ktora pozniej zostanie dodana z druga liczba??
  • Poziom 33  
    A w jakiej postaci chesz ja wprowadzać ? Binarnej, decymenalnej czy heksadecymenalnej ?
  • Poziom 10  
    ...decymalnej z klawiatury matrycowej, zapisac je do dwóch z komorek adresowanych bitowo czyli 20H...2FH, bo wtedy poszczegolne bity jednej bede mial np w 20H.0, 20H.1...20H.7, w 21H i w 22H sa klawisze klawiatury 0...7 i 8..
  • Poziom 10  
    a ja mam taki problem przy tworzeniu takiego sumatora... wprowadzam z klawiatury matrycowej dwie cyfry, pozniej przerabiam te cyfry na liczbe dwucyfrowa (pierwsza liczbe razy 10 + druga liczba). Tak przerobiona liczbe zapisuje pod jakis odres powiedzmy 50H. I pozniej chcialbym aby kolejne bity tej liczby zapisywaly sie pod adresy adresowane bitowo (np. 20H). Kolejne bity wczytanej liczby bede uzyskiwal przy uzyciu m.in. operacji RRC tylko nie wiem jak zrobic aby w petli kolejne bity wpisywaly sie pod 20.0H, 20.1H itd. Nie wiem jak zrobic aby inkrementowac 20H tak aby kolejno w kazdym przebiegu petli wskazywalo 20.0H, 20.1H, 20.2H itd.. Licze na wasza pomoc :)

    pozdrawiam ;]
  • Poziom 10  
    po to zeby moc puzniej sumowac kolejne bity ??

    a jak wedlug Ciebie najlepiej to zrobic??
  • Specjalista - Mikrokontrolery
    piszesz, ze chcesz jakies bity zapisywac w jakichs miejscach pamieci. no to nalezy tak zrobic ze wszystkimi na raz, zwazywszy na to, ze masz do czynienia z mikrokontrolerem OŚMIOBITOWYM. a zeby potem je sobie sumowac z innymi, to mozna uzyc prostych operacji logicznych: suma = OR bitowy, tudziez po ludzku uzyc sumowania najzwyklkejszego.

    pozatym jak chcesz uzyskac odpowiedz to moze napiszesz co chcesz zrobic, bo na razie to wiem tyle, ze chcesz przeniesc iles bitow z jednego miejsca w drugie. ale po co i na co, to juz nie.

    0x41 0x56 0x45!!
  • Poziom 10  
    pisze w temacie o sumatorze 8-bitowym wiec chce zrobic sumator ;p

    wiec po kolei:
    1.wczytuje dwie cyfry, przerobiam je na liczbe (mam pierwsza liczbe)
    2.wczytuje kolejne dwie cyfry, i znowu przerabiam na liczbe (mam druga liczbe)
    3.teraz musze to zsumowac i do tego chcialem zapisac kolejne bity liczb pod adresy 20.1H itd a pozniej zsumowac odwolujac sie bitowo do adresow pamieci (zeby zsumowac to wiem ze trzeba uzyc bramek)

    Masz jakis lepszy sposob jak to zrobic ... bo ja nie jestem w tym najlepszy i taki sposob wymyslilem ale nie wiem czy moj tok myslenia jest dobry ... wiec prosze o pomoc :)
  • Specjalista - Mikrokontrolery
    a jak to ma byc zsumowane? arytmetycznie czy bitowo? bo jesli arytmetycznie, to nalezy uzyc dodawania (zapewne nazywa sie ADD, alezy na jakim procku), zeby zsumowac cos logicznie - jak juz powiedzialem nalezy uzyc funckji OR. jesli koniecznie ma to byc takie sumowanie jak na gorze, ze przez XOR'a i jakies carry, to nalezy to zrobic... przez XOR'a i AND'a, ale OSMIOBITOWEGO. po jaka cholere robic to po jednym bicie, skoro mozna to zrobic na raz dla wszystkich 8.

    0x41 0x56 0x45!!
  • Poziom 10  
    sumowanie ma byc bitowe .... tylko problem polega na tym ze musze sumowac po jednym bicie!! Wiec jak to najlepiej zrobic??
  • Specjalista - Mikrokontrolery
    bezsensu [; tego sie nie da zrobic latwo [;

    mozna wczytac 2 bity do 2 rejestrow (uprzednio wyczyszczonych) i zsumowac po ludzku te rejestry jakims ORem, albo ADDem, bedzie po jednym bicie i w miare prosto.

    0x41 0x56 0x45!!
  • Poziom 10  
    a moglbys blizej opisac jak to zrobic??

    Dodano po 15 [minuty]:

    jak moge wczytac do rejestru pojedyncze bity ??
  • Specjalista - Mikrokontrolery
    no przeciez juz to sam napisales... rotacja sobie wrzucasz bit do Carry, nastepnie przerotowywujesz owe Carry dalej do jakiegos (wyczyszczonego wczesniej) rejestru na dowolna pozycje, choc najlepiej na LSB. dokladnie to samo robisz dla drugiej zmiennej, tyle ze wykorzystujesz jako adres drugi rejestr. czyli ze jesli akurat twoim bitem aktualnym jest 1, to masz teraz w rejestrze 00000001, jesli 0 - same zera. teraz mozesz sobie te rejestry dodac jak sobie tylko zyczysz - ORem, XORem + ANDem, normalnie... dodatkowo jesli koniecznie potrzebny ci wynik z carry, to mozesz dorotowywac te bity do rejestrow na MSB, wtedy dla 10000000 i 10000000 zsumowanego masz na tym konkretnym bicie 0, a dodatkowo w rejestrze statusu ustawia ci sie Carry, ktore mozesz uzyc.

    EDIT:
    miej swiadomosc tego, ze rotacja, to nie po prostu wystawienie skrajnego bitu do C, ale rowniez zapisanie aktualnego stanu C do przeciwnego skrajnego bitu, ktory jest teoretycznie wolny po rotacji. dlatego mozna rotacji uzyc zarowno do wyciagania z czegos po bicie, jak i do wstawiania czegos po bicie.

    wiec taka sekwencja operacji:
    wyczyszczenie carry (opcjonalnie) -> rotacja zmiennej ZMIENNA w lewo -> rotacja rejestru REJESTR w lewo
    sprawi, ze najwyzszy bit ze ZMIENNA stanie sie najmlodszym bitem REJESTR ( C=0; {C=MSB(ZMIENNA); LSB(ZMIENNA)=C(poprzedni stan);} {C=MSB(REJESTR); LSB(REJESTR)=C(poprzedni stan)} ). oczywiscie mozliwe sa dowolne kombinajce rotacji prawo/lewo, zaleznie od tego w jakiej kolejnosci chcesz bity pobieirac, a w jakiej chcesz je wstawiac do innego miejsca. poczytaj datasheeta z dokladnym wytlumaczeniem operacji rotacji, albo gdzies indziej sobie to wygugluj, to na pewno zrozumiesz o co mi chodzi.

    0x41 0x56 0x45!!
  • Poziom 10  
    A czy jest jakiś sposób aby moc sie odwolywac bitowo do danych przy pomocy petli?? Chodzi mi o to ze w petli chcialbym robic rotacje i kolejne uzyskane bity zapisywac pod 20.0H itd chodzi mi czy da sie jakos inkrementowac 20.0H do 20.1H itd. w petli ?? Upieram sie przy tym adresowaniu bitowym bo moj wykladowca zasugerowal mi ze tak bedzie najlepiej a jak on cos sugeruje to prawie tak jakby powiedzial ze inne rozwiazania sa niedopuszczalne :/
  • Specjalista - Mikrokontrolery
    nie mozna sie do niczego w pamieci odwolywac bitowo, bo pamiec jest ilustam bitowa (np 8). dlatego rozwiazac da sie to JEDYNIE posrednio. odwolujac sie do danego miejsca w pamieci wczytujesz cale slowo pamieci, nastepnie przy uzyciu funkcji logicznych mozesz sobie wyzerowac nieinteresujacy cie kawalek (np przy uzyciu prostego ANDa). mozesz sobie wiec stworzyc maske o postaci 00000001, andowac ta maske z bajtem z pamieci, a po wykonaniu jednego przejsca petli obrocic sobie ja w lewo, wtedy w nastepnym wywolaniu widzisz tylko i wylacznie bit drugi. jednakze jest to beznadziejne (; jednakze mozliwe. wtedy mozesz wykonywac tak naprawde 8-bitowe operacje na rejestrze, w ktorym tylko jeden bit ma znaczenie, nastepnie mozesz sobie go wczytywac do C (poprzez ORa), albo zapisywac go w jakies miejsce (poprzez ANDa). niemniej jednak rozwiazania te nie sa eleganckie, przejrzyste i w ogole sa lewe ogolnie. zostalbym przy rotowaniu.

    0x41 0x56 0x45!!
  • Poziom 10  
    mowisz ze nie mozna sie do niczego w pamieci odwolac bitowo ale przeciesz przy adresie np. 20H jest cos takiego jak adresowanie bitowe.

    To jeszcze ostatnia prosba.... jak mozesz to wytlumacz mi jak kroczek po kroczku powinien wygladac ten sumator i to sumowanie z rotacja (nie chodzi mi o gotowy kod tylko dokladny opis krok po kroku)
  • Specjalista - Mikrokontrolery
    to o czym piszesz najprawdopodobniej jest jakas funkcja w C, ktora jest zrealizowana na jeden ze sposobow o ktorym pisalem.

    jaka DOKLADNIE operacje ma realizowac twoj sumator? OR? XOR+AND? ile bitow ma byc sumowane? czy maja byc sumowane po prostu bity i podawany wynik, czy istotne jest, zeby carry z poprzedniej pary bylo dodawane do kolejnej? tu jest milion mozliwych szczegolow, ktorych nie podajesz [;

    0x41 0x56 0x45!!
  • Poziom 10  
    no wiec tak.... ma byc sumowane osiem bitow pierwszej liczby z osmioma bitami drugiej.... bit przeniesienia ma byc uwzgledniany przy kolejnych sumowaniach
  • Specjalista - Mikrokontrolery
    sumowane zmienne : VAR1, VAR2
    uzywane rejestry: R1, R2, R3, R4
    wynik w RES1

    Code:

    0. wyzeruj R4
    petla_start:
    1. wyczysc R1 i R2 // czyszczenie rejestrow tymczasowych
    2. rotuj VAR1 w prawo (LSB VAR1 => C) // wczytanie aktualnie najnizszego LSB
    3. rotuj R1 w lewo (C => LSB R1) // wpisanie go do LSB R1
    4. rotuj VAR2 w prawo (LSB VAR2 => C)
    5. rotuj R2 w lewo (C => LSB R2)
    6. R3 = (R1 XOR R2) XOR R4 // obliczenie wyniku sumy na podstawie dwoch aktualnych bitow i poprzedniego carry
    7. rotuj R3 w prawo (LSB R3 => C) // wczytanie aktualnego wyniku do carry
    8. rotuj RES1 w prawo (C => MSB RES1) // obrot wyniku, wpisanie aktualnego wyniku do MSB
    9. R3 = (R1 AND R2) OR [(R1 XOR R2) AND R4] // ustalenie czy konieczne jest carry na podstawie aktualnych 2 bitow i poprzedniego carry
    10. R4 = R3 // zapisanie carry
    11. (powtorz petle 8 razy)


    zakrecone jak juz mowilem, ale na 99% poprawne. mozna by to zasadniczo uproscic, jesliby mozna uzyc rozkazu, ktory ma kazdy procesor ADDC, to wyeliminowaloby potrzebe czesci operacji logicznych, a przy drobnych przerobkach nawet calosc logicznych. dzialaloby dalej po bicie, ale bylo nieco prostsze. nie twierdze oczywiscie, ze teraz nie da sie tego uproscic, bo pewnie sie da [; pozno juz, a mnie projekty wykanczaja, wiec wyszlo jak wyszlo <:

    0x41 0x56 0x45!!
  • Poziom 10  
    jak zatrzymac program na dsm 8051 na 10 ms lub 1s nie uzywajac do tego procedur epromu?? da sie to zrobic uzywajac instrukcji NOP??