Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

ATMEGA32/644p problem z UART i SPI

SimKom
-
-
Posty: 20
Rejestracja: 23 mar 2003, o 02:20
Lokalizacja: okolice Gdańska

ATMEGA32/644p problem z UART i SPI

Postautor: SimKom » 19 lut 2010, o 09:31

Witam,

Walcze i walcze i nie moge poradzic sobie z problemem. :625:
Mam pamiec AT45DB321. Na atmedze 32 dziala ladnie, jak włoże 644p i przekompiluje to nie ma kumunikacji ? To perwszy problem.

Drugi jest taki że wysyłam po uarcie paczki danych po 179bajtów. Tak wygląda podprogram. Oczywiscie pomnialem deklaracje zmiennych , zezwolenia na przerwania. Przedstawilem to co najbardziej istotne i gdzie proc wie wywala

konfiguracja UARTA
**********************
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 200

podprogram
***************************************

Kod: Zaznacz cały

Print "START FLASH ERASING" Call Erase_flash() Timeout = 0 Do Wait 1 Flaga_kasowania = Flash_status() Incr Timeout Loop Until Flaga_kasowania = &H80 Or Timeout = 60 If Flaga_kasowania = &H80 Then Print "FLASH ERASING OK" Numer_strony = 1 Reset Bluetooth_led Do Do Znak_rx = Waitkey() Loop Until Znak_rx = &H3E Flash_part = Waitkey() Crc1 = Waitkey() Crc = 0 Select Case Flash_part Case 1: Index_bajtu_bufor = 0 Do If Ischarwaiting() = 1 Then Znak_rx = Waitkey() Incr Index_bajtu_bufor Bufor_flash(index_bajtu_bufor) = Znak_rx Crc = Crc Xor Znak_rx Else Waitms 100 End If Loop Until Index_bajtu_bufor = 176 Case 2: Index_bajtu_bufor = 176 Do If Ischarwaiting() = 1 Then Znak_rx = Waitkey() Incr Index_bajtu_bufor Bufor_flash(index_bajtu_bufor) = Znak_rx Crc = Crc Xor Znak_rx Else Waitms 100 End If Loop Until Index_bajtu_bufor = 352 Case 3: Index_bajtu_bufor = 352 Do If Ischarwaiting() = 1 Then Znak_rx = Waitkey() Incr Index_bajtu_bufor Bufor_flash(index_bajtu_bufor) = Znak_rx Crc = Crc Xor Znak_rx Else Waitms 100 End If Loop Until Index_bajtu_bufor = 528 End Select If Flash_part >= 1 And Flash_part <= 3 Then If Crc = Crc1 Then Print Str(flash_part); Print "CRC OK" If Flash_part = 3 Then Incr Numer_strony End If Else Print Str(flash_part); Print "CRC ERROR" End If Else Print "TOTAL ERROR" End If Loop Until Numer_strony = 3 Else Print "FLASH ERASING ERROR" End If
**********************************************

