Forum: Mikrocontroller und Digitale Elektronik Atmega8: ähnlich garagentorsteuerung programmieren


von Philipp H. (atmega-bastler)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Philipp H. (atmega-bastler)


Lesenswert?

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 ;-)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter R. (pnu)


Lesenswert?

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

: Bearbeitet durch User
von Philipp H. (atmega-bastler)


Angehängte Dateien:

Lesenswert?

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 ;-)

von Karl H. (kbuchegg)


Lesenswert?

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!

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.