Hallo Ich würde gern in meinem Programm einen einzelnen Ausgangspin mit if abfragen ob der Ausgang gesetzt ist oder nicht. Ich habe es mit: DDRB |= 0xff; PORTB = buffer; //In buffer ist Wert 0 - 255 if ( PINB & (1<<PINB1) ) //Hier würde ich gern Wissen was geht { ..... } versucht aber das ging nicht. Der komplette Port B ist als Ausgang definiert und wird über ein Byte angesteuert. Gruß Ram99
1 | DDRB |= 0xff; |
2 | PORTB = buffer; |
3 | |
4 | DDRB &= ~(1 << 1); //als Eingang |
5 | |
6 | if ( PINB & (1 << 1) ) |
7 | {
|
8 | .....
|
9 | }
|
10 | |
11 | DDRB |= (1 << 1); //als Ausgang |
Es reicht aber auch wenn dein Port eh als Ausgang definiert ist, das Register zu lesen. Etwa so:
1 | if ( PORTB & (1 << 1) ) |
2 | {
|
3 | .....
|
4 | }
|
GvH
Datenblatt lesen. Beim Meag32 steht z.B. "Independent of the setting of Data Direction bit DDxn, the port pin can be read through the PINxn Register bit." Also ist dein
1 | if ( PINB & (1<<PINB1) ) //Hier würde ich gern Wissen was geht |
2 | {
|
3 | .....
|
4 | }
|
eigentlich richtig. Woher weisst du denn, daß das nicht funktioniert? Oliver
> Ich würde gern in meinem Programm einen einzelnen Ausgangspin mit if > abfragen ob der Ausgang gesetzt ist oder nicht. An Hand des DDR Registers weisst du, ob ein Port als Eingang (Bit=0) oder als Ausgang (Bit=1) konfiguriert ist. Wenn du herausgefunden hast, dass der Port als Ausgang konfiguriert ist, kannst du bei PORT herausfinden, ob der Ausgang LOW (Bit=0) oder HIGH (Bit=1) gesetzt ist.
1 | void beispiel_konfiguration(unsigned char buffer) |
2 | {
|
3 | DDRB |= 0xff; |
4 | PORTB = buffer; //In buffer ist Wert 0 - 255 |
5 | }
|
6 | |
7 | void abfrage(unsigned char pin) |
8 | {
|
9 | if (DDRB & (1<<pin)) |
10 | {
|
11 | // Ausgang
|
12 | if (PORTB & (1<<pin)) |
13 | {
|
14 | // HIGH gesetzt
|
15 | }
|
16 | else
|
17 | {
|
18 | // LOW gesetzt
|
19 | }
|
20 | }
|
21 | else
|
22 | {
|
23 | // Eingang
|
24 | if (PINB & (1<<pin)) |
25 | {
|
26 | // HIGH liegt an
|
27 | }
|
28 | else
|
29 | {
|
30 | // LOW liegt an
|
31 | }
|
32 | }
|
33 | }
|
>> Datenblatt lesen. >> >> Beim Meag32 steht z.B. >> >> "Independent of the setting of Data Direction bit DDxn, the port pin can >> be read through the PINxn Register bit." Macht bloß herzlich wenig Sinn. Aber klar dass das funktioniert. GvH
Über den "Sinn" zu diskutieren, ist müssig. So hat es ATMEL eingebaut, so steht es im Datenblatt, und so funktioniert es auch. Daher auch nochmal meine Frage an Thomas Webster: Woram merkst du dann, daß das anscheinend nicht funktioniert? Oliver
Oliver wrote: > Über den "Sinn" zu diskutieren, ist müssig. So hat es ATMEL eingebaut, > so steht es im Datenblatt, und so funktioniert es auch. > > Daher auch nochmal meine Frage an Thomas Webster: Woram merkst du dann, > daß das anscheinend nicht funktioniert? > > Oliver Danke erstmal für die vielen Antworten :) Ich habe es ja mit dieser Variante: if(PINB & (1<<PINB1)) versucht aber das Programm springt immer in die else {} Bedingung. Wenn ich es wie " Graf van Hirntot" mache mit: if (PORTB & (1 << 1)) funktioniert es sofort ohne Probleme. Weiß auch nicht warum die obere Variante nicht funktioniert. Hatte es ja erst versucht weil ich es so eigentlich kannte. Gruß Ram99
Mach doch mal bitte probehalber drei oder vier von diesen hier vor die if-schleife:
1 | asm volatile ("nop"); |
Vielleicht ist ja mein Verdacht begründet - es würde mich aber überraschen. GvH
mit PORTB liest Du das Ausgangsregister, mit PINB den Pin, vermutlich ist der Ausgang auf low gezogen bzw. geht nicht schnell genug auf high
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.