Hallo Leute ich würde gerne den Wert von PortB beim Atmega8 einlesen und in im Binär Format der UART ausgeben. Zum Beispiel so: PORTB ==> 0b00001111 Aber ich habe keine Idee wie ich den uint8 Wert in diese Form bringen kann. Könntet ihr mir eventuell einen Anstoss geben wie ich dabei Vorgehen muss? MfG Flo
> PORTB ==> 0b00001111
Das soll also am Terminal ankommen?
Dann nimm erst mal die Holzhammermethode:
1 | uart_send('P'); |
2 | uart_send('O'); |
3 | uart_send('R'); |
4 | uart_send('T'); |
5 | uart_send('B'); |
6 | uart_send(' '); |
7 | uart_send('='); |
8 | uart_send('='); |
9 | uart_send('>'); |
10 | uart_send(' '); |
11 | uart_send('0'); |
12 | uart_send('b'); |
13 | uart_send((PINB&0x80)?'1':'0'); |
14 | uart_send((PINB&0x40)?'1':'0'); |
15 | uart_send((PINB&0x20)?'1':'0'); |
16 | uart_send((PINB&0x10)?'1':'0'); |
17 | uart_send((PINB&0x08)?'1':'0'); |
18 | uart_send((PINB&0x04)?'1':'0'); |
19 | uart_send((PINB&0x02)?'1':'0'); |
20 | uart_send((PINB&0x01)?'1':'0'); |
21 | uart_send('\n'); |
Später könntest du dir einen String mit einer Schleife aufbauen und den komplett verschicken. Bleibt allerdings noch die Frage nach der Sinnhaltigkeit des Ganzen :-/ Will heißen: warum verschickst du nicht einfach "nur" den Wert und lässt ihn dir auf dem PC so anzeigen, wie du es willst?
Ich bin dabei mir ein kleines Board zu bauen mit dem Ich per Commandline die Ports ,den ADC ,TWI etc. steuern und rum experimentieren kann da ich sowas brauche um andere Schaltungen zu testen (z.B. ob die Richtigen Signale aus der zu testenden Schaltung kommen und sowas). Da da ganze Später mit einem Palm oder Psion Revo gesteuert wird wo nur ein Terminal Programm läuft soll erstmal der Controller alles machen. Die Commandline ist schon fertig nur halt die Ausgabe der Ports fehlt noch.
1 | uint8_t Wert; |
2 | int8_t i; |
3 | |
4 | Wert = PORTB; |
5 | |
6 | |
7 | uart_puts("Port B = "); |
8 | |
9 | |
10 | for (i = 7; i < -1; i--) |
11 | {
|
12 | if (Wert & (1 << i)) |
13 | uart_putchar('1'); |
14 | else
|
15 | uart_putchar('0'); |
16 | }
|
17 | |
18 | uart_puts("\r\n"); |
Und wie war das jetzt mit dem variablen Shift? Der ließe sich doch so unsagbar schlecht in Maschinensprache umsetzen, heißt es... :-/ Warum nicht gleich die Maske schieben:
1 | uint8_t Wert; |
2 | int8_t msk; |
3 | |
4 | Wert = PORTB; |
5 | |
6 | uart_puts("PORTB ==> 0b"); |
7 | |
8 | for (msk=0x80; msk; msk>>=1) |
9 | {
|
10 | if (Wert & i) uart_putchar('1'); |
11 | else uart_putchar('0'); |
12 | }
|
13 | |
14 | uart_puts("\r\n"); |
@Lothar Miller geht leide nicht, i ist unbekannt und int8_t msk führt zu einer endlosschleife.
1 | uint8_t Wert = PORTB; |
2 | |
3 | uart_puts("PORTB ==> 0b"); |
4 | |
5 | for ( uint8_t msk=0x80; msk; msk>>=1, uart_putchar( (Wert & msk) ? 1 : 0 )); |
6 | |
7 | uart_puts("\r\n"); |
for ( uint8_t msk=0x80; msk; msk>>=1, uart_putchar( (Wert & msk) ? '1' : '0' ));
holger schrieb: > for ( uint8_t msk=0x80; msk; msk>>=1, uart_putchar( (Wert & msk) ? '1' : > '0' )); Das funktioniert nur, wenn du die Operanden des Komma-Operators umdrehst.
Kommaoperator ist Pfui! Was sprict dagegen, den Befehl einfach in die schleife zubringen, anstatt in den Kopf?
nein das geht - habe es getestet. for ( uint8_t msk=0x80; msk; msk>>=1) { uart_putchar( (Wert & msk) ? '1' : '0' ); } ist aber wirklich besser lesbar.
Peter schrieb:
> nein das geht - habe es getestet.
Dann hast du falsch getestet, denn das funktioniert so definitiv nicht.
Beim Komma-Operator wird von links nach rechts ausgewertet.
es muss doch gar nicht ausgewerter werden, das msk>>=1 und das print sind bloss anweissungen - der return ist doch dabei egal.
Peter schrieb: > es muss doch gar nicht ausgewerter werden, das msk>>=1 und das print > sind bloss anweissungen - der return ist doch dabei egal. Ach, und du meinst es spielt keine Rolle, in welcher Reihenfolge msk>>=1 und die Ausgabe ausgeführt werden? Dass die Operanden von links nach rechts ausgewertet werden, bedeutet in diesem Fall, dass erst geschoben und dann ausgegeben wird. Das hat eine um 1 verschobene (nach links) Ausgabe zur Folge und das LSB ist in der Ausgabe immer '0'.
ah jetzt habe ich erstanden, ok ich gebe zu ich habe nicht die korrektheit des ergebnisse überprüft. Ich dachte die Abbruchbedingung in der schleife ist falsch.
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.