mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bit folge einlesen


Autor: keek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char MeinArray[3] == {0x14, 0x2D, 0x4D};
Die einzelnen Bits könntest Du dann in zwei ineinander verschachtelten 
Schleifen ausgeben:
unsigned char ArrayIndex;
unsigned char BitIndex;

for (ArrayIndex = 0; ArrayIndex < 3; ArrayIndex++)
{
  for (BitIndex = 0; BitIndex < 8; BitIndex++)
  {
    // Zu sendendes Bit ausmaskieren und prüfen ob es gesetzt ist
    if (MeinArray[ArrayIndex] & (0x01 << BitIndex))
    {
      PortC |= 0x01; // Bit 0 setzen
    }
    else
    {
      PortC &= ~0x01; // Bit 0 löschen
    }
  }
}

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
for (ArrayIndex = 0; ArrayIndex < 3; ArrayIndex++)
{
  for (BitIndex = 0; BitIndex < 8; BitIndex++)
  {
    if (PortC & 0x01)
    {
      MeinArray[ArrayIndex] |= 0x01 << BitIndex;
    }
    else
    {
      MeinArray[ArrayIndex] &= ~(0x01 << BitIndex);
    }
  }
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: keek (Gast)
Datum:

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

Autor: keek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Baudrate beträgt 2500

Autor: keek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das eine RS232 Schnittstelle?

Autor: Johnny (Gast)
Datum:

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

Autor: keek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.