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.

[Rozwiązano] avrdude, odczyt FLASH 89S52 przy użyciu ArduinoISP

06 Mar 2019 14:16 285 1
  • Poziom 17  
    Cześć wszystkim!

    Mam urządzenie bez nazwy (panel led), które jest kontrolowane przez AT89S52. Próbowałem "użyć go" w jakiś sposób, ale bez powodzenia, więc postanowiłem spróbować pobrać FLASH i spróbować go przeanalizować. To jest dla mnie po raz pierwszy (zgranie flash), więc nie mam żadnego programatora - więc użyłem oryginalnego Arduino UNO.
    Zaprogramowałem go jako ArduinoISP.

    Potem wziąłem się za inny problem - nie ma (łatwego sposobu) "połączyć się" z programatorem do 89.

    Więc przylutowałem przewody, jak sądzę, gdzie trzeba. Wszytskie interesujące nas nogi są przylutowane do czegoś:
    7705 (ustawia wejście 89 na HIGH gdy napięcie zasilania spadnie poniżej 4,55V (http://www.ti.com/product/TL7705A#) - Wyjście przylutowane do D10 arduino
    7805 - stabilizator napięcia na 5V -do 5V Arduino
    ULN2003 - High Voltage, High Current Darlington Transistor Arrays , datasheet: https://www.onsemi.com/pub/Collateral/ULN2003A-D.PDF . Wyjścia odpowiedzialne za SCK, MOSI i MISO są z nim połączone, więc do jego nóżek przylutowałem przewody, które idą do D11-D13 Arduino.

    Trochę poczytałem o tym jak zgrać FLASH i jak programować AT89 i doszedłem do wniosku, że komendy mogą wyglądać tak:

    Code:
    avrdude -C F40R96CIUSLFZFP.conf -c stk500v1 -P /dev/ttyACM0 -p 89s52 -b 19200 -D -Uflash:r:program.bin:r
    

    avrdude -C F40R96CIUSLFZFP.conf -c avrisp -P /dev/ttyACM0 -p 89s52 -b 19200 -D -Uflash:r:program.bin:r


    Jednakże dają mi:

    Code:
    avrdude: AVR device initialized and ready to accept instructions
    

    Reading | ################################################## | 100% 0.02s

    avrdude: Device signature = 0x000000 (retrying)

    Reading | ################################################## | 100% 0.02s

    avrdude: Device signature = 0x000000 (retrying)

    Reading | ################################################## | 100% 0.02s

    avrdude: Device signature = 0x000000
    avrdude: Yikes!  Invalid device signature.
             Double check connections and try again, or use -F to override
             this check.


    avrdude done.  Thank you.


    Zmuszenie do zczytania (-F) daje plik 8k wypełniony zerami.

    A:
    Code:
    avrdude -C F40R96CIUSLFZFP.conf -c arduino -P /dev/ttyACM0 -p 89s52 -b 19200 -D -Uflash:r:program.bin:r 
    


    avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14

    avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x01
    avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x10
    avrdude: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.

    avrdude: stk500_disable(): unknown response=0x12

    avrdude done.  Thank you.


    Pomierzyłem wszystkie połączenia i wygląda to dobrze. Na arduino wgrałem program ustawiający wszystkie wyjścia (D10-D13) na HIGH, żeby sprawdzić, czy gdzieś napięcie nie "ucieka" i wszystko wygląda dobrze również.

    Skończyły mi się pomysły...

    Początek F40R96CIUSLFZFP:
    Code:
    part
    
        id               = "89s52";
        desc             = "AT89S52";
        stk500_devcode   = 0xE1;
        signature        = 0x1e 0x52 0x06;
        chip_erase_delay = 500000;
        reset            = dedicated;
        pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                           "x x x x  x x x x    x x x x  x x x x";

        chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                           "x x x x  x x x x    x x x x  x x x x";

        memory "flash"
            size            = 8192 ;             # bytes
            read            = "0 0 1 0 0 0 0 0  x x x a12 a11 a10 a9 a8",
                              "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
            write           = "0 1 0 0 0 0 0 0 x x x a12 a11 a10 a9 a8",
                              "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
            ;
        memory "signature"
            size            = 3;
            read            = "0 0 1 0 1 0 0 0  0 0 0 0 0 0 a1 a0",
                              "0 0 0 0 0 0 0 0  o o o o o o  o  o";
            ;
      ;
    part parent "89s52"
        id = "89s51";
        desc = "AT89S51";
        signature = 0x1e 0x51 0x06;
        memory "flash"
            size            = 4096 ;             # bytes
            read            = "0 0 1 0 0 0 0 0  x x x x a11 a10 a9 a8",
                              "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
            write           = "0 1 0 0 0 0 0 0 x x x x a11 a10 a9 a8",
                              "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
          ;
        ;


    Jeszcze raz wypiszę jak to jest połączone:(TQFP package):

    PIN1 (MOSI) - D11
    PIN2 (MISO) - D12
    PIN3 (SCK) - D13
    PIN4 (RST) - D10

    PIN38 (5V) - 5V
    PIN17 (GND) - GND

    Rezonator to chyba 12M.

    Sprawdziłem na dwóch takich panelach...
  • Poziom 17  
    Pin RST w arduino jest zanegowany, w 89c52 - nie. Znalazłem zmodyfikowany ArduinoISP z odwróconym RST. Działa.