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
voidstop()
4
{
5
PORTC&=~(1<<PC0);
6
PORTC&=~(1<<PC2);
7
}
8
9
voidmove(uint16_tdir)
10
{
11
switch(dir)
12
{
13
case0:
14
PORTC|=(1<<PC1);
15
PORTC|=(1<<PC2);
16
PORTC|=(1<<PC0);
17
break;
18
case1:
19
PORTC&=~(1<<PC1);
20
PORTC|=(1<<PC2);
21
PORTC|=(1<<PC0);
22
break;
23
}
24
}
25
26
27
intmain(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_tdir;
42
uint8_tout;
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
case1:
109
out=0;
110
break;
111
case0:
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
> Doch leider macht der ATmega8 nicht das was er soll, um genau zu sein, er macht
garnichts.
Dafür hast du aber schon eine Menge Programm!
Mach doch erst mal die EInfachversion: 1 Taster, 1 Ausgang.
Bei Tasterbetätigung wird der 1 Ausgang entsprechend gestellt.
Es hat wenig Sinn, da jetzt komplexe Logiken zu implementieren, wenn
noch gar nicht sicher gestellt ist, dass der Mega grundsätzlich
funktioniert.
Im übrigen dürfte der Ansatz über die Tasten nicht so der prickelnde
Ansatz sein.
Drehs lieber um. Fasse die Lanze als 'in einem Zustand' auf. Sie
wechselt bei welcher Tastenbetätigung in welchen anderen Zustand?
Statemachine
Aber teste erst mal die Hardware durch: 1 Taster - 1 Ausgang. Dann den
nächsten Taster etc.
(es sei denn du hast das schon gemacht, auch wenn dein Eröffnungsposting
nicht danach klingt)
Und nochwas:
Schrittweise arbeiten!
Nicht alles auf einmal implementieren.
Für dein erstes Programm reicht es völlig, wenn du nur 3 Taster im
System hast. 'Rauf' 'Runter' 'Stop' und damit 2 Ausgänge bedienst:
'Eingeschaltet' und 'Richtung'. D.h. für dein allererstes Programm
reichen sogar nur 2 Schalter und 1 Ausgang - "Rauf" und "Stop, bzw.
"Eingeschaltet".
Wenn das dann funktioniert, dann kommt der Rest dazu, wie zb
Endschalter, wie zb 2.te Aussenstelle. Aber auch hier wieder: nicht
alles auf einmal, sondern schrittweise, eines nach dem anderen und
dazwischen ausgiebig testen.
Hallo,
danke für die schnelle antwort.
Der mega sollte schon funktionieren, ich hab das prog auf drei megas
ausprobiert, und keiner tut etwas :(
das mit der Statemachine werde ich mir mal anschauen.
Und das mit dem schrittweise Testen werde ich auch machen ;-)
Philipp H. schrieb:> Hallo,> danke für die schnelle antwort.> Der mega sollte schon funktionieren,
Von 'sollte' kann man sich nichts kaufen.
Entweder er funktioniert, oder er funktioniert nicht.
> Und das mit dem schrittweise Testen werde ich auch machen ;-)
Das ist das wichtigste.
Denn sonst stehst du immer wieder an genau an dem Punkt, an dem du jetzt
stehst: relativ viel Programm (für dich noch zu viel) und keine Ahnung
wo man mit der Suche anfangen soll.
So fürs Erste:
Wer ein 40-Zeilenprogramm schreibt, es einschaltet und denkt, dass es
prompt läuft? ... der glaubt auch an den Weihnachtsmann.
An so etwas muss man Schritt für Schritt rangehen. Und immer wieder
durch prüfen, ob das Programm bis jetzt richtig läuft.
Erst mal an PC0 und an PC1 LEDs anschließen und die mit einer Taste
zusammen zur Funktion bringen.
Dann eine zweite Taste ins Programm aufnehmen.
erst mal die Richtungsumschaltung realisieren.
Dann die Wartezeiten beim Umschalten (ein Motor mag nicht, schlagartig
von vor auf rück geschaltet werden, eine Stop-Zeit wäre gut).
dann die Endschalter integrieren
usw.
aref sollte nicht mit AVCC verbunden sein.
Wozu soll die reset-Taste sein? die verwendet man normalerweise nicht.
oder bezeichnet sie als Neustart. Ein Stop koppelt man mit einer roten
Anzeige- LED als Hinweis, dass was passiert ist. Generell wären LEDs
gut, um die Zustände der Steuerung anzuzeigen z.B. Außenstelle
eingeschaltet oder nicht. Auch bei der Fehlersuche sind solche Anzeigen
sehr nützlich
Als Programmstruktur wäre eine state machine genau das passende
Hallo nochmal,
Also, das mit der statemachine habe ich mir mal angeschaut (siehe
anhang).
Es sind lampen (kleine Glühlämpchen) vorhanden, die hängen mit jweils
ner diode direkt im der leitung des Motors.
Anzeige led's für die ausenstelle will ich auch noch mit ins spiel
bringen.
Aref und VCC werde ich trennen, brauche sowieso kein ADC.
Der UART kommt übrigens irgentwann auch mal noch ins spiel, aber dazu
wird dann wahrscheinlich nochmal nen eigenen Beitrag geben ;-)
Ich hab hier nämlich ein AVR NET IO rumfliegen, an das würde ich dann
nochmal nen Mega32 ranhängen und mir für die kommunikation ein eigenes
protokoll ausdenken. Die original pollin software lässt sich nämlich
leicht mit php ansteuern und um die umzuschreiben hab ich eh zu wenig
kenntnisse. Der mega32 soll dann noch paar andere sachen steuern und
bekommt auch ein LCD mit menü. Und dann die UART verbindung zwischen den
beiden damit man das ganze vom PC oder handy steuern kann ;-)
Aber das dauert alles noch.
Ich werde mich jetz mal ans neue programm machen ;-)
Philipp H. schrieb:> Also, das mit der statemachine habe ich mir mal angeschaut (siehe> anhang).
Sieht nicht schlecht aus.
Aber auch hier wieder: Nicht alles auf einmal.
Ignorier fürst erste die Endschalter. Je mehr du von Anfang drinnen
hast, um so blöder ist es.
Um es ganz klar zu sagen:
Dein erstes Programm willst du so einfach wie möglich haben! Dafür
schmeisst du erst mal alles raus, was du für den ersten Funktionstest
nicht brauchst.
Erweitern kannst du immer noch.
Aber erst mal brauchst du ein Programm, welches läuft!