www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitweise ausgabe einer Variablen


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute hab mal eine Frage vielleicht habt ihr eine Lösung.

Und zwar hab ich mir eine TWI Schaltung mit 2 ATmega8 gebaut und 
übertrage Daten von einem zum Anderen.

Im Slave werden die Daten aus dem TWDR in eine Variable uint8_t DATA 
kopiert und nun müchste ich Testweise die einzelnen Bitstellen (0 oder 
1) per Uart ausgeben um die Daten zu Prüfen ich glaube das diese nicht 
Korrekt übertragen werden.

Die Ausgabe soll wie folgt lauten:

DATA Bit 1:0/1 (je nachdem was drinsteckt)
DATA Bit 2:0/1
.
.
.
usw.

Allerding fällt mir absolut keine Lösung ein.

MFG
Flo

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wenn das Bit 0 ist, eine $30 und bei einer 1 ein $31 senden. Das 
entspricht den ASCII-Zeichen für 0 und 1. Das kannst du dann mit einem 
Terminalprogramm empfangen.

MfG Spess

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja weiss ich ich komme aber nicht darauf wie ich die einzelnen bitzs 
auslesen kann.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Welche Programmiersprache?

im einfachsten Fall ein 'and 0b0001000' z.B. für Bit 3. In Assembler 
gibt es noch andere Möglichkeiten.

MfG Spess

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich Programmiere das ganze in C

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich Programmiere das ganze in C

Wie geht denn das ohne die einfachsten Grundlagen zu beherrschen ?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Dann sollte die C-Spezies ran. Bin notorischer Assemblerprogrammierer.

Aber in C gibt es auch eine and-Funktion. Wenn du deine Variable mit 
einer Bitmaske and-verknüpfst, in der nur das zu prüfende Bit gesetzt 
ist, wird das Ergebnis 0 bei Bit=0 und >0 wenn Bit=1. Danach kannst du 
entscheiden. Als Bitmaske kann mann z.B.  '1<<3' für Bit 3 nehmen.

MfG Spess

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C Programmieren kann ich habe aber noch nicht so viel Erfahrung mit 
Microkontrollern hab sonst immer nur PC Software geschrieben und da 
musste ich nicht so viel mit einzelnen Bits machen.Sonst Programmiere 
ich lieber Java aber hier bringt mich das nicht weiter.

Aber zurück zum Thema kann mir jemand helfen ?

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp.aber gibts da auch was einfacheres?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Diese Modesprachen.

Ich schreibe das mal in Pascal. Da weiss ich wenigsten das es richtig 
ist.
Für Bit 3:

  if (Variable and (1<<3))= 0 then Nullsenden
                              else Einssenden;

MfG Spess

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo florian

for(bit=0;bit<8;bit++){        // 8 bit
  ausgabe='0';
  if(data&&(1<<bit)) ausgabe='1';
  USDR=ausgabe;
}

sollt nacheinander die bits 0-7 übertragen.
(bit ist hilfsvaliable).
gruß hans

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Spess53

Gibts das << wirklich in Pascal ?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess53 wrote:
> Hi
>
> Diese Modesprachen.
>
> Ich schreibe das mal in Pascal. Da weiss ich wenigsten das es richtig
> ist.
> Für Bit 3:
>
>   if (Variable and (1<<3))= 0 then Nullsenden
>                               else Einssenden;
>
> MfG Spess

Dann übersetzen wir es noch in C:
if ( Variable & (1<<3) )
{
    // Bit 3 in Variable ist 1
}else
{
    // Bit 3 in Variable ist 0
}

Siehe auch hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nein. Aber ich weiss, das es das in C gibt. In Pascal: 'shl'. Abgesehen 
davon benutze ich auch unter Delphi für solche Sachen lieber Assembler.

MfG Spess

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  if(data&&(1<<bit)) ausgabe='1';

Über das && würde ich aber nochmal nachdenken ;)

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@holger

stimmt. && ist logisch und hier logischerweise falsch
& ist bitweise
hans

Autor: SoLaLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich als C-Neuling würde das so machen:
for (bit=8;bit>0;--bit)
  {
  uart_putc( ((data&(1<<bit))>>bit)+'0');   //bit als ASCIIchar ausgeben
  }

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Interessant, welche Konfusion in der C-Fraktion herrscht.

MfG Spess

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SoLaLa wrote:
> ich als C-Neuling würde das so machen:
>
>
> for (bit=8;bit>0;--bit)
>   {
>   uart_putc( ((data&(1<<bit))>>bit)+'0');   //bit als ASCIIchar ausgeben
>   }
> 

weniger Code:
uint8_t Mask = 0x80;
while(Mask)
{
   if (Data & Mask)
       uart_putc('1');
   else
       uart_putc('0');
   Mask >>= 1;
}

Autor: SoLaLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich mal irgendwann kein Neuling mehr bin, dann würd ich da auch 
gern drauf kommen wollen...
aber das Beispiel von hans ziemlich oben... da ist doch was falsch, 
oder?

Autor: SoLaLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee quatsch, streicht mein letztes Posting :-)

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.