Forum: Mikrocontroller und Digitale Elektronik Bit folge einlesen


von keek (Gast)


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.

von Johnny (Gast)


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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Johnny (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

@  Johnny
Einlesen, nicht ausgeben. Und wieso {0x14, 0x2D, 0x4D}?    ;-)

von Michael Wilhelm (Gast)


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

von Johnny (Gast)


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
}

von Peter D. (peda)


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

von keek (Gast)


Lesenswert?

Danke ausgeben muss ich auch nich irgend wann sorry ich konte mich mit 
r11 und so nicht anders ausdrücken also Varilble nutzen

von keek (Gast)


Lesenswert?

Baudrate beträgt 2500

von keek (Gast)


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

von Gast (Gast)


Lesenswert?

> 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?

von Martin (Gast)


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.

von Martin (Gast)


Lesenswert?

Ist das eine RS232 Schnittstelle?

von Johnny (Gast)


Lesenswert?

Ja genau, in diesem Falle die Bitfolge mit dem im Mikrocontroller 
eingebauten UART einlesen.

von keek (Gast)


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.

von Johnny (Gast)


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.

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
Noch kein Account? Hier anmelden.