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

Punkt świetlny na 89C2051 - asembler

ekspert100 14 Cze 2006 16:14 1197 5
  • #1 14 Cze 2006 16:14
    ekspert100
    Poziom 16  

    Witam !!!

    Linijka 89C2051
    Chciałem napisać program sterujący linjką led w .asm z zastosowaniem
    przerwań i timerów. Program na ogół jest sprawny dopiero
    po modyfikacji - "Operacje na porcie" sie wykrzacza.
    Na symulatorze pracuje ok ,jednak w układzie coś nie tak,
    a zalezało mi na zmianie stanu portu poprzez obrót : RL A
    proszę o pomoc gdzie robię błąd.

    Proszę o pomoc.

    Dodano po 8 [minuty]:

    Jeszcze program:

    ;************************************************************
    ;- LINJKA DLA MIKROKONTROLERA 89C2051

    ;************************************************************
    $MOD51 ;istotne dla kompilatora asm51 @@@@@

    ORG 0000H ; vektor dla inT0 - (wej zewn)
    AJMP INIT ; skok bez_wg do podprog INIT

    ORG 000BH ; vektor dla T0 - (licznik wewn)
    AJMP INTT0 ; skok bez_wg do podprog INT0


    LED1 EQU P1.0 ;Dioda TEST podlĄczona do P1.0***
    LED2 EQU P1.1 ;Dioda TEST podlĄczona do P1.1***
    LED3 EQU P1.2 ;Dioda TEST podlĄczona do P1.2***
    LED4 EQU P1.3 ;Dioda TEST podlĄczona do P1.3***
    LED5 EQU P1.4 ;Dioda TEST podlĄczona do P1.4***
    LED6 EQU P1.5 ;Dioda TEST podlĄczona do P1.5***
    LED7 EQU P1.6 ;Dioda TEST podlĄczona do P1.6***
    LED8 EQU P1.7 ;Dioda TEST podlĄczona do P1.7***

    BUZ EQU P3.7 ;BUZZER TEST podlĄczona do P3.7***

    STALA EQU 20

    LH EQU 035H ; adres 30h (ram)
    LL EQU 037H ; adres 32h (ram)



    INIT:
    CLR EA ; zeruj - zezwolenie na przerwania ogólne
    MOV SP,#050H ;WSKAZNIK STOSU
    MOV PSW,#00H ;WSKAZNIK STANU PROCESORA
    MOV TMOD,#00000001B ;ustawienie Timerów
    MOV LH,#06AH ;ładowanie do LH wartosci 0FFH,106 D
    MOV LL,#0B0H ;ładowanie do LH wartosci 0B0H,176 D

    MOV TH0,LH ;ładowanie do Timera wartosci starszy bit
    MOV TL0,LL ;ładowanie do Timera wartosci młodszy bit
    MOV TCON,#00000001B ;ustawienie Timerów

    SETB EA ; zezwolenie na przerwania ogólne
    SETB ET0 ; zezwolenie na przerwania Timer 0 w EA - #

    ;USTAW PORT

    CPL LED8

    MOV A,#STALA
    MOV 50,A

    SETB TR0 ; w TCON - #


    WAIT:
    AJMP WAIT ; skok bez_wg do podprog

    INTT0:

    MOV 40H,A ; kopiuj A do 40H(Ram)
    MOV A,LL ; kopiuj LL do A

    ORL TL0,A ; kopiuj A do TL0 (młodszy bit)
    MOV TH0,LH ; kopiuj LH do TH0 (starszy bit)
    MOV A,40H ; kopiuj z 40H(Ram) do A

    MOV A,50 ; kopiuj 50 do A
    DEC A ; A - 1
    JNZ KONIEC ; skok jesli A nie=0
    MOV A,#STALA ; kopiuj stała do A

    ;OPERACJE NA PORCIE -----------TU COS NIE TAK !!!

    MOV 42H,A ; kopiuj A do 42H(Ram)
    MOV A,P1 ; kopiuj P1 do A
    RL A ; OBRÓT W A : ->A->
    MOV P1,A ; kopiuj z A do P1
    MOV A,42H ; kopiuj z 42H(Ram) do A


    KONIEC:
    MOV 50,A
    RETI ; powrót z obsługi przerwania



    END ;

    0 5
  • Pomocny post
    #2 14 Cze 2006 18:46
    vedy1
    Poziom 15  

    Witam!
    Jak dla mnie to program jest dla samej linijki trochu rozbudowany a samej zasady dzialania nie widac. Przed wyjściem z podprogramu przerwania nalażałoby skopiować dane z akumulatora (i tu masz błąd!) bo o ile sie nie myle to po wyjsciu z podprogramu stan acc nie jest zapisywany i może być utracony. Poniżej skrócona wersja programu do linijki:


    LJMP START
    ORG 0BH
    LJMP SUBROUNTINE
    ORG 100H

    START:
    MOV IE,#82H
    MOV TCON,#10H
    MOV 10H,#01H
    MOV TMOD,#01H
    MOV TH0,#06AH
    MOV TL0,#0B0H
    MOV 10H,#01H
    MAIN:
    SJMP MAIN


    SUBROUNTINE:
    MOV A,10H
    MOV P1,A
    RL A
    MOV 10H,A
    CLR A
    MOV TH0,#06AH
    MOV TL0,#0B0H
    RETI

    END

    0
  • #3 16 Cze 2006 12:25
    ekspert100
    Poziom 16  

    Teraz potrzebuję jeszcze porównać dwie komórki w pam. ram
    jedna to stan portu , druga to stała wartość
    wogóle są dwie stałe wartości
    stała1
    stała2
    czyli muszą być 2 porównania

    jeśli zgodne to skok do podprogramu
    jesli nie to kontynuacja programu

    cjne a, stala1, ste-7; ale ten rozkaz jest dla różnych
    jaką tu operacje najlepiej zastosować

    Pozdrawiam !!!

    0
  • #5 20 Cze 2006 13:05
    ekspert100
    Poziom 16  

    Witam !!!

    zrobiłem to tak , a moze ktoś skoryguje

    subb a,cyfa ; a-cyfra 80h =wynik w a
    mov 60h,psw ; psw do 60h
    anl 60h,#10000000b ; wydzielenie cy
    orl a,60h ; suma log
    jz rrot ; skok dla a=0
    cpl p3.5 ; kontrolka

    Pozdrawiam

    Dodano po 3 [minuty]:

    witam !!!

    sory jeszcze raz teraz ok

    mov a,10h ;stan portu do a
    subb a,cyfa ; a-cyfra 80h =wynik w a
    mov 60h,psw ; psw do 60h
    anl 60h,#10000000b ; wydzielenie cy
    orl a,60h ; suma log
    jz rrot ; skok dla a=0
    cpl p3.5 ; kontrolka

    pozdrawiam

    0
  • Pomocny post
    #6 21 Cze 2006 07:26
    tprzemko
    Poziom 22  

    Witam
    Sa takie mnemoniki jak 'jc' i 'jnc' które możesz dać zaraz po odejmowaniu. Skróci to troszkę kod.
    Pozdrawiam

    0