Forum: Mikrocontroller und Digitale Elektronik Bitweise ausgabe einer Variablen


von Florian (Gast)


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

von Spess53 (Gast)


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

von Florian (Gast)


Lesenswert?

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

von Spess53 (Gast)


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

von Florian (Gast)


Lesenswert?

Ich Programmiere das ganze in C

von holger (Gast)


Lesenswert?

>Ich Programmiere das ganze in C

Wie geht denn das ohne die einfachsten Grundlagen zu beherrschen ?

von Spess53 (Gast)


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

von Florian (Gast)


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 ?

von Florian (Gast)


Lesenswert?

Danke für den Tipp.aber gibts da auch was einfacheres?

von Spess53 (Gast)


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

von hans (Gast)


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

von holger (Gast)


Lesenswert?

@ Spess53

Gibts das << wirklich in Pascal ?

von Simon K. (simon) Benutzerseite


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:
1
if ( Variable & (1<<3) )
2
{
3
    // Bit 3 in Variable ist 1
4
}else
5
{
6
    // Bit 3 in Variable ist 0
7
}

Siehe auch hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29

von Spess53 (Gast)


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

von holger (Gast)


Lesenswert?

>  if(data&&(1<<bit)) ausgabe='1';

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

von hans (Gast)


Lesenswert?

@holger

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

von SoLaLa (Gast)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

Interessant, welche Konfusion in der C-Fraktion herrscht.

MfG Spess

von Simon K. (simon) Benutzerseite


Lesenswert?

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

weniger Code:
1
uint8_t Mask = 0x80;
2
while(Mask)
3
{
4
   if (Data & Mask)
5
       uart_putc('1');
6
   else
7
       uart_putc('0');
8
   Mask >>= 1;
9
}

von SoLaLa (Gast)


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?

von SoLaLa (Gast)


Lesenswert?

nee quatsch, streicht mein letztes Posting :-)

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.