Bit folge einlesen

Gast #961825
Lesenswert?

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.
Gast #961873
Lesenswert?

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
}
Moderator (Firma: Titel) Persönliche Seite #961877
Lesenswert?

>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.
Gast #961891
Lesenswert?

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
Gast #961896
Lesenswert?

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
}
#961897
Lesenswert?

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
Gast #961906
Lesenswert?

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
Gast #961912
Lesenswert?

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.
Gast #965166
Lesenswert?

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.
Gast #965273
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren