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

nietypowy problem z PCF8591

grzesio14 18 May 2005 12:04 1763 8
  • #1
    grzesio14
    Level 14  
    Witam.
    PCF8591 połączyłem z AT89S8252.
    Napisałem program do odczytu wartości z wejścia analogowego oraz drugi program do wystawiania wartości na wyjściu analogowym.
    Osobno programy te działają prawidłowo. Jednak po połączeniu ich wykazuje program problem z komunikacją.
    Poniżej przedstawiam listing.
    Proszę o uwagi dotyczące błędów.
    Grzegorz.

    $include(at89s8252.inc)
    sda equ P1.6
    scl equ P1.7
    org 0100h
    clr C
    call Start
    jc Blod
    mov A,#10010001b
    acall Wyslij
    jc Blod
    mov A,#00000000b
    call Wyslij
    jc Blod
    call Odczyt
    call Potwierdz
    call Odczyt
    call Potwierdz
    mov P3,A
    mov R4,A
    clr A
    clr C
    call Start
    jc Blod
    mov A,#10010000b
    call Wyslij
    jc Blod
    mov A,#01000000b
    call Wyslij
    jc Blod
    mov A,R4
    call Wyslij
    jc Blod
    call Stop
    sjmp $
    Start:
    setb sda
    setb scl
    call Stabil
    jnb sda,Blod
    jnb scl,Blod
    clr sda
    call Stabil
    clr scl
    clr C
    ret
    Stabil:
    nop
    ret
    Blod:
    mov A,#00000000b
    mov P3,A
    aCall Stabil
    setb C
    ret
    Wyslij:
    mov R7,#00001000b
    Wy:
    rlc A
    mov sda,C
    acall Stabil
    setb scl
    acall Stabil
    clr scl
    djnz R7,Wy
    setb sda
    acall Stabil
    setb scl
    acall Stabil
    mov C,sda
    clr scl
    ret
    Odczyt:
    setb sda
    mov R6,#00001000b
    Od:
    acall Stabil
    setb scl
    acall Stabil
    mov C,sda
    clr scl
    rlc A
    djnz R6,Od
    ret
    Potwierdz:
    clr sda
    acall Stabil
    setb scl
    acall Stabil
    clr scl
    ret
    Stop:
    clr sda
    setb scl
    acall Stabil
    setb sda
    ret
    end.
  • #2
    elektryk
    Level 42  
    Jaki jest objaw tego błędu z komunikacją?
  • #3
    grzesio14
    Level 14  
    Objawem błędu jest wywołanie procedury informującej o błędzie:
    Blod:
    mov A,#00000000b
    mov P3,A
    aCall Stabil
    setb C
    ret
    Ustawienie portu P3.
    Próbowałem różnych czasów stabilizacji linii ale nie dało to żadnego efektu.
    Grzegorz.
  • #4
    bolek
    Level 35  
    a jak z bitam NACK, czy są prawidłowo stosowane?, miałem podobny problem. Spiety był PCF i 24c02, najpierw wczytywane były dane z c02 i tam miałem źle ustawione bity potwierdzenia. objaw był taki że PCF nie reagował jak sie wywołało jego adres
  • #5
    Artur2003
    Level 18  
    mam pytanie czy ten program bedzie działał w bascom-ie i na 8051/avr i może ktoś może podpowiedzieć jak go podłączyć do tego posiadam układ jak na załączonym linku "http://stud.wsi.edu.pl/~sikrolb/schematy-przetwornik_acca_i2c.html" gdzie co należy podłączyć
  • #6
    grzesio14
    Level 14  
    Dawno temu pisałem proste programy w bascomie i wiele zapomniałem. Korzystałem z oślej łączki i tam były opisane proste procedurki które działały w 100%.
    Schemat pokazany w linku zgadza się z tym z oślej łączki.
    Podłączenie lini scl, sda to definiujemy sobie sami na początku programu tak w bascomie jak i w asm.
    Programy pisałem na 51.
    Do avr to się przymierzam ale za jakiś czas.
  • #7
    zumek
    Level 39  
    grzesio14 wrote:

    ...
    Próbowałem różnych czasów stabilizacji linii ale nie dało to żadnego efektu.
    Grzegorz.


    Widzi mi się , że masz błąd w programie :(
    
    org 0100h
    clr C
    call Start                   'I2C Start
    jc Blod                       
    mov A,#10010001b   ;Ustaw urządz. o adresie 90h DO ODCZYTU
    acall Wyslij
    jc Blod
    mov A,#00000000b   ;po co wysyłasz "0" na magistralę ???
                                   ;powinieneś czytać ! 
    call Wyslij
    jc Blod
    call Odczyt
    call Potwierdz
    call Odczyt
    call Potwierdz           ;raczej niepotwierdzaj , bo to ostatni odczytany bajt.
    mov P3,A
    mov R4,A
    clr A
    clr C
    ; A gdzie I2C Stop ???
    ;Proszę , zweryfikuj swój program  z dokumentacją PCF-a.
    call Start
    jc Blod
    mov A,#10010000b 
    ...
    

    By zapisać CONTROL BYTE , musisz wysłać adres do zapisu (90h):
    
    call Start
    jc Blod
    mov A,#90h
    call Wyslij
    mov A,#CONTROL_BYTE  ; ustawiasz co tam potrzebujesz.
    call Wyslij
    ...
    


    To tak w skrócie.

    Pozdrawiam
    Piotrek
  • Helpful post
    #8
    bolek
    Level 35  
    Tak wyglada "schemat" moich procedur, trochę masz śmieszny sposób sprawdzania magistrali. Powinno sie to tak robić że jak wywyołasz adres urządzenia, to układ ma wystawić bit ACK. Na marginesie (bo podejżewam że się w końcu na to natniesz) aby wystawić zmienną na wyjscie DAC'a nalezy ją wysłać dwa razy!
  • #9
    grzesio14
    Level 14  
    Sprawdzę podane przez was procedurki.
    Napisałem profram do wystawienia wartości analogowej na przetworniku i działa. Następnie program do odczytu wartości analogowej i też działał.
    Czyli przetwornik działa w 2 strony a/c i c/a.
    Jak połączyłe oba te programy to nie chciał działać. Nie wiem czemu.
    Dołączam kod programu: