UART -> Atmega8 -> EEprom I2C

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
LEEON
-
Posty: 1
Rejestracja: 17 wrz 2007, 15:50
Lokalizacja: stalowa wola

UART -> Atmega8 -> EEprom I2C

Post autor: LEEON » 17 wrz 2007, 15:56

Witam piszę z prśbą o pomoc w realizacji programu do tranfmisji tekstu za pomocą UART (z pc) do Atmegi8 ktora wysle odebrany tekst do -> eepromu I2C (kazdy bajt w kolejnej komórce)
Problem jest o tyle skomplikowany poniewaz tekst bedzie miał długość w porywach do 5 000 bajtów, a podobno na Uarcie występują zakłócenia.

Podczas rozmowy z userem Jdsul otrzymalem nastepujące informacje:
Cześć
Z RS-232 jest taka zabawa że czasem
możesz odebrać coś czego nie chcesz odebrać.

A to pojawi się jakaś szpilka lub zmiana stanu a to zamiast "2" nadanej "3".
Dobrze się przed tym zabezpieczyć.

Najlepszym sposobem jest albo praca z "sztywną ramką", tzn
Dajesz jakiś znak startu i jakiś znak stopu np.: $ to będzie znak startu,
^ to będzie znak końca i teraz możesz na sztywno ustalić ilość danych pomiędzy tymi znakami;

Przykład
Ranka ma znak startu i końca i 12 znaków w środku
$Ala_ma_kota.^

Teraz robisz dwie pętle pierwsza oczekuje na pojawienie się znaku '$'
Druga czyta znaki do jakiegoś bufora aż doczeka się znaku '^' bufor musi mieć swój licznik
który wzrasta o 1 po każdym odczycie znaku. Na koniec sprawdzasz czy licznik wynosi 12 jeśli tak to możesz traktować
dane jako poprawne i przepisać je do pamięci EEPROM bajt po bajcie. Jeśli liczba znaków jest mniejsza lub większa od 12 to masz
jakiś błąd transmisji i proponuję skasować buffor i dalej czekać na poprawny pakiet danych.

Oczywiście jest to najprostszy protokolik, możesz jeszcze dla pewności dodać procedurę liczenia sumy kontrolnej, lub wskaźnika parzystości bitów itd.
Metod analizy poprawności zawartości ramki jest mnóstwo poczytaj o CRC :) Problem jest tylko taki że wtedy to samo musisz policzyć na PC a na razie
będziemy się tylko bawić z terminalem więc lepiej zrób protokół ze stałą ramką.

while

Dim Odebrany, Licznik1, Licznik2 As Byte
Dim Odebr_znak As String * 12

while not Odebrany = '$' do ' Oczekiwanie na
begin
Input "Odbiór_danych" , Odebrany

loop

Licznik1 = 0;

while not {Odebrany='^'} do

Input "Odbiór_danych" , Odebrany
Licznik1 = Licznik1+1;
Odebr_znak[Licznik1] = Odebrany
LOOP

if (Licznik1 = 12) then
Adres_write = 1;
for licznik2 = 0 to 12 do
Begin
I2cstart 'Startzapisu.
I2cwbyte Adres_write 'Wyślij pod adres Adres_write.
I2cwbyte 1 'Zapisz pod numerem 1 (może być inny).
I2cwbyte Odebr_znak[Licznik2] 'Wyślij zawartość zmiennej Odebr_znak o indeksie Licznik2
I2cstop 'Zatrzymaj zapis.
Adres_write = Adres_write+1
end
else ' czyli ramka inna niż 12 znaków wtedy
exit ' wyskocz i wróć do procedury oczekiwania na znak '$'
end
' Czy jakoś tak :)


Posprawdzaj składnie, bo ja raczej w C piszę :) :) :)
Acha dobrze byłoby jakość przemyśleć co ma uruchamiać procedurę czytania znaków z RS a co kończyć może jakiś
dodatkowy klawisz lub coś. Bo te pętle mogą czekać na znak latami :) :):) przemyśl to :)

Darek.
Jestem początkujący w uC i nie bardzo umiem to wszystko ogarnąć i scalić w kod ;/

proszę o pomoc

zamieszczam jeszcze schemat układu:
(sw1) włącza oczekiwanie na odbiór danych oraz włącza i wyłącza zasilanie max232)
Obrazek

[ Dodano: 2007-09-19, 21:17 ]
witam ponownie... czy na prawdę nikt nie jest w stanie mi pomóc ...? ten problem jest dla mnie priorytetowy ...

ODPOWIEDZ