Hallo zusammen, ich habe ein kleines Problem beim definieren der ein und Ausgänge meines Attiny2313. Mein Code lautet zu Zeit: #include <avr/io.h> int main(void) { DDRD = 0x00; // PortD als Ausgang definiert PORTD = 0xff; // PortD Pull-up Widerstände eingeschaltet DDRB = 0xff; // PortB als Eingang definiert while(1) { } return 0; } Da AVR Studio 5 mein STK500 nicht erkennt und ich grade auch probleme habe es unter AVR Studio4 zum laufen zu kriegen (keine ahnung warum, hat unter der version 4 sonst immer funktioniert) wollte ich mal die Debug Simulatorfunktion vom Studio 5 ausprobieren. Ich würde jetzt erwarten, dass die im quelltext als kommentar stehenden ereignisse eintreten. Tatsächlich wird mir aber in der Simulation angezeigt, dass DDRD den Value 0x00 hat Gesetzte Bits alle 0 PORTD den Value 0x7f und es werden 7 Bits auf 1 gesetzt (soweit ist das ja noch richtig) DDRB hat einen Value von 0x00 (obwohl der doch 0xff sein sollte und die gesetzten Bits sollten auch alle 1 sein) sind aber 0?! Bitte verbessert mich wenn ich falsch liege oder die simulation falsch deute... Grüße ICH
ICH schrieb: > DDRD = 0x00; // PortD als Ausgang definiert > DDRB = 0xff; // PortB als Eingang definiert Was? Wie bitte?
UPS, ich hab die Beschriftung für eingang und ausgang verwechselt Sollte so aussehen. // DDRD = 0x00; // PortD als Eingang // PORTD = 0xff; // PortD Pull-up Widerstände eingeschaltet // DDRB = 0xff; // PortB als Ausgang
Hi Hast du auch den richtigen Controller im Simulator eingestellt? MfG Spess
Nachdem ich das ganze jetzt ein wenig bearbeitet und nochmal simuliert habe scheinen jetzt alle Register richtig gesetzt zu werden. Jetzt sollen bei einem tastendruck die zugehörige LED leuchten (bzw ausgehen) Ich habe mir das ganze so gedacht
1 | #include <avr/io.h> |
2 | |
3 | unsigned char i; |
4 | |
5 | int main(void) |
6 | {
|
7 | Selbe Funktion wie unten! |
8 | DDRD = 0x00; // PortD als Eingang |
9 | PORTD = 0xff; // PortD Pull-up Widerstände eingeschaltet |
10 | DDRB = 0xff; // PortB als Ausgang |
11 | while(1) |
12 | {
|
13 | if (PIND & ( 1 << PD0)) |
14 | {
|
15 | DDRB ^= ( 1 << PB0 ); //PB0 Toggle |
16 | }
|
17 | if (PIND & ( 1 << PD1)) |
18 | {
|
19 | DDRB ^= ( 1 << PB1 ); //PB1 Toggle |
20 | }
|
21 | if (PIND & ( 1 << PD2)) |
22 | {
|
23 | DDRB ^= ( 1 << PB2 ); //PB2 Toggle |
24 | }
|
25 | if (PIND & ( 1 << PD3)) |
26 | {
|
27 | DDRB ^= ( 1 << PB3 ); //PB3 Toggle |
28 | }
|
29 | if (PIND & ( 1 << PD4)) |
30 | {
|
31 | DDRB ^= ( 1 << PB4 ); //PB4 Toggle |
32 | }
|
33 | if (PIND & ( 1 << PD5)) |
34 | {
|
35 | DDRB ^= ( 1 << PB5 ); //PB5 Toggle |
36 | }
|
37 | if (PIND & ( 1 << PD6)) |
38 | {
|
39 | DDRB ^= ( 1 << PB6 ); //PB6 Toggle |
40 | }
|
41 | }
|
42 | return 0; |
43 | }
|
Könnte das funktionieren (mal abgesehen vom prellen der taster)? Für den Fall, dass es funktioniert... Gibt es eine elegantere Lösung als 7 if-Schleifen? Vielen Dank für die Hilfe.
ICH schrieb: > Gibt es eine elegantere Lösung als > 7 if-Schleifen?
1 | uint8_t mask; |
2 | uint8_t i; |
3 | while(42) |
4 | {
|
5 | mask=1; |
6 | for (i=0; i<8; i++) |
7 | {
|
8 | if (PIND & mask) |
9 | {
|
10 | DDRB ^= mask; //PBX Toggle |
11 | }
|
12 | mask = mask << 1; // mask 1x linksschift |
13 | }
|
http://www.if-schleife.de/
dummschwaetzer schrieb: > wieso schaltest du eigentlich DDRB und nicht PORTB Du meinst:
1 | if (PIND & ( 1 << PD0)) |
2 | {
|
3 | PORTD ^= ( 1 << PB0 ); //PB0 Toggle |
4 | }
|
Keine ahnung warum ... :/
Natürlich meine ich if (PIND & ( 1 << PD0)) { PORTB ^= ( 1 << PB0 ); //PB0 Toggle }
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.