logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Co sadzicie: komunikacja komputer - pamiec (przez mikrokont)

lukamar 16 Lis 2003 10:35 2080 15
REKLAMA
  • #1 401721
    lukamar
    Poziom 11  
    Posty: 51
    witam
    Prosilbym o opinie na ponizszy temat. Chodzi mi czy uzyskalem w miare przyzwoity wynik czy smiechu warty.
    Otoz:
    Sytuacja wyglada tak:
    stworzylem sobie jakis prosty protokol do komunikacji SZEREGOWEJ komputer-mikrokontroler. Mikrokontroler at89c52 odczytuje wyslany bajt z komputera i zapisuje do pamieci 24c256.
    Co istotne:
    - dane nie sa zapisywane bezposrednio komputer - pamiec, tylko przez procesor, ktory jest taktowany 10Mhz
    - program na procesor napisalem z bascomie.

    Udaje mi sie zapisywac dane do pamieci z predkoscia ok. 100bajtow/s.
    Czy jest to wynik do przyjecia czy da sie wyciagnac np o rzad wiecej.

    pozdrawiam, lukasz
  • REKLAMA
  • #2 401763
    jano2300
    Poziom 17  
    Posty: 234
    Pomógł: 2
    Ocena: 7
    Baaardzo cieniutko. 100 bajtów/s - to w dużym przybliżeniu SCL=1 kHz.W takim przypadku zapis 24C256 trwałby ponad 320 s !!! (to wieczność) :( .Pamięci I2C bez problemu "biegają" na 100 kHz ,a w nowszych opracowaniach protokół przewiduje nawet ponad 400kHz... to i tak "pikuś" przy np MicroWire ,czy SPI . Śmiało możesz zmienić kwarc przy procku i ustawić baudrate na 57600 czy nawet 115 K.
  • REKLAMA
  • #3 401900
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Wszystko zalezy od protokołu komunikacji i programowania. Jeśli w każdym cyklu programowania bajtu chcesz np weryfikować całą pamięć to może to trwać bardzo długo. Sprawa druga jeśli komputer przy przesyłaniu danych wysyła jakieś dodatkowe dane kontrolne to następuje narzut ilości danych w stosunku do danych przesłanych.
  • #4 401964
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    ale czy "waskim gardlem" nie bedzie czas programowania pamieci?

    lukamar: w czym pisales soft?
  • #5 402029
    lukamar
    Poziom 11  
    Posty: 51
    programowalem w bascomie.
    mysle, ze tym waskim gardlem jest moc obliczeniowa procka,
    ktory musi odebrac ten bajt i troszke go zweryfikowac instrukcja if, nastepnie wyslac, wiec to chwile trwa.

    wgrywajac to bezposrednio z komputera da sie osiagnac duzo wiecej (kilkaadziesiat razy), bo przeciez mozna to sprawdzic programatorem i zajmuje to kilkadziesiat sekund
  • #6 402104
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Czekaj czekaj. Napisales 100 Bajtot czy bitow?. Czy to jest predkosc zapisywania komorki danych czy predkosc na magistarali I2C? Jezeli mozesz zapisac 100 Bajtow(liczb 0..255) pod wskazany adres to to jest dosyc przyzwoity wynik. Pewnie masz kwarc 11.059... MHz i zwykly 89c..(12 cykli zegara na instrukcje. Sproboj wymienic kwaarc na 23..... to powinno sie uzyskac ok dwa razy tyle. Wbrew pozorom wyslanie 100 Bajtow do tego typu pamieci (potrzeba dwa 8 bitowe slowa adresowe) i dodatkowo bajt danych =3 bajty a i troche czasu na rozpoczecie, potwierdzenia i zakonczenie transmisji. Do tego dodatkowo adres ukladu i wyczhodzi 4,5 Bajta na kazda komorke danych. 4.5 Bajta=36 bitow do wyslania. Ja uwazam ze to powinno wystarczyc. Oczywiscie wymiana na AVR powinna przyspieszyc cale zadanie. Napisz jeszcze jaki masz bit rate - 19200 czy wiecej?
  • #7 402122
    lukamar
    Poziom 11  
    Posty: 51
    100 bajtow, chociaz jeszcze nad tym popracowalem i jest troszke wiecej.
    to jest predkosc calej szopki zapisania bajtu.
    bit rate to rozumiem, ze chodzi co o szbkosc wysylania bitow z kompa, jest troche mniejszy chociaz on sie waha w zaleznosci od obciazenia, bo chodzi pod windows, a z nim jest roznie.
    poza tym procek 89c52
    kwarc cos ponad 10Mhz.
    chociaz juz nie mam pomyslu jak to mozna przyspieszyc, oprocz wlasnie tego kwarcu 24, bo pewnie powinno to pojsc ze dwa razy wiecej jak mowisz.

    po twojej wypowiedzi wnioskuje, ze tak moze zostac. przypuszczam, ze sie zgadzasz z tym ze zapisujac bezposrednio do pamieci da sie wiele szybciej?
  • REKLAMA
  • #8 402140
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Napisales ze masz komunikacje szeregowa z kompem? przez rs(koma). Jaka jest predkosc u ciebie 9600, 19200, 38400?
  • REKLAMA
  • #9 402156
    Nemo
    Poziom 31  
    Posty: 2078
    Pomógł: 9
    Ocena: 72
    Jeśli masz pamięć EEPROM Atmela, spróbuj zapisu pakietowego. W każdej nocie katalogowej masz wyszczególnione, jak długi jest blok. W przypadku AT24C256 to chyba 64 bajty. To znaczy : Start, ustawiasz adres bazowy w pamięci i ładujesz po kolei 64 bajty danych. Po tym wystawiasz stop i po sprawie. Czekasz od 1 - 10 ms i wio z następną 64 bajtów. Test dostępności pamięci możesz wykorzystać, wysyłając na szynę jej adres. Jeśli odpowie ACK, to jest już zapisane. Jeśli znikła, to zapisuje. W ten sposób zyskujesz niezłe przyspieszenie. No i jeszcze jedno. Przy 12MHz na kwarcu możesz napisać procedury obsługi I2C w asemblerze bez żadnych opóźnień. Atmele trzymają takie częstotliwości bez problemu, szczególnie te od AT24C32 wzwyż.
    Pozdrawiam.
  • #10 402205
    lukamar
    Poziom 11  
    Posty: 51
    komunikacje mam troche dziwnie LPT, ale to nie jest bardzo istotne,
    jesli robie transmisje powyzej 2KHz to cos sie dziwnego dzieje, i jak wnioskuje jest to zwiazane z tym, ze procesor tego nie przetrawia.
  • #11 402206
    jano2300
    Poziom 17  
    Posty: 234
    Pomógł: 2
    Ocena: 7
    Lukamar A w programatorach ,to co jest w środku ?
    Taki PiccoGal ma w środku 51-kę .Tłumaczy dodatkowo instrukcje języka Forth.Jest tak skonstruowany aby można dowolnie rozbudowywać o nowe algorytmy.Gdyby zrobić tylko programator I2C byłby jeszcze szybszy.A już Piccogal czyta pamięć 24C256 (32 kilo) niecałe 15 s.Konstruowałem kiedyś podobny wynalazek,co przy baudrate 9600 ma przybliżony czas odczytu .
  • #12 402211
    lukamar
    Poziom 11  
    Posty: 51
    ale to nie jest tak, ze procesor to slepo przerzuca do pamieci. wykonuje jeszcze pare prostych operacji, poza tym wrzuca to w rozne miejsca pamieci.
    odczyt trwa kilkanascie sekund programatorem, ale z zapisem juz nie bedzie tak latwo, bo pamiec potrzebuje chwile zeby zapisac
  • #13 402584
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Panowie!. 24c256 mozna pisac po 64 bajty, ale trzeba PAMIETAĆ,
    że adres musi byc podzielny przez 64 (BARDZO WAZNE).
    Czas zapisu 64 bajtów jest wtedy taki sam jak jednego bajtu +
    czas wpakowanie w 24c tych bajtów. Przy 100k i tak pamięc
    będzie czekała na dane z PC-ta. Gdyby co, mam wszystkie
    procedury, ale w asemblerze.
  • #14 404233
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Wcale nie musi byc podzielny. Jak mamy powiedzmy 100 bajtow do wyslania pod kolejne adresy to wysylamy adres pierwszego, potem pierwszy bajt i tak do 64 - wszystkie z potwierdzeniem, a nastepnie reset. Nastepnie adres 65 bajtu, i znowu 65, potwierdzenie,.....,99, potwierdzenie,100,potwierdzenie i reset.Dziala - pamiec zapisze te dane jak tylko albo dostanie 64 bajty albo wystapi sygnal resetu. Poczytajcie PDF tam jest wszystko napisane. Sprawdzilem w praktyce co prawda z mniejsza pamiecia ale to to samo tylko strony maja po mniej bajtow.
  • #15 417985
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Albo ja nie umiem czytac po polsku albo jest więcej niż jeden sposób zapisu.
  • #16 419178
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Czego nie rozumiesz? W dokumentacji jest wyraznie napisane ze do 64 bajtow w stronie. To do 64 wcale nie oznacza ze musisz za kazdym razem wysylac akurat 64 bajty. Oznacza to natomiast ze pamiec ma wbudowany licznik ktory przy zapisie bajtu(aktualnie gdzy wydamy komende ACK za bajtem) zwiekrzy wewnetrzny licznik i bedzie czekac na nastepny bajt. Jezeli w tym momencie damy komende i2c stop(reset) to pamiec przepisze to co do niej zapisalismy do wewnetrznej pamieci. Tak samo jezeli wyslalismy bajt z potwierdzeniem(ACK na koncu) nastepnie nastepny bajt(ale juz z NACK na koncu) to pamiec automatycznie zapisze dane(bez czekania na i2c stop(reset). Roznice sa miedzy pamieciami w ilosci wewnetrznych komorek i w wielkosci bufora(strony - ang. page).
    A z drugiej strony taka mala kostka a tyle problemu.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy protokołu komunikacji szeregowej między komputerem a mikrokontrolerem AT89C52, który zapisuje odebrane bajty do pamięci EEPROM 24C256. Uzyskana prędkość zapisu około 100 bajtów/s jest oceniana jako niska, głównie z powodu ograniczeń taktowania procesora (10 MHz) i implementacji w Bascomie. Wskazano, że standardowa magistrala I2C dla 24C256 może pracować z częstotliwością 100 kHz lub wyższą, co pozwala na znaczne przyspieszenie zapisu. Proponowano zwiększenie częstotliwości kwarcu oraz optymalizację protokołu, np. poprzez zapis pakietowy (page write) do 64 bajtów na raz, co znacznie skraca czas zapisu, pod warunkiem, że adres początkowy jest odpowiednio wyrównany. Dyskutowano także o wpływie narzutu protokołu i weryfikacji danych na szybkość transmisji oraz o ograniczeniach wynikających z czasu zapisu samej pamięci EEPROM. Wskazano, że zastosowanie asemblera lub szybszych mikrokontrolerów (np. AVR) może poprawić wydajność. Poruszono również kwestie stabilności transmisji przy wyższych prędkościach i specyfikę komunikacji przez port LPT. Podsumowując, obecna prędkość jest akceptowalna, ale możliwe jest jej zwiększenie przez optymalizację protokołu, zwiększenie taktowania i wykorzystanie zapisu pakietowego.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA