PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenwort über serielle Schnittstelle einlesen und in EEPROM



popi
06.01.2006, 15:35
Hallo zusammen,

ich habe ein Problem und bin mir nicht so recht sicher, wie man das lösen kann. Möglicherweise könnt ihr mir ein paar Tips geben.

Ich habe ein Programm geschrieben, welches ein "Datenwort" über die serielle Schnittstelle ausgeben soll. Datenwort habe ich in Anführungszeichen geschrieben, da es in wirklichkeit ein Stringwort ist, welches jedoch aus Einzen und Nullern besteht. Also "001100101010...."

Nun will ich dieses (nicht staunen) 8000 "Bit" lange Datenwort in den Controller bekommen (mega64) und zwar immer in 8er Päckchen.
Der String soll also jeweils in einzelne Bytes aufgeteilt werden. Jedes Byte soll in eine Adresse des EEPROMS gespeichert werden.

Wenn als das String-"Datenwort" wie folgt anfängt: "00011101010101010101010..."

dann soll in Adresse 00h folgendes stehen: 00011101
In Adresse 01h dann: 01010101
usw.

Die Frage ist nun, wie verbinde ich den Mega64 mit der seriellen Schnittstelle und vor allem, wie werte ich nun diesen langen String aus und teile ihn jeweils auf 8-Bit pro Adresse auf ?

Es wäre nett, wenn ihr vielleicht einen Code hättet, der sowas macht, also einen 8000 langen Zeichenstring bestehend aus 1 und 0 in jeweils 8-Bit pro Adresse aufteilt.

Ich hoffe, ihr habt verstanden um was es geht und könnt mir damit helfen.

Danke schon mal im voraus.

Grüße

popi

ruediw
06.01.2006, 17:22
Salü popi,

was für eine Schaltung hast Du ?
Willst Du die Daten ins interne EEPROM oder in ein externes
EEPROM schreiben ?
Ist das dein erstes Programm ?
Willst Du es in C schreiben ?
Was willst Du genau erreichen ?
Was für kenntnisse in C hast Du ?
Könntest Du mal dein Programm hier posten ?

MfG
Ruediw

askazo
06.01.2006, 17:43
Das ist gar nicht so schwer.
Da Du sowieso jedes Zeichen einzeln empfängst und im Empfangs-Interrupt auswerten musst, brauchst Du nur in einer statischen Variable mitzuzählen, wie viele Zeichen schon angekommen sind.

Ich könnte mir die Interrupt-Routine in etwa so vorstellen:



signal (SIG_UART0_RECV)
{
static unsigned char count, Data;
unsigned char DataIn;


DataIn = UDR0;

if (count > 7)
{
SaveToEeprom(Data);
count = 0;
Data = 0;
}

if(DataIn == "1")
Data |= 1 << (7-count);

count++;
}

Gruß,
askazo

PicNick
06.01.2006, 18:04
Man soll einem Kollgen nix dreinreden, aber so bleibt dir das letzte Byte irgendwie über. Vorschlag: vorher zählen


DataIn = UDR0 & 0x01; // der rest ist schrott
count++;
if (count > 7)
{
SaveToEeprom(Data);
count = 0;
Data = 0;
}
Data <<=1;
Data |= DataIn;
}

askazo
06.01.2006, 19:08
Nein, da bleibt keins übrig. count läuft von 0 bis 7, also 8 Schritte... Kannst gerne noch mal durchrechnen :)

Aber

DataIn = UDR0 & 0x01; // der rest ist schrott
ist Blödsinn. Er will Ascii-Zeichen einlesen, und da braucht man das ganze Byte, nicht nur ein Bit...

askazo

PicNick
06.01.2006, 19:19
Lies dir den Wunsch vom Popi nochmal durch, der will Bytes mit 8 Bit draus machen. Msb to lsb. Und von 0x30 und 0x31 ist daher nur der 2^^0 interessant.
Übrigbleiben: Da, dann probier mal. 8 x 0/1 kommt rein--> nu ?

Ich brauch aber nix reden, mir wär es auch übrig geblieben
Also, ein Neues


DataIn = UDR0 & 0x01; // der rest ist schrott
Data <<=1;
Data |= DataIn;
count++;
if (count > 7)
{
SaveToEeprom(Data);
count = 0;
Data = 0;
}
}

askazo
06.01.2006, 19:44
Ich gebe mich geschlagen, Du hast in beiden Fällen Recht...
Über die Ascii-Werte von 0 und 1 hatte ich nicht nachgedacht. Ist eine elegante Lösung, sich die eine if-Abfrage zu sparen.

Und wenn man wie ich die if (count > 7) Abfrage an den Anfang stellt, geht tatsächlich das letzte von den 1000 Bytes verloren.

Ist mir jetzt aber peinlich, das zuzugeben... ;)

askazo

PicNick
07.01.2006, 10:55
@askazo: Ich bitte dich, tu' dir nix an. :-) Was glaubst du, was ich in den Jahren schon für Unfug erzählt habe :oops: