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

Plik HEX i pamięć I2C?

13 Lis 2007 20:03 2785 20
  • Poziom 26  
    Witam Szanownych Kolegów.
    Zastanawiam się jaka najprostsza koncepcję przyjąć dla następującego problemu: mam pamięć I2C 24LC32 i procek 89C4051 i do tejże pamięci mam wprowadzić plik formatu Intel HEX. OK, dam MAX'a232 do podłączenia z kompen ale czym tego HEx'a wczytac do pamięci, jak najlepiej to zrobić bo przecież pamięć I2C potrzebuje trochę czasu aby zapisac daną więc baud nie będzie zbyt wysoki. Macie może jakies doświadczenia w tym temacie? robiw
  • Poziom 26  
    A może tak:
    Procek 89C2051, do niego pamięć 24C32 na I2C, max232 i złącze DB9 podpięte do kompa na COM1 oraz w procku ustawione przerwanie od RX. Po przyjściu przerwania procek wysyła w obsłudze przerwania daną do pamięci poprzez I2C - i tu nie wiem czy takie rozwiązanie jest dopuszczalne z uwagi na wolny zapis do pamięci tzn. potrzebę odczekania 10ms. Prawdopodobnie należałoby ustawić jakiś bardzo niski baud rzędu 1200 lub nawet mniej. I tu pytanie: jaki program wczyta tego HEX'a i wyśle go po COMie? Czy trzeba jakoś potwierdzać każdą daną itp? Jaki jest format HEXa? robiw
  • Poziom 14  
    też bym tak zrobił, szybkość nie musi być mała wystarczy nie zezewolić komputerowi na nadawanie kolejnego znaku - poczytaj o satndarcie rs232.
    program do wysyłania hexa to zwykły terminal np hyper terminal xp,
    format hexa :ilość bajtów w linijce;
    adrs od jakiego należy zapisywać;
    suma kontrolna w kodzie U2 (z jedynek chyba) jest to w sieci - google
    na początku są jeszcze jakieś zera- 00-dane 01 koniec danych
    powodzenia
  • Poziom 26  
    OK, w sumie to nie wiem czy format muszę znać tak na dobrą sprawę skoro choćby hyper terminal to wyśle na RSa. Tylko jak zmusić kompa aby nie wysyłał kolejnej danej gdy mikrokontroler jej sobie jeszcze nie "obrobił" - tej poprzedniej? Mam po prostu plik HEX, który ma być umieszczony w pamięci 24LC32, która połączona jest magistralą I2C do 89C2051 a ten przez RS232 do COMa1...robiw
  • Poziom 14  
    w standarcie rs 232 są sygnały które umożliwiją powstrzymanie nadawanie poczytaj o RTS CTS DTR DSR to Ci się wszystko wyjaśni. - sprzętowe sterowanie

    a format chyba musisz znać bo w hexie jest napisane gdzie co ma byc zapisane więc procek musi to umieć przeczytac , a Ty go tego nauczysz:)
  • Poziom 26  
    Mógłbym na przykład użyć IC-prog'a tyle, że nie wiem czy jest odpowiedni? robiw
  • Poziom 25  
    Najprostszy - troche wiejski - ale skuteczny sposob to wprowadzenie opozniena po wyslaniu pojedynczego znaku. W Hyperterminalu idz do Properties->Settings->ASCII Setup i ustaw Character Delay na wartosc jaka chcesz. Potem Send Text File i pojedyncze znaczki beda wysylaly sie co ustalona liczbe milsekund. Lepszym rozwiazaniem jest jednak zastosowanie chocby prostego echa (wysylanego po zakonczeniu zapisu do Twej pamieci) - gdy PC je odbierze to wtedy wysyla nastepny znak. Ale wtedy musisz sam napisac aplikacje na PC lub znalezc taka, ktora to potrafi.

    BF
  • Poziom 26  
    Bigfoot napisał:
    Najprostszy - troche wiejski - ale skuteczny sposob to wprowadzenie opozniena po wyslaniu pojedynczego znaku. W Hyperterminalu idz do Properties->Settings->ASCII Setup i ustaw Character Delay na wartosc jaka chcesz. Potem Send Text File i pojedyncze znaczki beda wysylaly sie co ustalona liczbe milsekund. Lepszym rozwiazaniem jest jednak zastosowanie chocby prostego echa (wysylanego po zakonczeniu zapisu do Twej pamieci) - gdy PC je odbierze to wtedy wysyla nastepny znak. Ale wtedy musisz sam napisac aplikacje na PC lub znalezc taka, ktora to potrafi.
    BF


    Mogę ten plik HEX wysłać przez HyperTerminal ustawiając zarówno w procku jak i w terminalu ten sam rodzaj transmisji bez potwierdzania i o niskim Baud np.1200 - przy takim baud pamięć i2c spokojnie zapisze daną w procedurze obsługi przerwania od RS'a gdyż potrzebuje na to 5ms. Pozostaje jednak jeszcze jeden problem: w pliku HEX siedzą różne informacje np. taka w jakim miejscu w pamięci mają byc zapisane dane - u mnie od komórki 0x00 i kolejno az do końca pamięci 24lc32, nie wiem jednak czy program wysyła tylko same dane na RS'a kolejno czy też inne informacje. Jakim programem dokonać tego wysłania aby kolejno wywyłał dane z HEXa (same dane)...a może użyć pliku "C Header file type output", który jest także generowany przez aplikację oprócz pliku HEX (oba w załączniku)... robiw
  • Poziom 25  
    Mam wrazenie, ze sam do konca nie wiesz co chcesz zrobic:( Plik hex to zwykly plik tekstowy i jakkolwiek go wyslesz zawsze bedziesz wysylal znak po znaku.


    BF
  • Poziom 26  
    Dokładnie wiem. Potrzebuję wysłać SAME dane z pliku HEX (jedna po drugiej) na port COM1 komputera - w załączniku jest plik HEX (22kB), który zawiera 4kB "czystych" danych, które muszę wysłać bez kontroli przepływu na port COM1, bez żadnych znaczników CR, CF i tych podobnych, poprostu 4096 bajtów, 32768 bitów - to własnie chcę zrobić. Te dane, z kolei, po odebraniu każdego bajtu, będę za pośrednictwem magistrali I2C zapisywał w pamięci 24LC32, bajt po bajcie, w procedurze obsługi przerwania od Rx... robiw

    Dodano po 4 [minuty]:

    Bigfoot napisał:
    Mam wrazenie, ze sam do konca nie wiesz co chcesz zrobic:( Plik hex to zwykly plik tekstowy i jakkolwiek go wyslesz zawsze bedziesz wysylal znak po znaku.
    BF


    Co znaczy znak po znaku? Dwukropek też? Informację o liczbie danych też? Sumę kontrolną też? Czy tez tylko "czyste" dane? A może dodatkowo jakieś znaczniki CR, czy CF czy inne? Dlatego zastanawiałem się nad zmianą jego formatu do BIN i wysłaniu czymś (?) na COMa...robiw
  • Poziom 25  
    robiw napisał:
    Potrzebuję wysłać SAME dane z pliku HEX (...)
    Co znaczy znak po znaku? Dwukropek też? Informację o liczbie danych też? Sumę kontrolną też? Czy tez tylko "czyste" dane?

    A skad ten np. Hyperterminal ma wiedziec co jest "czysta " dana a co nie? Ty mu to musisz powiedziec. Ty musisz wyluskac z pliku hex Twoje dane i tylko je wyslac. Dla Hyperterminala nie ma roznicy czy wysyla dwukropek, literka 'A' czy wartosc sumy kontrolnej.
    Jesli chcesz korzystac z Hyperterminala do tego celu to musisz miec plik z wylacznie danymi bo inaczej HyperTerminal wysle wszystko - znaczniki tez. Skorzystaj z pliku, ktory zalaczyles wyzej (o nazwie proba.h) ale pamietaj by ignorowac spacje, znaki<CR>, przecinki itp. Majac dane
    Code:

    proba_00[] = {
    0x80,0x20,0x00,0x11,
    0x00,0xC0,0x14,0x12,
    0x06,0x01,0x3F,0x94,
    0x00,0x01,0x3F,0xB4,
    0x00,0x01,0x45,0xC2,
    0x07,0x04,0x13,0x94,


    Twoj algorytm na uC moze wygladac tak:
    1. czytaj kolejny znak
    2. jesli znak jest 'x' to nastepne dwa znaki zapisz do pamieci
    3. jesli koniec pliku (znak==0) to zakoncz, w innym wypadku idz do 1.

    Pamietaj tez, ze po takiej akcji w Twojej pamieci beda znaki ASCII wyslanych liczb a nie wartosci tych liczb. Najlepiej od razu po odczycie z RSa przekonwertuj je sobie na postac liczbowa.
    BF
  • Poziom 26  
    To może lepiej jednak wykorzystać ten plik HEX i z niego wydobyć (z każdego wiersza) te informacje. Nie wiem tylko jak terminal to wyśle tzn. w jaki sposób. A może lepszy byłby jakiś inny program lub zamienić tego HEX'a na BIN'a (hex2bin.exe) i wtedy przez terminal wysłać już tego BINa - 4096 bajtów prosto do pamięci,... robiw
  • Poziom 25  
    No a jak chcesz wydobyc te informacje? Potrafisz spojrzec na hex i wiesz ktora pozycja oznacza co?? I po co sie trudzic skoro masz juz je wydobyte w pliku proba.h?

    BF
  • Poziom 26  
    Przez konwersje do BIN'a... robiw
  • Poziom 25  
    Ktos tu czegos nie rozumie: albo ja, albo Ty. Jezeli swoj caly hex przekonwertujesz do bina to przekonwertujesz WSZYSTKO, nie tylko Twoje dane. I jak dalej z tego bina bedziesz wyluskiwal te dane??

    BF
  • Poziom 26  
    Bigfoot napisał:
    Ktos tu czegos nie rozumie: albo ja, albo Ty. Jezeli swoj caly hex przekonwertujesz do bina to przekonwertujesz WSZYSTKO, nie tylko Twoje dane. I jak dalej z tego bina bedziesz wyluskiwal te dane??

    BF


    No to chyba się nie rozumiemy. Chyba bez sensu byłoby aby program BIN2HEX.exe tak robił, zresztą po konwersji z 22kB HEXa dostajesz 4kB BINa - co sugeruje, że są tam tylko dane. Konwersja jest zresztą dość prosta sprawą, gdyż format Intel HEX jest dość prosty: http://www.serious-dial.atari.pl/SSerious/S06/A12.html. A BINa to już chyba możemy prosto do pamięci przez terminal wysłać tzn. za pośrednictwem RS232. Nie wiem tylko czy należy zapisać w pamięci kody ASCII... robiw
  • Poziom 25  
    Piszac DANE masz na mysli caly kod programu. Ja - mowiac DANE - mam na mysli jakies wartosci, np. z jakiejs tablicy, z odczytanego EEPROMu, zdefiniowane np. zestawy czcionek. Stad nieporozumienie. Jezeli zrobisz hex2bin bedziesz mial wartosci juz liczbowe.

    BF
  • Poziom 26  
    Tak, to jest kod programu specjalnego assemblera dla procesora sygnałowego także odbierając je mogę bezpośrednio dane z bufora SBUF wczytywać do pamięci bez jakiejkolwiek konwersji, tak mi się zdaje. I zapewne wystarczy do tego terminal XP, nie wiem tylko czy na końcu tego BINa nie doda jakiegoś znaku - to muszę sprawdzić. Może też pokuszę się o wysyłanie HEXa za pomoca terminala. Program obsługi czytał by te dane po każdym wdukropku (4 bajty) a nastepnie zapisywał do pamięci - zobaczę czy zostanie na to miejsce we flashu...robiw

    Dodano po 10 [minuty]:

    A czy mogę wyjścia sterujące 2 procków (SCL i SDA) połączyc galwanicznie razem i do jednego wejścia w eepromie i2c? W czasie gdy jeden nadaje na wyjściach drugiego wystawię stan wysoki więc drugi spokojnie będzie mógł to ściągać do zera? Czy trzeba multiplexer? robiw