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
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
Ja weiss ich ich komme aber nicht darauf wie ich die einzelnen bitzs auslesen kann.
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
>Ich Programmiere das ganze in C
Wie geht denn das ohne die einfachsten Grundlagen zu beherrschen ?
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
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 ?
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
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
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
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
> if(data&&(1<<bit)) ausgabe='1';
Über das && würde ich aber nochmal nachdenken ;)
@holger stimmt. && ist logisch und hier logischerweise falsch & ist bitweise hans
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 | }
|
Hi Interessant, welche Konfusion in der C-Fraktion herrscht. MfG Spess
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 | }
|
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.