Ich lese ich die verschiedenen Bits von den Sensoren in eine struct variable ein kann diese aber nicht in den udr schreiben, kann mir da jemand helfen? Deklaration der Variable: struct { unsigned char Sens1:1; unsigned char Sens2:1; unsigned char Sens3:1; unsigned char Sens4:1; unsigned char Sens5:1; unsigned char Sens6:1; }a; Einlesen der Sensoren in die Struct Variable(die letzten beiden Bits bleiben frei): a.Sens1 = PINC & (1<<PINC0); a.Sens2 = PINC & (1<<PINC1); a.Sens3 = PINC & (1<<PINC2); a.Sens4 = PINC & (1<<PINC3); a.Sens5 = PINC & (1<<PINC4); a.Sens6 = PINC & (1<<PINC5); Warten bis sendepuffer frei ist und udr beschreiben: while (!(UCSRA & (1<<UDRE))); UDR=(struct)a; habe es auch schon mit UDR=(char)a; probiert aber das geht auch nicht.
> habe es auch schon mit > > UDR=(char)a; > probiert Das aber ist der zu verfolgende Ansatz. > aber das geht auch nicht. Lautet die Compiler-Fehlermeldung tatsächlich "This won't work"?
Sauber
1 | #include <avr/io.h> |
2 | |
3 | union { |
4 | struct { |
5 | unsigned char Sens1:1; |
6 | unsigned char Sens2:1; |
7 | unsigned char Sens3:1; |
8 | unsigned char Sens4:1; |
9 | unsigned char Sens5:1; |
10 | unsigned char Sens6:1; |
11 | // hier sind Bits undefiniert!
|
12 | } a; |
13 | char b; |
14 | } c; |
15 | |
16 | int main(void) |
17 | {
|
18 | c.a.Sens1 = PINC & (1<<PINC0); |
19 | c.a.Sens2 = PINC & (1<<PINC1); |
20 | c.a.Sens3 = PINC & (1<<PINC2); |
21 | c.a.Sens4 = PINC & (1<<PINC3); |
22 | c.a.Sens5 = PINC & (1<<PINC4); |
23 | c.a.Sens6 = PINC & (1<<PINC5); |
24 | |
25 | while (!(UCSRA & (1<<UDRE))); |
26 | UDR = c.b; |
27 | |
28 | return 0; |
29 | }
|
Dreckig
1 | #include <avr/io.h> |
2 | |
3 | struct { |
4 | unsigned char Sens1:1; |
5 | unsigned char Sens2:1; |
6 | unsigned char Sens3:1; |
7 | unsigned char Sens4:1; |
8 | unsigned char Sens5:1; |
9 | unsigned char Sens6:1; |
10 | // hier sind Bits undefiniert!
|
11 | } a; |
12 | |
13 | int main(void) |
14 | {
|
15 | a.Sens1 = PINC & (1<<PINC0); |
16 | a.Sens2 = PINC & (1<<PINC1); |
17 | a.Sens3 = PINC & (1<<PINC2); |
18 | a.Sens4 = PINC & (1<<PINC3); |
19 | a.Sens5 = PINC & (1<<PINC4); |
20 | a.Sens6 = PINC & (1<<PINC5); |
21 | |
22 | while (!(UCSRA & (1<<UDRE))); |
23 | UDR = *(char*)(&a); |
24 | |
25 | return 0; |
26 | }
|
das ist die compiler meldung: Build started 14.1.2008 at 15:54:48 avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -DF_CPU=16000000UL -O0 -fsigned-char -MD -MP -MT timerfertig.o -MF dep/timerfertig.o.d -c ../timerfertig.c ../timerfertig.c: In function 'main': ../timerfertig.c:40: warning: implicit declaration of function 'init_uart' ../timerfertig.c:42: warning: implicit declaration of function 'init_timer' ../timerfertig.c: At top level: ../timerfertig.c:54: warning: conflicting types for 'init_timer' ../timerfertig.c:42: warning: previous implicit declaration of 'init_timer' was here ../timerfertig.c: In function '__vector_9': ../timerfertig.c:87: error: aggregate value used where an integer was expected ../timerfertig.c: At top level: ../timerfertig.c:95: warning: conflicting types for 'init_uart' ../timerfertig.c:40: warning: previous implicit declaration of 'init_uart' was here make: *** [timerfertig.o] Error 1 Build failed with 1 errors and 6 warnings...
Michael Dietz wrote:
> es klappt danke dh. das ich in das udr genau 6 bit reinschiebe?
Nein.
Es ist immer 1 Byte = 8 Bit
@ Michael Dietz (Firma na) (michaeld) >es klappt danke dh. das ich in das udr genau 6 bit reinschiebe? Du solltest dich mal mit den UART-Grundlagen beschäftigen. RS232 AVR-Tutorial: UART AVR-GCC-Tutorial MfG Falk
Nee, in UDR landen 8 Bits. Nur sind 2 Bits (Bit 6 und Bit 7) nicht definiert, d.h. du solltest keine Annahmen über deren Inhalt machen (praktisch steht 0 von der Initialisierung her drin).
@ Stefan "stefb" B. (stefan) Benutzerseite >Nee, in UDR landen 8 Bits. Nur sind 2 Bits (Bit 6 und Bit 7) nicht >definiert, d.h. du solltest keine Annahmen über deren Inhalt machen >(praktisch steht 0 von der Initialisierung her drin). Vor allem ist schön undefiniert, in welcher Reihenfolge die Bits im Byte abgelegt sind. :-( MFG Falk
Mist hast mich erwischt! Ich habe im ASM-Listing gecheatet. Ich bekenne! Es sieht dort ziemlich seltsam aus.
demnach sollte das das gleiche sein und es sollte damit auch klappen? Variablendeklaration:
1 | char Sensor_1bis6; |
Einlesen:
1 | Sensor_1bis6 = PINC; |
Senden:
1 | UDR=(char)Sensor_1bis6; |
>a.Sens1 = PINC & (1<<PINC0); >a.Sens2 = PINC & (1<<PINC1); >a.Sens3 = PINC & (1<<PINC2); >a.Sens4 = PINC & (1<<PINC3); >a.Sens5 = PINC & (1<<PINC4); >a.Sens6 = PINC & (1<<PINC5); Ist doch Unsinn. Mache das so wie
1 | Michael Dietz (Firma na) (michaeld) |
2 | Datum: 14.01.2008 16:27 |
vorgeschlagen hat.
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.