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 | unsigned char MeinArray[3] == {0x14, 0x2D, 0x4D}; |
Die einzelnen Bits könntest Du dann in zwei ineinander verschachtelten Schleifen ausgeben:
1 | unsigned char ArrayIndex; |
2 | unsigned char BitIndex; |
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
|
9 | if (MeinArray[ArrayIndex] & (0x01 << BitIndex)) |
10 | {
|
11 | PortC |= 0x01; // Bit 0 setzen |
12 | }
|
13 | else
|
14 | {
|
15 | PortC &= ~0x01; // Bit 0 löschen |
16 | }
|
17 | }
|
18 | }
|
>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:
1 | for (ArrayIndex = 0; ArrayIndex < 3; ArrayIndex++) |
2 | {
|
3 | for (BitIndex = 0; BitIndex < 8; BitIndex++) |
4 | {
|
5 | if (PortC & 0x01) |
6 | {
|
7 | MeinArray[ArrayIndex] |= 0x01 << BitIndex; |
8 | }
|
9 | else
|
10 | {
|
11 | MeinArray[ArrayIndex] &= ~(0x01 << BitIndex); |
12 | }
|
13 | }
|
14 | }
|
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
Danke ausgeben muss ich auch nich irgend wann sorry ich konte mich mit r11 und so nicht anders ausdrücken also Varilble nutzen
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.
Ja genau, in diesem Falle die Bitfolge mit dem im Mikrocontroller eingebauten UART einlesen.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.