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.

[mega32][bascom] wysyłanie przez PC pliku txt

01 Wrz 2009 18:11 2651 9
  • Poziom 31  
    Witam,
    ostatnio wróciłem do zabawy z AVR i nieco się nauczyłem. Chcę mieć możliwość wysyłania przez komputer pliku txt. Zawartość tego pliku (tekst) ma być zapisana z zew eepromie 24C64. Dokładnie tak:
    Połączenie np przez terminal,
    procesor się pyta od którego Adr_eep ma zacząć zapisywanie (np. 0),
    wysyłanie pliku txt,
    procesor informuje na którym Adr_eep zakończył zapis (np. 170) i zapisuje tą daną w wewnętrznej pamięci eeprom procesora np. pod adresem 0.

    Aktualnie napisałem coś prostego co działa prawie tak jak chciałbym, ale jednak nie odbiera pliku txt, oraz nie ma możliwości kasowania ostatniego znaku.
    Code:
    $regfile = "m32def.dat"
    
    $crystal = 8000000
    $baud = 9600

    Config Sda = Portc.1
    Config Scl = Portc.0

    Dim Adres_eep As Byte
    Dim Znak As String * 1
    Dim Adr_eep As Word At &H8F
    Dim Adr_low As Byte At &H8F Overlay
    Dim Adr_hi As Byte At &H90 Overlay

    Const In_eep = 160
    Const Out_eep = 161
    Const Max_eep = 65536


    Do
       Znak = Waitkey()
       Print "Odebrano znak: " ; Znak
          I2cstart
          I2cwbyte In_eep
          I2cwbyte Adr_hi
          I2cwbyte Adr_low
          I2cwbyte Znak
          I2cstop
          Print "Adres eeprom wynosi: " ; Adr_eep
          Adr_eep = Adr_eep + 1
          Writeeeprom Adr_eep , 0
          Readeeprom Adres_eep , 0
          Print "Adres eeprom po dodaniu wynosi: " ; Adres_eep
    Loop
    End


    Proszę mnie jakoś nakierować jak coś takiego zrealizować.


    Pozdrawiam
  • Pomocny post
    Poziom 33  
    Zrobilem cos podobnego, tyle ze zapis na karcie SD. Generalnie problem jest dosc prosty, tylko musisz zrobic bufor (np cykliczny) do odbioru znakow z uarta, bo bedziesz gubic dane. Mozesz zrobic tak, ze odbierasz np 30 znakow i dopiero cala paczke zapisujesz w eepromie, w tym czasie inne znaki sa zapisywane w buforze. Dlugosc bufora musisz tak dobrac aby nie zapelnil sie caly podczas zapisu jednej paczki. Dla 9600 baudow odbior jednego chara to okolo 1ms.
  • Poziom 31  
    Myślałem nad kartą SD, ale niestety nie poradzę sobie w jej obsłudze i do tego jeszcze FAT. Fajnie by było wrzucić od razu txt na kartę, ale jak na razie to się uczę i ciężko chyba będzie to opanować.

    Mogę zrobić bufor np. 100 znaków co daje ~100ms. W tym czasie zapisze się w eeprom ok. 10 znaków (wyczytałem, że ok 10ms na znak). Daje waitms 900 i mam zapisane 100 znaków w eeprom oraz czysty bufor - dobrze kombinuje?
    Tylko wtedy jaką komendą odebrać dane, aby procesor przyjął plik txt?
  • Pomocny post
    Poziom 33  
    Jesli zapis jednego znaku do eepromu zajmuje 10ms to musisz wysylac, dane z pliku porcjami inaczej pogubisz dane. Zapis na karte byl o tyle dobry ze spokojnie moglem zapisac 512 bajtow, podczas gdy dane zapisywaly sie w buforku, czyli zapis na karte byl mniejszy niz 512ms (dobior danych).
  • Pomocny post
    Poziom 14  
    Podczas programowania warto trzymać się starych, sprawdzonych standardów. Np. Intel HEX. Ten standard ma rozwiązane już te problemy o których piszecie, np. jak wieki bufor, kedy rozpocząć zapis eepromu, adresowanie + jeszcze kontrole poprawność danych CRC.
  • Poziom 31  
    Hmm.. widzę, że terminal w bascomie ma możliwość wysyłania plików .bin i jest gotowa funkcja do odbioru bin. Chyba się tym pobawię.
  • Pomocny post
    Poziom 14  
    Te pliki *.bin możesz wysyłać tak jak każde inne pliki. Jeśli się nie mylę to plik nie podlega obróbce przez terminal (albo można tak ustawić aby tak było), po prostu wysyła przez port bajt po bajcie do portu. Czyli jeśli weźmiesz plik w formacie np. Intel hex (lub motorola) i go wyślesz do portu to procesor otrzyma gotowe komendy i wiadomo co zrobić z buforami itd. W przykładach programowania AVRów po przez bootloader jest ładnie napisany program który właśnie w ten sposób (std. motorola) programuje sam siebie. Niestety jest sampl napisany w "c" ale to tak samo działa. W ogóle sugeruje przesiąść się na "c". Może na początku trudniej ale potem daje to niemal nieograniczone możliwości.
  • Pomocny post
    Poziom 26  
    Witaj,
    Po pierwsze w Bascomie możesz zadeklarować programowy bufor USARTA w dodatku z wieloma sygnałami sterującymi Twoją ramką a po drugie pamięć EEPROM możesz zapisywać stronami bodajże po 32 bajty co oczywiście nie zmienia faktu, iż zapis strony potrwa tyle co zapis bajtu, nie mniej. Pozdrawiam... robiw
  • Poziom 31  
    Witam,
    a możecie pisać trochę jaśniej? Ja dopiero zaczynam nie nie wszystko rozumiem.
    Dlaczego jak w HyperTerminalu wybiorę opcję Wyślij plik tekstowy, to nie wysyła całości (czyli test zapisu pamieci eeprom prze rs232) tylko pierwsze 3 znaki, a 4 jakiś dziwny?
    [mega32][bascom] wysyłanie przez PC pliku txt
    Code:
    $regfile = "m32def.dat"
    
    $crystal = 8000000
    $baud = 9600

    Config Sda = Portc.1
    Config Scl = Portc.0

    Dim Adres_eep As Byte
    Dim Znak As String * 1
    Dim Adr_eep As Word At &H8F
    Dim Adr_low As Byte At &H8F Overlay
    Dim Adr_hi As Byte At &H90 Overlay

    Const In_eep = 160
    Const Out_eep = 161
    Const Max_eep = 65536


    Do
       Znak = Waitkey()
       Print "Odebrano znak: " ; Znak
          I2cstart
          I2cwbyte In_eep
          I2cwbyte Adr_hi
          I2cwbyte Adr_low
          I2cwbyte Znak
          I2cstop
          Print "Adres eeprom wynosi: " ; Adr_eep
          Adr_eep = Adr_eep + 1
          Writeeeprom Adr_eep , 0
          Readeeprom Adres_eep , 0
          Print "Adres eeprom po dodaniu wynosi: " ; Adres_eep
          Waitms 10
    Loop
    End


    Nie ukrywam, że chętnie podpatrzył bym jakieś gotowe rozwiązania.
  • Poziom 14  
    Nie pisałem w bascomie tylko w "c" ale na mój gust to dalej są jakieś problemy z komunikacją.
    Gdy procesor zapisuje bajt w EEpromie a w tym czasie przyjdzie po RS232 dana jak się zachowa. Czy to zbuforuje (ile jest wstanie zbuforować)? Trzeba to sprawdzić.
    Przydało by się na 100% wykluczyć problemy z komunikacją.
    Zrób jakąś procedurę testową typu z PC wysyłam 32bajty a on to łyka i potem po skompletowaniu odsyła tobie dokładnie to samo. Przeważnie jak są problemy z komunikacją sypią się dane nie na początku transmisji tylko dalej. Potem zabrać się za programowanie EEProma. Nie ma wyjścia. Drogą eliminacji aż do skutku.