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

kilka slave'ow na 80C51 przez 1-wire w asemblerze

22 Lis 2007 13:14 1134 2
  • Poziom 10  
    Witam

    Musze zrobic projekt termometru i ibutton(firmy dallas podzespoly) na mikrokontroler 80C51. Niestety program do ich obsługi potrzebuje w asemblerze. Jesli chodzi o komendy reset&presence, zapis i odczut bajtów informacji to juz mam zrobioone. Natomiast interesuje mnie implementacja Komend wyszukiwania adresów urządzen podlaczonych do 1-wire( tzw. searchROM algorithm) w asemblerze niestety. Pisze niestety bo znalazlem wiele kodów napisanych w C, a w asm nic.

    Prosze o pomoc i zgóry dziekuje
    Pozdrawiam
  • Serwerowe OpowieściSerwerowe Opowieści
  • Pomocny post
    Poziom 39  
    djfaraon napisał:
    ... Pisze niestety bo znalazlem wiele kodów napisanych w C, a w asm nic...

    Mówisz , masz ;)
    Code:

    Search_rom:
              PUSH      B                     ; Save B register.
              CLR       C                     ; Assume failure.
              JB        FAIL,     ABORT       ; Continue if not at end.
              CALL      TOUCHRESET            ; Look for presence.
              CLR       A                     ; Zero the accumulator in case
              JNC       ABORT                 ;   there is no presence.
              MOV       R0,       #ROMDTA     ; Point to first byte of Rom Data.
              MOV       R1,       L0          ; Make copy of last unresolved dis.
              MOV       R2,       #0          ; Initialize 8 counter.
              MOV       B,        #64         ; Loop through all 64 bits.
              MOV       A,        #0F0H       ; Get search rom command in ACC.
              CALL      TOUCHBYTE             ; Output command byte.
    GETNBIT:
              MOV       A,        #81H        ; Send first read time slot.
              CALL      BIT_IO                ; Read bit.
              RL        A                     ; Shift first bit left one.
              CALL      BIT_IO                ; Send second read time slot.
              JZ        DIS                   ; Analyze disagreement.
              CJNE A,   #3,       $+3         ; Look for error condition.
              JNC       ABORT                 ; Abort if error has occurred.
              CPL       ACC.0                 ; Get correct bit to output in
              SJMP      NOSAVE                ;   ACC.0 and skip dis code.
    DIS:
              MOV       A,        B           ; Get current location in ACC.
              MOV       TEMP,     R1          ; Can't compare ACC and Rn.
              CJNE A,   TEMP,     L10         ; Compare current loc. w/ last dis.
              SETB      ACC.0                 ; Been here and sent 0, now send 1.
              SJMP      NOSAVE                ; Send out the bit.
    L10:
              JNC       GL                    ; Remain on previous path.
              CLR       ACC.0                 ; Past last dis. fall to the right.
              SJMP      NZ                    ; Save this position in L0.
    GL:
              MOV       A,        @R0         ; Get byte of Rom Data in ACC.
    NZ:
              JB        ACC.0,    NOSAVE      ; Don't fool with L0 if old bit 1.
              MOV       L0,       B           ; Save new value of L0.
    NOSAVE:
              CALL      BIT_IO                ; Send bit.
              MOV       C,        ACC.0       ; Get bit back in carry.
              MOV       A,        @R0         ; Get current byte in ACC.
              RRC       A                     ; Shift in new bit.
              MOV       @R0,      A           ; Save new value.
              INC       R2                    ; Point to location for next bit.
              CJNE R2,  #8,       DONTINC     ; Byte not ready yet.
              INC       R0                    ; R0 points to next storage loc.
              MOV       R2,       #0          ; Reload 8 counter.
    DONTINC:
              DJNZ      B,        GETNBIT     ; Repeat until all bits known.
              MOV       A,        R1          ; Copy previous last dis. into ACC.
              CJNE A,   L0,       $+5         ; Is this the last part ?
              SETB      FAIL                  ; Leave.
              SETB      C                     ; Indicate success.
    ABORT:
              POP       B                     ; Restore B register.
              RET

    Niestety, "rozgryźć" musisz sam :)

    Piotrek
  • Poziom 10  
    Po stokroc dzieki

    Zatem zabieram sie do analizy tegoz kodu. Gdyby pojawily sie jakies niejasne zakamarki kodu ktory od Ciebie o3malem to odezwe sie.
    Na razie i jeszcze raz "tenk ju" jak to mowia amerykanie:D