Hallo kann mir jemand sagen wie ich ein bit folge von 00010100 00101101
01000110 in ein Registe schreiben kann so das dann in dem Register steht
z.B. r11 0b00010100 im nächsten dann r12 0d00101101 und dann r13
0b01000110.
000101000010110101000110 So kommen die Daten auf PORTC 0 also auf dem
Pin C0 eines atmega16
Bitte in C und für ein Anfänger ich bin noch nicht so gut in C.
Wenn Du in C arbeitest, dann musst Du nicht direkt in CPU-Register
schreiben. Das passiert mit Variabeln.
Achtung, den Code hab ich nicht getestet und "PortC" muss noch mit der
richtigen Bezeichnung (Controllerabhängig) ersetzt werden. Aber im
Prinzip sollte es so funktionieren.
Die Bitfolgen könntest Du in ein Array speichern:
1
unsignedcharMeinArray[3]=={0x14,0x2D,0x4D};
Die einzelnen Bits könntest Du dann in zwei ineinander verschachtelten
Schleifen ausgeben:
1
unsignedcharArrayIndex;
2
unsignedcharBitIndex;
3
4
for(ArrayIndex=0;ArrayIndex<3;ArrayIndex++)
5
{
6
for(BitIndex=0;BitIndex<8;BitIndex++)
7
{
8
// Zu sendendes Bit ausmaskieren und prüfen ob es gesetzt ist
>00010100 00101101 01000110>So kommen die Daten auf PORTC 0 also auf dem Pin C0 eines atmega16
Wenn du das schon weißt, wieso schreibst du die dann nicht einfach in
Konstanten? Das wären 0x14 0x2d 0x46...
Mal angenommen, du würdest die ganze Hausaufgabe hier posten, dann
wüssten wir etwas über die Frequenz (Baudrate), ob es evtl. noch einen
Takt dazu gibt, wie man Anfang und Ende erkennen kann, mit welchem
Compiler das erledigt werden soll...
Mal angenommen es wäre keine Hausaufgabe, dann sind diese Angaben
trotzdem interessant und du musst die Frage beantworten, warum diese
Werte in C in irgendwelchen definierten Registern (r11..r13) stehen
sollen. In C arbeitet man mit Variablen, und es ist dem Programmierer
ziemlich egal, wo die tatsächlich sind.
Oh mein Beispiel ist zum ausgeben einer Bitfolge.
Einlesen geht aber ganz ähnlich; wenn Du das Ausgeben verstehst, dann
kannst Du das Beispiel so ändern, dass man auch einlesen kann.
unsigned long var = 0;
unsigned char i = 23;
do
{
var = var << 1;
if (PINC & 1)
{
var = var | 1;
}
}
while(--i);
Wobei das natürlich noch synchronisiert werden muss mit der
Geschwindigkeit des seriellen Eingangssignals.
Und wo die Variable in welchen Registern liegt kann deem C Programmierer
egal sein.
Hab ich mich vertippt? Mal drüberschauen.
MW
Ja genau, dachte wenn die Bitfolge schon bekannt ist, meint er sicher
ausgeben ;-)
Aber wie gesagt, wenn er das schnallt, dann sollte einlesen auch kein
Problem sein, ist ja einfach umgekehrt:
keek wrote:
> 000101000010110101000110 So kommen die Daten auf PORTC 0 also auf dem> Pin C0 eines atmega16
Das geht nicht!
Du kannst nicht einfach so Bits einlesen, der MC kann ja nicht
hellsehen.
Der MC muß irgendwie gesagt kriegen, wann er ein Bit abholen darf.
Entweder die Bits sind gültig in konstanten Zeitabschnitten nach einer
Startflanke oder sie sind gültig nach einer Flanke auf einem anderen
Pin.
Suche mal nach SW/Bitbanging-UART/SPI.
Peter
Peter Dannegger schreibt:
>Du kannst nicht einfach so Bits einlesen, der MC kann ja nicht>hellsehen.>Der MC muß irgendwie gesagt kriegen, wann er ein Bit abholen darf.>Entweder die Bits sind gültig in konstanten Zeitabschnitten nach einer>Startflanke oder sie sind gültig nach einer Flanke auf einem anderen>Pin.
es handelt sich um ein Datensatz aus einem Messgerät der aus 14 Byte
besteht der nach einem Protokoll gesendet wird also in Zeitabständen die
ich denke genau festgelegt sind
> Danke ausgeben muss ich auch nich irgend wann sorry ich konte mich mit> r11 und so nicht anders ausdrücken also Varilble nutzen
Kann das mal jemand ins deutsche übersetzen?
Ich finde es in diesem Forum immerwieder lustig. Als allererstes wird
ein Programmcode gepostet, obwohl die Grundlegensten Dinge nicht geklärt
sind.
Sich das die Baudrate 2500bps ist? Nicht evtl doch 2400Bps?
Hardwareschnittstelle vom MC verwenden -> Tutorial.
Sorry wenn ich euch durch einander gebracht habe aber ich bin neu in C
und der MC Programierung also nochmal:
Baudrate 2400Bps es kommen immer 14 Bytes hintereinander auf PORTC 0
also auf dem Pin C0 eines atmega16. Diese 14 Bytes sollen eingelesen und
auch gespeichert werden um sie später zuverarbeiten. Wenn es geht bitte
ein Quelltext mit erklärung.
Was Du machen willst hängt vom Mikrocontroller ab, den Du genau
einsetzt.
Am besten also mal das Hardwaremanual zu Deinem Chip angucken (gibts auf
der Homepage vom Hersteller), dort ist alles genau beschrieben.
Im Allgemeinen geht man folgendermassen vor:
1. Für richtigen Clock sorgen, damit die gewünschte Baudrate genau
erzeugt werden kann. Das fängt schon bei der Wahl des Quarzes an.
2. UART Register initialisieren, um das Format der Bytes richtig
einzustellen (Baudrate, Anzahl Datenbits, Parity, ...)
3. Interrupt-Empfangsroutine programmieren, welche dann automatisch beim
Empfang eines Zeichens aufgerufen wird und die Bytes in einem
Buffer/Array zwischenspeichert
4. Im Hauptprogramm die Daten aus dem Buffer holen und auswerten
Hat man das nie gemacht, ist es zugegebenermassen schwierig das
zuverlässig hinzukriegen. Aber da musst Du halt einmal durch wie jeder
Mikrocontrollerprogrammierer.
Erwarte in Foren keine fertigen Lösungen, die genau für Deinen
Controller passen. Dafür gibts Firmen und freie Programmierer, welche
solche Arbeit gegen Geld anbieten.