Hallo, wie kann ich genau die einzelnen Ein- und Ausgänge in WINAVR in C programmieren? Also sozusagen am Anfang diese definieren und später wieder in dem Programm verwenden?
hab schon darüber es versucht, aber irgendwie klappt das bei mir net.
Am einfachsten als Bitvariable, z.B.: http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip Peter
Finn A. schrieb:
> hab schon darüber es versucht, aber irgendwie klappt das bei mir net.
WAS klappt denn nicht und WAS hast du versucht?
Noch ausführlicher als im Tutorial kann dir das im Forum auch kein
Mensch beantworten. Zumindest wird keiner große Lust dazu haben.
Wenn du aber konkrete Fragen hast und bei einem konkreten Code-Stück
hängst, sieht die Sache gaaaanz anders aus.
so sieht jetzt mein programm aus, jedoch zeigen die beiden leds (PD 5, PD 6) nur dauerlicht an. an PD2 ist ein taster angeschlossen.
1 | #include <stdlib.h> |
2 | #include <avr/io.h> |
3 | #include "util/delay.h" |
4 | |
5 | |
6 | int main(void) |
7 | {
|
8 | |
9 | DDRD &= ~(1 << PD2); |
10 | PORTD |= (1 << PD2); |
11 | DDRD |= (1 << PD5); |
12 | DDRD |= (1 << PD6); |
13 | |
14 | |
15 | if (PIND & (1 << PD2)) |
16 | {
|
17 | PORTD |= (1 << PD5); |
18 | _delay_ms(95); |
19 | PORTD |= (1 << PD6); |
20 | _delay_ms(95); |
21 | }
|
22 | |
23 | else
|
24 | {
|
25 | while (1) |
26 | {
|
27 | PORTD |= (1 << PD5); |
28 | PORTD |= (1 << PD6); |
29 | _delay_ms(95); |
30 | }
|
31 | }
|
32 | }
|
Der Code ist ja ziemlich Sinnfrei. Wenn Taster auf VCC = Led's an. Wenn Taster gegen GND = Led's an. Wenn du den Port Pin auschalten willst ---> PORTD &= ~(1<<PD5),...... Gruß
Bleibt er nicht ewig in der while Schleife hängen?
Duff schrieb:
> Bleibt er nicht ewig in der while Schleife hängen?
Kommt drauf an, ob die Taste beim anlegen der Versorgungsspanngun
bereits gedrückt war oder nicht.
Du willst, dass der µC immer macht: wenn Taste gedrückt Led einschalten else Led ausschalten
1 | int main(void) |
2 | {
|
3 | |
4 | DDRD &= ~(1 << PD2); |
5 | PORTD |= (1 << PD2); |
6 | DDRD |= (1 << PD5); |
7 | DDRD |= (1 << PD6); |
8 | |
9 | while( 1 ) { // mache immer |
10 | |
11 | if (PIND & (1 << PD2)) // wenn Taste nicht gedrückt |
12 | {
|
13 | PORTD |= (1 << PD5); // Pin auf 1 |
14 | _delay_ms(95); |
15 | PORTD |= (1 << PD6); // Pin auf 1 |
16 | _delay_ms(95); |
17 | }
|
18 | |
19 | else // Taste ist gedrückt |
20 | {
|
21 | PORTD &= ~(1 << PD5); // Pin auf 0: Led geht dann ... |
22 | PORTD &= ~(1 << PD6); // Pin auf 0: Led geht dann ... |
23 | _delay_ms(95); |
24 | }
|
25 | }
|
26 | }
|
Wozu sollen eigentlich die _delay_ms gut sein. 95ms sind knapp 1/1000 Sekunde. Das ist eine Zeitdauer, die du nicht bewusst sehen kannst. AUsserdem: Du schaltest dowohl in dem einen Fall, als auch im anderen Fall die LED ein. Da wirst da also wenig Unterschied sehen können und die Fälle unterscheiden können.
1 | int main(void) |
2 | {
|
3 | |
4 | DDRD &= ~(1 << PD2); |
5 | PORTD |= (1 << PD2); |
6 | DDRD |= (1 << PD5); |
7 | DDRD |= (1 << PD6); |
8 | |
9 | while( 1 ) { // mache immer |
10 | |
11 | if (PIND & (1 << PD2)) // wenn Taste nicht gedrückt |
12 | {
|
13 | PORTD |= (1 << PD5); |
14 | _delay_ms(95); |
15 | PORTD |= (1 << PD6); |
16 | _delay_ms(95); |
17 | }
|
18 | |
19 | else // Taste ist gedrückt |
20 | {
|
21 | PORTD &= ~(1 << PD5); |
22 | PORTD &= ~(1 << PD6); |
23 | _delay_ms(95); |
24 | }
|
25 | }
|
26 | }
|
also der ablauf ist so gedacht. durch betätigen des tasters an pd2 soll die if bedingung erfüllt sein und die leds (pd 5 & 6) sollen abwechselnd blinken. bei else sollen beide leds (pd 5 & 6) blinken wenn der taster an pd2 nicht betätigt wurde. was muss ich an meinem programm ändern, dass es so funktioniert, wie ich es beschrieben habe?
Finn A. schrieb: > also der ablauf ist so gedacht. durch betätigen des tasters an pd2 soll > die if bedingung erfüllt sein und die leds (pd 5 & 6) sollen abwechselnd > blinken. bei else sollen beide leds (pd 5 & 6) blinken wenn der taster > an pd2 nicht betätigt wurde. > > was muss ich an meinem programm ändern, dass es so funktioniert, wie ich > es beschrieben habe? Vergiss das Blinken zunächst. Konzentriere dich zunächst auf Ein/Aus (Blinken ist auch nichts anderes als Ein/Aus. Aber mit einer Zeit dazwischen. Aber um Blinken zu können, musst du wissen wie du Einschaltest, bzw. wie du Ausschaltest). Aber Blinken, zusätzlich mit einer Tasterinteraktion ist gar nicht so einfach, wie man zunächst meinen sollte.
ok, dann erst mal ein und aus. also ich habe auf meinem pollin evaluationboard 3 taster und 2 leds. mit dem taster 1 (pd2) die beiden leds (pd5 & pd6) einschalten und taster 2 (pd3) wieder ausschalten. erst mal ein und ausgänge: DDRD &= ~(1 << PD2); // Eingang: Taster 1 PORTD |= (1 << PD2); DDRD &= ~(1 << PD3); // Eingang: Taster 2 PORTD |= (1 << PD3); DDRD |= (1 << PD5); // Ausgang: LED 1 DDRD |= (1 << PD6); // Ausgang: LED 2 richtig oder falsch die angaben?
Finn A. schrieb:
> richtig oder falsch die angaben?
grundsätzlich: ok.
Dazu noch der generelle Programmaufbau
1 | #include <avr/io.h> |
2 | |
3 | int main() |
4 | {
|
5 | ....
|
6 | alle initialisieren |
7 | Datenrichtungen einstellen |
8 | etc. |
9 | |
10 | while( 1 ) { |
11 | |
12 | hier, innerhalb der while-Schleife spielt sich die |
13 | Programmlogik ab |
14 | |
15 | }
|
16 | }
|
und schon bist du mitten drinnen
Finn A. schrieb:
> aber? gibts noch ne andere möglichkeit?
nix aber.
Wie gehts weiter?
Damit hast du ja nur erst mal die Datenrichtungen eingestellt. Das ist
zwar auch wichtig aber noch nicht besonders aufregend.
Wie gehts weiter?
Karl heinz Buchegger schrieb: > Finn A. schrieb: >> aber? gibts noch ne andere möglichkeit? > > nix aber. Ich sollte dazu sagen. Nix aber, solange du verstanden hast, was diese Zeilen machen und warum sie genau so und nicht anderes aussehen.
jetzt will ich ja mit dem taster 1 die schleife starten also leds an und mit dem taster 2 wieder beenden. und an der stelle weiß ich net wie das programm in etwa aufgebaut werden muss. #include <stdlib.h> #include <avr/io.h> #include "util/delay.h" int main(void) { DDRD &= ~(1 << PD2); PORTD |= (1 << PD2); DDRD &= ~(1 << PD3); PORTD |= (1 << PD3); DDRD |= (1 << PD5); DDRD |= (1 << PD6); while (1) { if (PIND & (1 << PD2)) { PORTD ^= _BV(PD5); _delay_ms(500); PORTD ^= _BV(PD6); _delay_ms(500); } else { DDRD |= (1 << PD5); DDRD |= (1 << PD6); _delay_ms(500); PORTD &= ~(1 << PD5); PORTD &= ~(1 << PD6); _delay_ms(500); } } }
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.