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

Nie działa zapisywanie danych do EEPROM a następnie wyświetlanie ich

Bartoneczek 10 Paź 2011 17:27 1193 5
REKLAMA
  • #1 10012800
    Bartoneczek
    Poziom 10  
    Witam,

    Mam problem. Próbuję wysyłać pojedyncze bajty (konkretnie 32) z komputera do mikrokontrolera, zapisać je w pamięci EEPROM i wyświetlić na wyświetlaczu. Próbuję to zrealizować w ten sposób:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    (Wkleiłem najistotniejszą część programu.)

    Niestety coś jest nie tak. Po wysłaniu tablicy bajtów wyświetlacz jest pusty a po kilkunastokrotnym wysyłaniu pojawiają się jakieś krzaki. USART jest napewno dobrze skonfigurowany. Problemu szukałem w kodzie wywołanego przerwania i w samej funkcji wyświetlania ale wydaje mi się że wszystko jest ok. Czy dobrze obsługuję wysłaną tablicę bajtów? W sensie, czy każdy nadchodzący bajt to osobne przerwanie, czy może powinienem umieścić kod przerwania w pętli?
  • REKLAMA
  • #2 10015538
    Andrzej__S
    Poziom 28  
    Przerwanie "Receive Complete" jest generowane po odebraniu każdego pojedynczego bajtu danych, czyli nawet dla dosyć niskiego transferu 9600bps co ok. 1ms. Zapis do EEPROM trwa ok. 8,5ms, więc policz sobie, ile bajtów "zgubi" USART, zanim skończy się Twoja obsługa przerwania. Podstawowy błąd masz w założeniach. Dane z USART należy odbierać do bufora w pamięci RAM (wtedy obsługa przerwania jest wystarczająco krótka), a dopiero później wykonywać operacje na danych z bufora, czyli np. zapisywać je do pamięci EEPROM.
    Pomijam inne błędy, które być może wynikają z nieprawidłowego kopiowania i/lub złego wyboru fragmentów programu.
  • REKLAMA
  • #3 10015963
    Bartoneczek
    Poziom 10  
    Dzięki za odpowiedź. Czy dysponujesz jakimiś materiałami bądź przykładami odnośnie tego w jaki sposób mam wykorzystać pamięć RAM jako bufor? Czy pamięć RAM ma wydzielony obszar dla buforu czy mam korzystać z rejestrów roboczych, a może ze stosu? Trochę nie mam pomysłu jak miałoby to wyglądać. ;)
  • REKLAMA
  • #4 10016457
    Andrzej__S
    Poziom 28  
    Bartoneczek napisał:

    Czy dysponujesz jakimiś materiałami bądź przykładami odnośnie tego w jaki sposób mam wykorzystać pamięć RAM jako bufor?

    Każdy kto ma komputer z dostępem do internetu dysponuje materiałami. Wystarczy trochę inwencji i dobra wyszukiwarka.

    Mogę jedynie podpowiedzieć, o czym poczytać:
    1) Dyrektywy .DSEG i .BYTE do definiowania zmiennych w pamięci RAM.
    2) Instrukcje AVR ASM takie jak: STS ST LDS LD do zapisywania i odczytywania danych z pamięci RAM.
    3) Rejestry wskaźnikowe X Y Z (pary rejestrów, które mogą być użyte jako wskaźniki do pamięci RAM).
  • REKLAMA
  • #5 10016666
    Bartoneczek
    Poziom 10  
    Właśnie o takie wskazówki mi chodziło. Dzięki!
  • #6 10019395
    Bartoneczek
    Poziom 10  
    Odświeżam temat bo wracam z nowym problemem. ;)

    Program 1:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Program 2:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Co jest nie tak?
    Po zaprogramowaniu MCU programem 2, po podłączeniu zasilania widzę na ekranie krzaki i MCU nie reaguje na otrzymywane dane. Po zaprogramowaniu programem 1 (który różni się dwoma, trzema mało istotnymi linijkami) a następnie programem 2 wszystko jest ok. Niestety po odłączeniu zasilania znów pojawiają się krzaki i muszę powtarzać procedurę programowania programem 2, 1, 2. Skąd biorą się te krzaki, o co chodzi?

    EDIT: Problem rozwiązany, komórka RAMEND zwyczajnie nie była pusta po podłączeniu zasilania. Problem rozwiązało jej wyczyszczenie na początku programu.
REKLAMA