Problem jest taki że w pętlach do-loop procek się najczęściej sam resetuje. Jak już coś wyśle to wiekszosci przypadkow otrzymuje 1CRC ERROR a czasem nie odbierze nawet 176bajtów i pracuje caly czas w pętli. Nie wiem dlaczego znaki maga byc gubione, przecież bufor seriala juest duzo wiekszy niz paczki danych. Dodałem opuznienia w petlach ---> Waitms 100 ale i tak wgrywa może do 10 strony i wisi a po jakims czasie znowu reset. Juz naprawde nie wiem w czym tkwi problem. Wydaje się ze jest OK, dlaczego wiec raz wgra do 5 strony, raz do 10 a raz już wisi od samego poczatku. . Druga sprawa to to SPI, ciekaw jestem dlaczego na ATMEGA32 dziala a na ATMEGA644p juz nie. Proszę o pomoc

    Awatar użytkownika
    pikczu
    -
    -
    Posty: 89
    Rejestracja: 5 paź 2003, o 19:55
    Lokalizacja: Dublin
    Kontaktowanie:

    Postautor: pikczu » 19 lut 2010, o 19:13

    Witam
    Dużą pomocą były by komentarze.
    Druga sprawa za dużo tych do loopów
    dlatego procek Ci się wiesz abo odkładasz sporo na stos i stos się przepełnia.
    Opanuj transmisję np 8 byteów a dopiero potem 179.
    Podziel to na części i najpierw rozwiąż problem z transmisją przez uart a potem zajmij się SPI

    Mogę pomóc z Uartem ale o SPI nie mam pojęcia jeszcze nigdy tego nie używałem.

    Użyj inputbin i zmiennej tablicowej i zapisz wszystkie 179 do tablicy.

    Kod: Zaznacz cały

    Serial_flag = Ischarwaiting() If Serial_flag = 1 Then Inputbin Serial_rx(1) , 1 End If

    SimKom
    -
    -
    Posty: 20
    Rejestracja: 23 mar 2003, o 02:20
    Lokalizacja: okolice Gdańska

    Postautor: SimKom » 23 lut 2010, o 10:58

    Dzięki za odpowiedź.
    Z tym stosem to jakaś masakra jest. 2-3 petle i już się wywala.
    Nawet oryginalny bootloader z Bascoma wywala się na ATMEGA644p.
    Przesiadłem się na ATMEGA128 i wszystko śmiga cacy :) Cenowo nawet wychodzi dużo taniej niż 644p

    Awatar użytkownika
    r-mik
    -
    -
    Posty: 351
    Rejestracja: 14 cze 2005, o 19:18
    Lokalizacja: Wawa
    Kontaktowanie:

    Postautor: r-mik » 24 lut 2010, o 07:02

    (...)
    Z tym stosem to jakaś masakra jest. 2-3 petle i już się wywala.
    Nawet oryginalny bootloader z Bascoma wywala się na ATMEGA644p.
    Przesiadłem się na ATMEGA128 i wszystko śmiga ca(...)
    W C nie ma takich problemów. Widać wyraźnie, że problemy są związane z niedoróbą Bascoma.

    Awatar użytkownika
    pajaczek
    Moderator
    Moderator
    Posty: 2650
    Rejestracja: 24 sty 2005, o 00:39
    Lokalizacja: Winny gród

    Postautor: pajaczek » 24 lut 2010, o 12:21

    Zwłaszcza, że o ile się nie mylę, to te procki mają tyle samo ramu, więc skąd miały by się brać akurat takie problemy przy M644?
    Może spróbuj pobawić się ustawieniami stosu dla M644??

    SimKom
    -
    -
    Posty: 20
    Rejestracja: 23 mar 2003, o 02:20
    Lokalizacja: okolice Gdańska

    Postautor: SimKom » 26 lut 2010, o 10:41

    (...)
    Z tym stosem to jakaś masakra jest. 2-3 petle i już się wywala.
    Nawet oryginalny bootloader z Bascoma wywala się na ATMEGA644p.
    Przesiadłem się na ATMEGA128 i wszystko śmiga ca(...)
    W C nie ma takich problemów. Widać wyraźnie, że problemy są związane z niedoróbą Bascoma.
    Tutaj kolega nie ma racji. Bascom nie ma chyba nic do tego, choć początkowo tez tak myślałem -> http://www.elektroda.pl/rtvforum/topic1536547.html

    Ustawienia stosu zmieniałem nawet do 200 i bez zmian.

    Poza tym to nie chyba do końca wina petli tylko samego USART.
    Mój projekt jest dość obszerny, jest kilkanaście pętli do-loop , for-next i wszystko działa ładnie na ATMEGA644p do momentu komunikacji po RS232.

    Skoro tu już pisze to wspomnę jeszcze o ostatnim problemie. ATMEGA128, zasilacz impulsowy meanweel 5V 30A (ale to nieważne). Ostatnio właczyłem układ - wszystko działało, wyłączyłem zasilanie AC i załączyłem powtórnie no i procek nie jest już wykrywany :-( Dobre zasilacze impulsowe są napewno zabezpieczone przez przepięciami a meanweela za taki tez uważam. Wymienie dzisiaj procka na nowy i dam transila. Mam nadzieję że to pomoże. Czy ktoś z Was miał podobne problemy uszkodzenia procesora przez zasilanie ?

    Awatar użytkownika
    j_bravo
    -
    -
    Posty: 189
    Rejestracja: 14 wrz 2005, o 16:30
    Lokalizacja: Lublin
    Kontaktowanie:

    Postautor: j_bravo » 26 lut 2010, o 12:25

    Tak. Dlatego dobrze jest wpisać w zasilanie diodę zenera albo transil.

    Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

    Kto jest online

    Użytkownicy przeglądający to forum: Bing [Bot] i 26 gości