Hallo, ich habe mal eine Verständnisfrage: Wie kan ich den Wert an einem PIN einlesen und diesen in eine Variable schieben? Also quasi serielles Einlesen. Ich verstehe einfach nicht die schiebe operation... daten=(PINXY<<1);
Klausi wrote: > Ich verstehe einfach nicht die schiebe operation... > > daten=(PINXY<<1); Was verstehst Du daran nicht? Die Anweisung schiebt den Wert von PINXY um eine Stelle nach links (wobei rechts eine Null eingefügt wird) und weist das Ergebnis der Variable daten zu.
Ich will aber den Wert von PINXY einlesen und dann eine Stelle nach links schieben und dann das ganze wiederholen. Müsste dies dann so aussehen: for(...) { daten|=(PINXY<<1); }
Das ganze würde so funktionieren:
1 | for(int i=0; i<(sizeof(daten)*8); i++) |
2 | {
|
3 | daten = (daten << 1) | PINXY; |
4 | }
|
MfG Marius
@Marius Ich habe versucht deinen Code zu simulieren. Was mich wundert ist dass beim ersten mal eine 5 (dez) in daten steht, dann eine 15, 31, 63, 127 ... Und dann das ganze obwohl ich PINB5 garnicht gesetzt habe. Es hat keine Auswirkung ob ich PINB% setze oder nicht! Ich werde nochmal verrückt, ich raffs einfach nicht. PB5 ist als Eingang initalisiert worden.
Hm, also in C ist der kleinste Datentyp doch sowieso "char", das wären schonmal 8 bit. Warum schiebst du nicht einfach das komplette Byte in eine Variable und verwendest dann einen Ausdruck wie
1 | if(dein_port & (1 << dein_bit_oder_pin) |
2 | zielvarialbe=1; |
3 | else zielvariable=0; |
Etwas wie (1 << PB5) schiebt einfach nur eine 1 6 Positionen weiter nach links, PB5 ist in diesem Fall keine Adresse, sondern eine einfache Zahl (in der io.h definiert). Es gibt DDRB, mit dem du Eingänge oder Ausgänge initialisierst. Aber ich bin selbst noch Anfänger. "PINXY" steht nicht für einen Pin, sondern für einen kompletten Port (also 8 Pins). Ein Pin kann 1 oder 0 sein, das checkst du z.B. mit if() (Bitte korriegiert mich jemand, wenn ich einen Grundlegenden Fehler weitererzähle)
Also das Ganz so? Wenn ich doch nur wüsste wieso der Simulator jetzt wieder nach der zweiten if Anweisung keinen Braekpoint setzen will???? Man, so eine einfache Aufgabe an der ich scheitere...ich könnt heulen.
1 | for(...) |
2 | {
|
3 | if(!(PORTB & (1<<PB7))) |
4 | {
|
5 | if(PINB & (1<<PINB5)) |
6 | daten <<=1 ; |
7 | else
|
8 | daten<<=0; |
9 | }
|
10 | }
|
for(...) { if(!(PORTB & (1<<PB7))) //Bit 7 ist also '0' gesetzt (in dem Fall { //heisst das, kein Pull Up ein, wenn DDRB7 = 0) if(PINB & (1<<PINB5)) // Wenn also am Pin B5 eine '1' anliegt daten <<=1 ; //wird der Inhalt in daten 1 nach links geschoben else //allerdings wurde daten nirgends etwas zugewiesen daten<<=0; } } Ich glaube du meinst (ich weiß es aber nicht genau): daten:=0; for(int i=0; i<(sizeof(daten)*8); i++) { if(PINB & (1<<PINB5)) daten = (daten << 1) | 1; else daten = (daten << 1); } Dieser code schiebt einfach das, was am PINB5 anliegt nach links. Allerdings würde das hier sehr schnell vonstatten gehen, sodass daten entweder 0 oder 0xFF beinhalten würde.
Ich erhalte immer eine Null, wie du gesagt hast. Wieso, ich habe doch delay eingefügt.
1 | ...
|
2 | uint16_t daten=0; |
3 | PORTB &=~(1<<PB2); |
4 | _delay_us(10); |
5 | |
6 | for(uint8_t k=0; k<=32; k++) |
7 | {
|
8 | PORTB^=(1<<PB7); |
9 | if(!(PORTB & (1<<PB7))) |
10 | {
|
11 | if(PINB & (1<<PINB5)) |
12 | daten = (daten<<1)|1 ; |
13 | else
|
14 | daten=(daten<<1); |
15 | |
16 | }
|
17 | _delay_us(10); |
18 | }
|
19 | PORTB|=(1<<PB2)|(1<<PB7); |
20 | |
21 | ...
|
Der Code stellt eine SPI Schnittstelle ohne Senden dar. PB7 dient als Clock und PB5 ist der Data In. Daten am PB5 liegen an, das konnte ich mit dem Oszilloskop messen. Also Clock funktioniert (siehe Anhang) Kanal 1 ist Clock und 2 ist DataIn (PB5)
Ich hab den Fehler gefunden, lag nicht am Programm, sondern war ein Kontaktproblem. Oh man viele Stunden für den Ar***. Aber mir ist aufgefallen das die Bytes im Wort daten irgendwie vertauscht sind. ??? Wenn man das Bild mit dem Inhalt von "daten" (=D0 07) vergleicht fällt einem das auf. Bild: 0000 0111 1101 000 = 07D0 Woran liegt das?
Sorry, mein Fehler ich glaube es liegt am Speichern im EEPROM. Zuerst wird wahrscheinlich das LSB dann das MSB gesichert.
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.