Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Program do konwersji z 8bit na 16bit .....

Senshu 26 Kwi 2005 15:45 1700 10
  • #1 26 Kwi 2005 15:45
    Senshu
    Poziom 12  

    Mam pytanie, czy jest program do konwersji pliku na 16 bit ? chcę nagrać plik 1MB na 2ie kostki 29F040 czyli 0,5MB 8 bitowe połączone ze sobą tak, że tworzą jedną 1MB 16 bit. W załączniku jest schemat takiego podłączenia.

  • #2 26 Kwi 2005 19:43
    LordBlick
    VIP Zasłużony dla elektroda

    Koniecznie potrzebujesz 16 linii danych ? Algorytm programu jest prosty : kopiujesz jeden plik na dwa pliki, z tym, że nieparzyste bajty trafiają do jednego pliku a parzyste do drugiego. W WinAPI wystarczą funkcje : OpenFile, ReadFile, Write File i CloseHandle. Przykładowy tutorial do kopiowania plików powinien się zawieruszyć w dowolnym języku programowania. Osobiście używam masm32, gdzie przy rezygnacji z obsługi okien można łatwo i szybko napisać taki prosty programik. Jak do tej pory nie spotkałem się z tego typu gotowcem, przeważnie jak łączy się dwie pamięci o szerokości danych 8bit to dalej jest 8bit, tyle, że jest jej dwa razy więcej.

  • #3 27 Kwi 2005 07:19
    Senshu
    Poziom 12  

    No ja wiem, że na jednego nagrywam parzyste, a na drugiego nieparzyste bajy. Tyle tylko, że szukam programu który mi to ułatwi, bo nie znam sie na programowaniu i samemu nie napisze takiego programiku.

  • #4 27 Kwi 2005 07:55
    jiwaniuk
    Poziom 30  

    Senshu
    Fizycznie jest to nie wykonalne. Dwie kości 0,5MB 8-bitowe mogą dać Ci 1MB pamięci 8-bitowej lub 0,5MB pamięci 16-bitowej.

    Pozdrawiam wszystkich

    jjanek

  • #5 27 Kwi 2005 11:14
    LordBlick
    VIP Zasłużony dla elektroda

    jiwaniuk napisał:
    Fizycznie jest to nie wykonalne. Dwie kości 0,5MB 8-bitowe mogą dać Ci 1MB pamięci 8-bitowej lub 0,5MB pamięci 16-bitowej.
    <Voice source=underground volume=max mode=information>
    Jednostką podstawową wielkości pamięci jest bajt(8bit), co najwyżej może być mowa o 0,5M słów 16-bit.
    </Voice>
    Tak więc to nadal będzie razem 1MB. Pierwszy z brzegu przykład - przyjrzyj się pamięci Flash w mikrokontrolerach AVR.

  • #6 27 Kwi 2005 11:41
    Sam Sung
    Poziom 30  

    Program w ANSI C (można kompilować w bele czym pod lin/dos/win dla konsoli)

    #include <stdio.h>

    int main(void)
    {
    FILE *f = fopen("zrodlo.bin", "rb");
    FILE *f1 = fopen("plik1.bin", "wb");
    FILE *f2 = fopen("plik2.bin", "wb");
    int c;
    while (!feof(f))
    {
    putc(getc(f), f1);
    putc(getc(f), f2);
    }
    fclose(f1);
    fclose(f2);
    fclose(f);
    return 0;
    }

    Powinno zadziałać :)

  • Pomocny post
    #7 27 Kwi 2005 17:22
    LordBlick
    VIP Zasłużony dla elektroda

    No to program wysmażony... ;)
    Pracuje w linii poleceń Win32 (okno DOS, linia poleceń Total Commandera itp.)
    Wywołanie :
    ParityByteSplitter [parametry]
    Parametry wiersza poleceń :
    (wielkości liter ważne po znaku minusa, oddzielone spacją, nazwy plików zawierające spacje należy ująć w cudzysłów ["])

    Code:
    -q
    - Tryb cichy - zgłasza tylko błędy. Bez tego argumentu wyskakuje okno informujące o przeprowadzonej operacji, zawierające również nazwy zapisanych i odczytanych plików
    Code:
    -i "plik_wej.bin"
    - Nazwa pliku wejściowego - jeżeli pominiemy, szuka pliku 'Input.bin' w bierzącym katalogu.
    Code:
    -o "plik_wyj.odd.bin"
    - Nazwa pliku wyjściowego z nieparzystymi bajtami
    Code:
    -e "plik_wyj.evn.bin"
    - Nazwa pliku wyjściowego z parzystymi bajtami
    Jeżeli nazwy plików wyjściowych pominiemy, tworzy nazwy plików od nazwy pliku wejściowego, doczepiając .odd.bin dla nieparzystych bajtów i .evn.bin dla parzystych. Jeżeli pominiemy nazwę pliku wejściowego i danego wyjściowego to ten ostatni będzie się nazywać Output.xxx.bin'
    Wszelkie uwagi odnośnie problemów z programem proszę kierować na PW.
    Dla zainteresowanych kod procedury przetwarzającej pliki :
    (kopiowanie odbywa się blokowo po 512+512 bajtów, szybciej idzie niż czytanie po 1 bajcie z dysku i zapis 1 bajtu na dysk, chyba, że system operacyjny i tak bedzie buforował własną drogą operacje zapisu i odczytu)
    Code:
    BuildFiles PROTO :HWND
    
    BuildFiles proc hWnd:HWND
       LOCAL hFileIn:HANDLE
       LOCAL FileSizeInLo:DWORD
       LOCAL FileSizeInHi:DWORD
       LOCAL hFileOdd:HANDLE
       LOCAL FileSizeOddLo:DWORD
       LOCAL FileSizeOddHi:DWORD
       LOCAL hFileEvn:HANDLE
       LOCAL FileSizeEvnLo:DWORD
       LOCAL FileSizeEvnHi:DWORD
       LOCAL BytesReaded:DWORD
       LOCAL BytesOdd:DWORD
       LOCAL BytesEvn:DWORD
       LOCAL BytesWritten:DWORD
       invoke ReadOpenFile, ADDR BuffFileNameIn, ADDR FileSizeInLo, ADDR FileSizeInHi
       mov hFileIn, eax
       .if eax == INVALID_HANDLE_VALUE
          invoke wsprintf, ADDR BuffTmp, ADDR TxtEnNoFileIn, ADDR BuffFileNameIn




          invoke MessageBox, NULL, ADDR BuffTmp, ADDR TxtEnError, MB_OK or MB_ICONEXCLAMATION or MB_TOPMOST
          ret
       .endif
       invoke WriteOpenFile, ADDR BuffFileNameOdd, ADDR FileSizeOddLo, ADDR FileSizeOddHi, TRUE
       mov hFileOdd, eax
       .if eax == INVALID_HANDLE_VALUE
          invoke wsprintf, ADDR BuffTmp, ADDR TxtEnNoFileOut, ADDR BuffFileNameOdd
          invoke MessageBox, hWnd, ADDR BuffTmp, ADDR TxtEnError, MB_OK or MB_ICONEXCLAMATION or MB_TOPMOST
          invoke CloseHandle, hFileIn
          ret
       .endif
       invoke WriteOpenFile, ADDR BuffFileNameEvn, ADDR FileSizeEvnLo, ADDR FileSizeEvnHi, TRUE
       mov hFileEvn, eax
       .if eax == INVALID_HANDLE_VALUE
          invoke wsprintf, ADDR BuffTmp, ADDR TxtEnNoFileOut, ADDR BuffFileNameEvn
          invoke MessageBox, hWnd, ADDR BuffTmp, ADDR TxtEnError, MB_OK or MB_ICONEXCLAMATION or MB_TOPMOST
          invoke CloseHandle, hFileOdd
          invoke CloseHandle, hFileEvn
          ret
       .endif
       .repeat
          invoke ReadFile, hFileIn, ADDR BuffTmp, sizeof BuffTmp, ADDR BytesReaded, NULL
          mov edx, BytesReaded
          or edx, edx
          jz BuffsEnd
          inc edx
          mov ecx, 1
          lea esi, BuffTmp
          lea edi, BuffOdd
          lea ebx, BuffEvn
          mov BytesOdd, 0
          mov BytesEvn, 0
          .repeat

             lodsb
             test ecx, 1 ; Odd Test
             jz EvenFileBuff
             inc BytesOdd
             stosb
             jmp NextFileBuff
    EvenFileBuff:
             mov [ebx], al
             inc BytesEvn
             inc ebx
    NextFileBuff:
             inc ecx
          .until ecx == edx
          invoke WriteFile, hFileOdd, ADDR BuffOdd, BytesOdd, ADDR BytesWritten, NULL
          mov eax, BytesWritten
          add FileSizeOddLo, eax
          adc FileSizeOddHi, 0
          invoke WriteFile, hFileEvn, ADDR BuffEvn, BytesEvn, ADDR BytesWritten, NULL
          mov eax, BytesWritten
          add FileSizeEvnLo, eax
          adc FileSizeEvnHi, 0
       .until BytesReaded < sizeof BuffTmp
    BuffsEnd:
       .if bQuietOK != TRUE
          invoke wsprintf, ADDR BuffTmp, ADDR TxtEnBuildingOk, ADDR BuffFileNameIn, ADDR BuffFileNameOdd, ADDR BuffFileNameEvn
          invoke MessageBox, hWnd, ADDR BuffTmp, ADDR TxtEnSucces, MB_OK or MB_ICONINFORMATION or MB_TOPMOST
       .endif
       invoke CloseHandle, hFileIn
       invoke CloseHandle, hFileOdd
       invoke CloseHandle, hFileEvn
       ret
    BuildFiles endp

    Update 28.04.2005 2:40 - Drobne usprawnienia i poprawki kosmetyczne.
    Update 28.04.2005 16:30 - Poprawiono 2 błędy w obsłudze nazw plików. "Kosmetyka" komunikatu raportu.
    Pozdrawiam, Daniel

  • #8 28 Kwi 2005 07:44
    Senshu
    Poziom 12  

    OK dzięki...nigdy bym tego sam nie zrobił ! a program baaardzo sie przyda (tzn musze jeszcze przetestować) ! Nie no....nie mam pytań....program WYMIATA ! działa idealnie....

  • #9 28 Kwi 2005 13:19
    Sam Sung
    Poziom 30  

    Light'­­­­I napisał:
    No to program wysmażony... ;)
    kopiowanie odbywa się blokowo, szybciej idzie niż czytanie po 1 bajcie z dysku i zapis 1 bajtu na dysk. ):


    Tyle rzeźbienia a efekt taki sam jak 16-linijkowca w C :P (buforowanie też jest)

  • #10 28 Kwi 2005 15:22
    LordBlick
    VIP Zasłużony dla elektroda

    Sam Sung napisał:
    Tyle rzeźbienia a efekt taki sam jak 16-linijkowca w C :P (buforowanie też jest)
    Nie zauważyłem niczego w twoim kodzie w stylu malloc() i free(). Twój kod jak najbardziej służy swojemu zadaniu, po prostu sobie postawiłem wyzwanie, aby napisać program, który wykona je szybko i bedzie w miare przejrzysty dla użytkownika + obsługa błędów (np. zapobiegam ciekawym wyskakującym komunikatom typu "Program wykonał nieprawidłową operację/zawiesił system z powodu znudzenia/pomyłki użytkownika"... ;)), linii poleceń, więc proszę nie porównuj do 16 linijek kodu w C, bo jakby miało być tyle funkcji, co jest w moim programie, to byłoby tych linijek więcej... ;) Wybrałem asembler, bo lubię i już. Bufor wejściowy ma 1KB, wyjściowe po 512B, możnaby jeszcze pobawić się ich wartościami, ale bez przesady. Jak koniecznie masz ochotę na test to weź plik 120MB i stoperek do ręki, skompiluj swoje i czas start.
    To nie jest rzeźbienie, tylko : kopiuj, wklej, trochę zmień, wykorzystałem to co stworzyłem do tej pory, a niejeden programik mam na koncie.
    Pozdrawiam, Daniel

  • #11 05 Mar 2006 19:13
    darekpra
    Poziom 11  

    A jak zrobić to samo tylko w drugą stronę:?:

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME