Hallo zusammen,
Bin neu hier im Forum, von daher erstmal ein freundlichen "Hallo".
Ich komme aus der nähe von Bayreuth und bin 16 Jahre alt.
Falls ich im Falschen Bereich gelandet bin bitte verschieben ;-) .
Jetzt aber mein Problem:
Ich will eine Steuerung Realisieren, die ähnlich wie eine
Garagentorsteuerung funktioniert (ist zum heben und senken einer
Schneekanonenlanze).
Bin mit dem Schaltplan schon soweit fertig, das ganze ist auch schon auf
einer Lochrasterplatine aufgebaut.
Jetz gehts ans Programmieren. Ich hab mir da schon gedanken drüber
gemacht und auch mal mein glück probiert. Doch leider macht der ATmega8
nicht das was er soll, um genau zu sein, er macht garnichts. Ich
probiere das ganze auf einem AVR evaluationsboard + addonboard von
pollin.de aus. statt den Relais nehme ich da halt die LED's.
Die funktion:
vielleicht kann man es ja aus meinem Programmversuch herauslesen:
Die richtung des Motors bestimmt PC1 und ob der motor läuft oder nicht
PC0, den summer kann man erstmal vernachlässigen.
wenn jetzt einer der beiden "down" taster gedrückt wird, soll der motor
runter fahren, das gegenteil bei "up" und "stop" erklärt sich glaub ich
mal von selbst.
es gibt je zwei taster, da es eine hauptstelle und eine ausenstelle
gibt, die ausenstelle soll abschaltbar sein. Dies soll über den taster
an PC3 geschehen. Wenn die ausenstelle deaktiviert ist soll der stop
knopf aus sicherheitsgründen aber trotzdem funktionieren.
Es sind auch zwei Endschalter verbaut, was die sollen ist glaub ich auch
verständlich.
Hier mein code bis jetzt:
1 | #include <avr/io.h>
|
2 |
|
3 | void stop()
|
4 | {
|
5 | PORTC &= ~(1<<PC0);
|
6 | PORTC &= ~(1<<PC2);
|
7 | }
|
8 |
|
9 | void move(uint16_t dir)
|
10 | {
|
11 | switch (dir)
|
12 | {
|
13 | case 0:
|
14 | PORTC |= (1<<PC1);
|
15 | PORTC |= (1<<PC2);
|
16 | PORTC |= (1<<PC0);
|
17 | break;
|
18 | case 1:
|
19 | PORTC &= ~(1<<PC1);
|
20 | PORTC |= (1<<PC2);
|
21 | PORTC |= (1<<PC0);
|
22 | break;
|
23 | }
|
24 | }
|
25 |
|
26 |
|
27 | int main(void)
|
28 | {
|
29 |
|
30 | PORTD = 0xFF;
|
31 | PORTB = 0xFF;
|
32 | PORTC = 0x00;
|
33 | PORTC |= (1<<PC3);
|
34 | DDRB = 0x00;
|
35 | DDRC = 0xFF;
|
36 | DDRC &= ~(1 << DDC3);
|
37 | DDRD = 0x00;
|
38 |
|
39 | DDRB &= ~((1 << DDB3) | (1 << DDB4));
|
40 |
|
41 | uint8_t dir;
|
42 | uint8_t out;
|
43 | dir = 0;
|
44 | out = 1;
|
45 |
|
46 | while(1)
|
47 | {
|
48 | if ( !(PIND & (1<<PIND2)) )
|
49 | {
|
50 | move(1);
|
51 | dir = 1;
|
52 | }
|
53 | if ( !(PIND & (1<<PIND4)) )
|
54 | {
|
55 | move(0);
|
56 | dir = 0;
|
57 | }
|
58 | if ( !(PIND & (1<<PIND3)) )
|
59 | {
|
60 | stop();
|
61 | while ( !(PIND & (1<<PIND3)) )
|
62 | {
|
63 |
|
64 | }
|
65 | }
|
66 | if ( !(PINB & (1<<PINB0)) )
|
67 | {
|
68 | if (dir == 0)
|
69 | {
|
70 | stop();
|
71 | }
|
72 | }
|
73 | if ( !(PINB & (1<<PINB1)) )
|
74 | {
|
75 | if (dir == 1)
|
76 | {
|
77 | stop();
|
78 | }
|
79 | }
|
80 | if ( !(PIND & (1<<PIND7)) )
|
81 | {
|
82 | if (out == 1)
|
83 | {
|
84 | move(1);
|
85 | dir = 1;
|
86 | }
|
87 | }
|
88 | if ( !(PIND & (1<<PIND5)) )
|
89 | {
|
90 | if (out == 1)
|
91 | {
|
92 | move(0);
|
93 | dir = 0;
|
94 | }
|
95 | }
|
96 | if ( !(PIND & (1<<PIND6)) )
|
97 | {
|
98 | stop();
|
99 | while ( !(PIND & (1<<PIND6)) )
|
100 | {
|
101 |
|
102 | }
|
103 | }
|
104 | if ( !(PINC & (1<<PINC3)) )
|
105 | {
|
106 | switch (out)
|
107 | {
|
108 | case 1:
|
109 | out = 0;
|
110 | break;
|
111 | case 0:
|
112 | out = 1;
|
113 | break;
|
114 | }
|
115 | while ( !(PINC & (1<<PINC3)) )
|
116 | {
|
117 |
|
118 | }
|
119 | }
|
120 | }
|
121 | }
|
dir steht für direction, also richtung und out ist der zustand der
ausenstelle.
So, jetz hab ich sehr viel geschrieben, ich hoffe mir kann jemand
helfen.
Wer rechtschreibfehler findet darf sie behalten, und da gibts bei mir
immer genung davon ;-)
Danke schonmal jetzt.
MfG
atmega-bastler