Forum: Mikrocontroller und Digitale Elektronik Attiny2313 +Drehschalter


von Faisal A. (faisaltu)


Lesenswert?

Hallo Freunde der Unendlichkeit.

Für ein neues Projekt will ich einen Mikrocontroller so programmieren, 
so dass er zusammen mit einem Drehschalter einen Motor zeitlich steuert.

Der Drehschalter hat 12 Positionen, davon verwende ich aber nur 10. 
Einer dieser 10 Pole ist ein OFF bzw. Standby mode. Die anderen sollen 
verschiedene zeitliche Pausen einstellen. "Warum Pausen?" Ja der Mototr 
soll wiederum an einem Eingang des Mikrocontrollers über ein Relais 
geschalten werden. Dafür habe ich 3 Laufzeiten herausgesucht diese dann 
beliebig eingestellt werden(durch Lötbrücken ). Jetzt sollen die 
Schaltpausen zwischen den Laufzeiten des Motors mit Hilfe des 
Drehschalter eingestellt werden.

Wie soll ich das ganze am besten lösen? Wie stelle ich einen Timer 
prezise ein bzw. was für ein Quarz sollte ich da am besten verwenden(so 
klein wie möglich)? Das ganze sollte am besten in C gelöst werden. Kann 
ich die internen Pull-up widerstände ohne großen Aufwand in der Software 
in C aktivieren, oder ist einer externe Beschaltung besser?

DANKE

von Εrnst B. (ernst)


Lesenswert?

Warum überhaupt einen Quarz?

Wie schlimm ist es, wenn der Motor 1% länger läuft als eingestellt?

Einstellung 1 Minute, läuft nur 59 sekunden => Katastrophe oder egal?

Welche Einstellungs-Möglichkeiten hattest du im Sinn?
wenige ms? => schnell takten.
viele Monate oder Jahre => Lieber extern die Zeit beziehen, 
DCF77-Empfänger z.B..

Dazwischen ist die Quarz-Frequenz egal. Ich würde dir als Anfänger aber 
eine vorschlagen, die nicht einer der internen RC-Frequenzen 
entspricht, z.B. 16 MHz, sonst merkst du evtl. nicht wenn wegen falscher 
Fuses der Quarz garnicht verwendet wird.


Und ja, Pullups kann man auch in C aktivieren.

von Faisal A. (faisaltu)


Lesenswert?

Erstmal danke für deinen Einwand. ist für mich auch sehr 
entgegenkommend, da mir eine externes Quarz auch was kostet :-). 
Laufzeiten bei Motor sind 1-3 min. Was ich vergessen habe bzw. falsch 
erklärt habe: An einem Eingang muss eingestellt werden wie die Laufzeit 
des Motors ist (Lötbrücke auf GND), Softwaremäßig muss der jetzt z.B 
3min laufen, dann wird die pause durch Drehschalter eingestellt(9 
Möglichkeiten und 1 x Off) . Motor soll dementsprechend über einen 
Ausgang und einem Relais angesteuert werden. :-D

Grüße

von Mathias O. (m-obi)


Lesenswert?

Quarz kostet was? Die paar Cent.

von Karl H. (kbuchegg)


Lesenswert?

Faisal Alam schrieb:

> Laufzeiten bei Motor sind 1-3 min. Was ich vergessen habe bzw. falsch
> erklärt habe: An einem Eingang muss eingestellt werden wie die Laufzeit
> des Motors ist (Lötbrücke auf GND), Softwaremäßig muss der jetzt z.B
> 3min laufen, dann wird die pause durch Drehschalter eingestellt(9
> Möglichkeiten und 1 x Off) . Motor soll dementsprechend über einen
> Ausgang und einem Relais angesteuert werden. :-D

Ja und.
Wenn wir uns den Motor (bzw. das Relais) durch eine LED ersetzt denken 
und anstatt des Drehschalters eine entsprechende Latte von 10 Tastern, 
dann hat diese 'Transformation' (die ja nichts an der Funktionalität 
ändert) die Aufgabenstellung in einen Bereich gebracht, der in so 
ziemlich jedem Tutorial in den ersten 2 oder 3 'Unterrichtseinheiten' 
besprochen wird (von 25).

AVR-Tutorial
AVR-GCC-Tutorial


Wegen dem Quarz:
Klar kostet der was. Im Vergleich zum Rest ist das aber verschwindend. 
Die Frage ist: wie genau müssen die Zeiten sein? Wenn es egal ist, ob 1 
Minute auch mal 1 oder 2 Millisekunden kürzer oder länger sind, und um 
recht viel mehr wird es sich nicht reissen, dann brauchst du keinen 
Quarz, sondern kannst dein Timeing auch ganz simpel mit _delay_ms 
erreichen. Solange der µC nicht mehr zu tun hat, als diese einfache 
Aufgabenstellung bringt es nichts, da komplexere Methoden, wie zb einen 
Timeransatz, anzuwenden.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Die eigentlich spannenden Fragen wurden ja noch gar nicht angesprochen:
Wie soll vorgegangen werden, wenn während der Pausezeit jemand am 
Drehschalter eine andere Zeit einstellt? Ab wann gilt dann diese Zeit.
Zum Beispiel: Die Pausenzeit ist auf 4 Minuten eingestellt. Die Pause 
läuft gerade und es sind bereits 2 Minuten 40 Sekunden vergangen. Genau 
zu diesem Zeitpunkt dreht jemand am Drehschalter: 3:30, 3:00, 2:30, 
2:00, 1:30 Und nu? Soll der Motor jetzt sofort gestartet werden? Oder 
gilt für diese Pause noch die Zeit von 4:00 von vorher?

Was soll passieren, wenn der Motor gerade in seiner 2 Minuten Laufzeit 
steckt und jemand dreht den Drehsschalter auf 'OFF'. Stoppt der Motor 
dann sofort oder bringt er seinen Zyklus noch hinter sich?

Was ist wenn der Drehschalter auf 'OFF' steht (der Motor steht 
ebenfalls) und jemand beginnt den Schalter zu drehen? Was kommt zuerst? 
Der Motorzyklus oder die Pause?

Die Antwort auf diese Fragen hat unmittelbare Auswirkungen wie man das 
Programm (so simpel es auch ist) aufziehen wird. Daher müssen diese 
Fragen im Vorfeld geklärt werden.

: Bearbeitet durch User
von Faisal A. (faisaltu)


Lesenswert?

Mal wieder danke Karl. Die 1% Fehler können vernachlässigt werden.
Ja du hast recht, das ganze befindet sich eigentlich net in einem hohen 
Niveau.
Im Grunde kann ich dass doch so Programmieren.

1. Eingänge und Ausgänge deklarieren:
- Drehschalter Pole als Eingänge
- Motorlaufzeit als EIngang
- Relais mit Logikverschaltung als Ausgang

2. Zur eigentlichen MAIN:

- Motorlaufzeit,eingänge(3 Möglichekeiten sind geplant:1Min,2min,3mIn):
Falls der Pin auf Low gezogen ist(durch lötbrücke einstellbar): 
Motorausgang auf High (mit delay als timer?)

(If schleife?switch/case?)

-Wenn ein Pin durch den Schalter auf LoW(Gnd) gezogen wird-> delay um 
irgendwas im Sinne von Pause am Ausgang und damit den Pin wieder auf 
LOW(Für jede Drehschalter Position)

So sollte es doch funktionieren, oder?

Eine Frage noch? Der Drehschalter funktioniert ja nicht ganz wie taster, 
da ja bei einem Drehvorgang auch andere Positionen durchgegangen werden 
können. Wie muss ich das in meiner Software mit einplanen? Oder ist das 
vernachlässigbar?

Grüße

von Thomas (kosmos)


Lesenswert?

hast die Einwände von Karl Heinz aber geschickt übergangen.

Überleg dir wann was passieren darf und kann, so musst du dein Programm 
gestallten.

Entweder du ließt die Stellungen deiner Drehschaltungen zu Beginn ein 
und akzeptierst das keine Änderungen mehr oder du musst halt 
schwissendurch nochmal nach den Stellungen schauen und festlegen wie und 
ob du darauf reagierst.

von Faisal A. (faisaltu)


Lesenswert?

Karl Heinz schrieb:
> Die eigentlich spannenden Fragen wurden ja noch gar nicht angesprochen:
> Wie soll vorgegangen werden, wenn während der Pausezeit jemand am
> Drehschalter eine andere Zeit einstellt? Ab wann gilt dann diese Zeit.
> Zum Beispiel: Die Pausenzeit ist auf 4 Minuten eingestellt. Die Pause
> läuft gerade und es sind bereits 2 Minuten 40 Sekunden vergangen. Genau
> zu diesem Zeitpunkt dreht jemand am Drehschalter: 3:30, 3:00, 2:30,
> 2:00, 1:30 Und nu? Soll der Motor jetzt sofort gestartet werden? Oder
> gilt für diese Pause noch die Zeit von 4:00 von vorher?
>
> Was soll passieren, wenn der Motor gerade in seiner 2 Minuten Laufzeit
> steckt und jemand dreht den Drehsschalter auf 'OFF'. Stoppt der Motor
> dann sofort oder bringt er seinen Zyklus noch hinter sich?
>
> Was ist wenn der Drehschalter auf 'OFF' steht (der Motor steht
> ebenfalls) und jemand beginnt den Schalter zu drehen? Was kommt zuerst?
> Der Motorzyklus oder die Pause?
>
> Die Antwort auf diese Fragen hat unmittelbare Auswirkungen wie man das
> Programm (so simpel es auch ist) aufziehen wird. Daher müssen diese
> Fragen im Vorfeld geklärt werden.


Super Fragen. Hab ich mir auch zum Teil überlegt, und will es wie folgt 
lösen:
Also wenn der Drehschalter währrend einem Zyklus umgelegt wird, soll der 
neuer Pausevorgang eingeleitet werde( Vereinfacht das ganze.)
 Der Motor soll immer auf OFF gestellt werden,wenn der SChalter auf OFF 
ist.  Der Motorzyklus ist immer als erstes: ---_______----___ in dem 
Sinne ungefähr:-)



Grüße

von Karl H. (kbuchegg)


Lesenswert?

Faisal Alam schrieb:

> - Motorlaufzeit,eingänge(3 Möglichekeiten sind geplant:1Min,2min,3mIn):
> Falls der Pin auf Low gezogen ist(durch lötbrücke einstellbar):
> Motorausgang auf High (mit delay als timer?)

Nein.

> -Wenn ein Pin durch den Schalter auf LoW(Gnd) gezogen wird-> delay um
> irgendwas im Sinne von Pause am Ausgang und damit den Pin wieder auf
> LOW(Für jede Drehschalter Position)

Würde ich auch nicht machen.

Ich würde es angehen
1
uint16_t MotorLaufzeit;
2
uint16_t PausenZeit;
3
uint16_t aktuelleZeit;
4
5
int main()
6
{
7
  Pins konfigurieren
8
9
  aktuelleZeit = 0;
10
11
  while( 1 ) {
12
13
    MotorlaufzeitBrücken abfragen, analysieren und abhängig davon
14
    einen Wert für MotorLaufzeit festlegen
15
16
    Drehschalter Eingänge abfragen, analysieren welcher geschaltet ist
17
    und abhängig davon die 'PausenZeit' (bzw. für MotorLaufzeit im Falle
18
    von 'OFF') festlegen
19
20
    aktuelleZeit++;
21
22
    if( aktuelleZeit > PausenZeit && MotorLaufzeit != 0)
23
      Motor einschalten
24
25
    if( aktuelleZeit > PausenZeit + MotorLaufzeit ) {
26
      Motor ausschalten
27
      aktuelleZeit = 0;
28
    }
29
30
    _delay_ms( 1.0 );
31
  }
32
}

Der Kern der Sache besteht darin, dass ich die Durchlaufzeit durch die 
while Schleife auf ungefähr 1 Millisekunde einstelle (durch das 
'Beiwerk' wird es etwas länger sein).
Und dann greift das Prinzip: Um 1 Sekunde zu warten, kann man auch 1000 
mal 1 Millisekunde warten. D.h. Wenn du die Pausenzeit auf zb 1200 
stellst, dann dauert es 1200 Durchläufe durch die while Schleife (die 
jedesmal 1 Millisekunde daueren) ehe aktuelle Zeit auf 1200 erhöht 
wurde. Ab 1201 ist die aktuelle Zeit dann größer als die Pausenzeit 
(oder mit anderen Worten: die Pause ist vorbei) und der Motor wird 
eingeschaltet. Irgendwann ist dann auch noch die gewollte Laufzeit des 
Motors abgelaufen und der Motor wird wieder ausgeschaltet. Der nächste 
Zyklus beginnt, indem aktuelleZeit wieder bei 0 zu zählen anfängt.

So ein Ansatz scheint mir am geeignetsten um auch auf Änderungen an den 
Einstellungen zu reagieren, während gerade eine Zeit abgezählt wird.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Faisal Alam schrieb:

> Der Motorzyklus ist immer als erstes

OK.
Auch kein Problem. Dann dreht sich eben einfach die Zyklenreihenfolge 
um.
1
...
2
    if( aktuelleZeit < MotorLaufzeit )
3
      Motor einschalten
4
5
    else if( aktuelleZeit < PausenZeit + MotorLaufzeit ) {
6
      Motor ausschalten
7
    }
8
9
    else
10
      aktuelleZeit = 0;
11
...

Alles nur eine Frage dessen, welche Millisekunden-'Zahl' welchen Zyklus 
(Pause oder Motor) bedeuten soll.
Steht der Drehschalter auf OFF, dann wird einfach ständig bei der 
Auswertung des Drehschalters die Motorlaufzeit und die aktuelle Zeit auf 
0 gezwungen (einfach 0 zuweisen). Dadurch wird
1
    if( aktuelleZeit < MotorLaufzeit )
nie true und in Folge wird der Motor nicht eingeschaltet. Dadurch, dass 
auch die aktuelle Zeit auf 0 gesetzt wird, wird erreicht, dass erst bei 
wegdrehen aus 'OFF' die aktuelleZeit wieder hochzählen kann. Voila: der 
erste Motorzyklus läuft die festgelegte Zeit und der Motor wird 
eingeschaltet (weil ja dann MotorLaufzeit nicht mehr 0 ist)

: Bearbeitet durch User
von Faisal A. (faisaltu)


Lesenswert?

Ok. Das ganze verkleiner jetzt enorms die Größe des COdes. Danke Karl.

von Karl H. (kbuchegg)


Lesenswert?

Es ist eigentlich die ganz normale Sichtweise, wie man meistens an ein 
µC Programm rangeht.
Weg von der Betrachtung von 'Zeiträumen', sondern hin zu:
Alle x Zeiteinheiten 'erwacht' das Programm, sieht sich um und bestimmt 
anhand der aktuellen Situation und irgendwelcher Variablen, was zu tun 
ist.

Bei dir ist das dann eben: Wenn das Programm zb alle 1 Millisekunden 
erwacht, dann muss es eben mitzählen, wie oft es erwacht ist und nach 
dem 1000-ten erwachen ist 1 Sekunde vergangen. Jetzt brauchst du halt 
nur noch anstatt der 1000 eine Zahl, die die von dir gewählte Zeit 
repräsentiert.


PS: Ich merke gerade, dass sich das so mit den Zeiten nicht ausgehen 
wird. Du hast ja Zeiten im Minutenbereich. Ein uint16_t kann aber nicht 
größer als 65565 werden. D.h. das wären maximal 65 Sekunden, was zu 
wenig ist.
OK, dann legst du eben die Durchlaufzeit auf 10 Millisekunden, wodurch 
ein uint16_t für 650 Sekunden reicht, oder eben knapp 10 Minuten. An der 
Bedienbarkeit ändert das nichts. Als Mensch kannst du eine Reaktion auf 
einen Schaltvorgang nach 10 Millisekunden nicht wirklich von einer 
Reaktion nach 1 Millisekunde unterscheiden.

: Bearbeitet durch User
von Faisal A. (faisaltu)


Lesenswert?

Ich habe sogar vor, Positionen am Schalter mit viel höhehren Pauszeiten 
zu implementieren. Als die letzte stufe sollte so 60 Minuten Pause 
haben. Hmm wird das trotzdem so funktionieren ?

Grüße

von Dieter F. (Gast)


Lesenswert?

Ist zwar off-topic, aber ich habe zufällig etwas Popcorn zur Hand :-)

von Karl H. (kbuchegg)


Lesenswert?

Faisal Alam schrieb:
> Ich habe sogar vor, Positionen am Schalter mit viel höhehren Pauszeiten
> zu implementieren. Als die letzte stufe sollte so 60 Minuten Pause
> haben. Hmm wird das trotzdem so funktionieren ?

Was solls. Dann nimmst du eben uint32_t anstatt der uin16_t. Mit einem 
uin32_t kannst du bis 4294967295 zählen. Bei 1 Millisekunde Auflösung 
wären das dann 4294967 Sekunden oder 71582 Minuten oder 1193 Stunden 
oder 49 Tage.

Das dürfte ja dann doch für so ziemlich alles reichen.

Und ob der Tiny mit 32 Bit rummachen muss anstatt mit 16 Bit, ist auch 
schon egal. Er hat ja sonst ohnehin nichts zu tun. Zur Not muss man eben 
den
1
     _delay_ms( 1.0 );
gegen ein
1
     _delay_ms( 0.9 );
austauschen, um den Zeitanteil der restlichen Teile in der Schleife zu 
'berücksichtigen'. (Wobei ich die 0.9 jetzt geschätzt habe)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Dieter Frohnapfel schrieb:
> Ist zwar off-topic, aber ich habe zufällig etwas Popcorn zur Hand :-)

Ich nehm eine Portion.
Merci

von Dieter F. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Ich nehm eine Portion.

Gerade in die Unendlichkeit gebeamt :-)

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Auch wenn ich damit vermutlich nichts zur Lösung beitrage, so frage ich 
mich bei solchen Fragen jedes mal, warum Menschen die sich vorgenommen 
haben ein Steuerungsproblem mit einem µC zu lösen -besonders wenn es 
sich um so etwas einfaches und banales wie hier handelt- sich nicht 
vorher ein wenig mit der Materie beschäftigen. So etwas kann vermutlich 
ein 10 Jähriger nach der Lektüre eines Anfängerbuches lösen. Was ich 
sagen will: Mit der Technologie die an benutzen möchte sollte man sich 
ein wenig auseinander setzen und sich nicht alles von anderem Vorkauen 
lassen.

von Dieter F. (Gast)


Lesenswert?

Thomas Holmes schrieb:
> Auch wenn ich damit vermutlich nichts zur Lösung beitrage,

Ein Ruf aus der Unendlichkeit - der 13. Apostel ist gefunden! Ostern 
kann kommen ... :-)

von Faisal A. (faisaltu)


Lesenswert?

Karl Heinz schrieb:
> Faisal Alam schrieb:
>> Ich habe sogar vor, Positionen am Schalter mit viel höhehren Pauszeiten
>> zu implementieren. Als die letzte stufe sollte so 60 Minuten Pause
>> haben. Hmm wird das trotzdem so funktionieren ?
>
> Was solls. Dann nimmst du eben uint32_t anstatt der uin16_t. Mit einem
> uin32_t kannst du bis 4294967295 zählen. Bei 1 Millisekunde Auflösung
> wären das dann 4294967 Sekunden oder 71582 Minuten oder 1193 Stunden
> oder 49 Tage.
>
> Das dürfte ja dann doch für so ziemlich alles reichen.
>
> Und ob der Tiny mit 32 Bit rummachen muss anstatt mit 16 Bit, ist auch
> schon egal. Er hat ja sonst ohnehin nichts zu tun. Zur Not muss man eben
> den
>
1
>      _delay_ms( 1.0 );
2
>
> gegen ein
>
1
>      _delay_ms( 0.9 );
2
>
> austauschen, um den Zeitanteil der restlichen Teile in der Schleife zu
> 'berücksichtigen'. (Wobei ich die 0.9 jetzt geschätzt habe)

So ich habe mittlerweile mal wieder was für dieses Projekt getan, und 
den code so wie empfohlen geschrieben. @Karl meintest du das so?
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
uint32_t MotorLaufzeit;
5
uint32_t PausenZeit;
6
uint32_t aktuelleZeit;
7
8
9
int main(void)
10
{   //Eingänge konfigurieren
11
  DDRB &= ~(1 << PB0);  //Brücke2(Laufzeit Mot2)3Min
12
  DDRB &= ~(1 << PB1);  //Brücke 3(Laufzeit Mot3)2Min
13
  DDRB &= ~(1 << PB5);  //Brücke 1(Laufzeit Mot1)1Min
14
  
15
  
16
  
17
  DDRB &= ~(1 << PB2);  // Schalterstufe 8( 3 Min Pause)
18
  DDRB &= ~(1 << PB3);  // Schalterstufe 9( 2 Min Pause)
19
  DDRB &= ~(1 << PB4);  // Schalterstufe 10( 1 Min Pause)
20
  DDRD &= ~(1 << PD0);  // Schalterstufe 1 (Standby)
21
  DDRD &= ~(1 << PD1);  // Schalterstufe 2( 60 Min Pause)
22
  DDRD &= ~(1 << PD2);  // Schalterstufe 3( 40 Min Pause)
23
  DDRD &= ~(1 << PD3);  // Schalterstufe 4( 20 Min Pause)
24
  DDRD &= ~(1 << PD4);  // Schalterstufe 5( 10 Min Pause)
25
  DDRD &= ~(1 << PD5);  // Schalterstufe 6( 8 Min Pause)
26
  DDRD &= ~(1 << PD6);  // Schalterstufe 7( 5 Min Pause)
27
  
28
  //Ausgänge konfigurieren
29
  DDRB |= (1 << PB6);  // Ausgang zum Relais bzw. zum Transistor
30
  
31
  //Pull-Up Widerstände aktivieren
32
  PORTB |= (1 << PB0); 
33
  PORTB |= (1 << PB1);
34
  PORTB |= (1 << PB5);
35
  PORTB |= (1 << PB2);
36
  PORTB |= (1 << PB3);
37
  PORTB |= (1 << PB4);
38
  PORTD |= (1 << PD0);
39
  PORTD |= (1 << PD1);
40
  PORTD |= (1 << PD2);
41
  PORTD |= (1 << PD3);
42
  PORTD |= (1 << PD4);
43
  PORTD |= (1 << PD5);
44
  PORTD |= (1 << PD6);
45
  
46
  
47
  
48
  aktuelleZeit = 0;
49
  
50
  
51
  
52
    while(1)
53
    {
54
       if(!(PINB & (1<<PB5)))  // Motorlaufzeit auf 1 Min)
55
     { MotorLaufzeit = 60000   ;
56
     }
57
     
58
     
59
    else if (!(PINB & (1<<PB1))) //Motorlauftzeit auf 2min
60
     { MotorLaufzeit = 120000  ;
61
     } 
62
     
63
     
64
    else if( !(PINB & (1<<PB0)))  // Motorlaufzeit auf 3min
65
     { MotorLaufzeit = 180000 ;
66
     }
67
     
68
    
69
    
70
     if (!(PINB & (1<<PB2)))//3Min
71
     { PausenZeit = 180000;
72
     } 
73
     
74
     else if(!(PINB & (1<<PB3)))//2Min
75
     { PausenZeit = 120000;
76
     }
77
     
78
     else if(!(PINB & (1<<PB4)))//1Min
79
     {PausenZeit= 60000;
80
    }
81
    
82
     else if(!(PIND &(1<<PD0)))//OFF Zustand
83
     { MotorLaufzeit = 0; 
84
    }
85
     
86
     else if(!(PIND &(1<<PD1)))//60Min
87
     { PausenZeit= 3600000;
88
     }
89
     
90
     else if(!(PIND & (1<<PD2)))//40Min
91
     { PausenZeit= 2400000;
92
       
93
     }
94
     else if(!(PIND & (1<<PD3)))//20Min
95
     {PausenZeit= 1200000;
96
      }
97
     
98
     else if(!(PIND & (1<<PD4)))//10Min
99
     {PausenZeit= 600000;
100
      }
101
     
102
     else if(!(PIND & (1<<PD5)))//8Min
103
     {PausenZeit=480000;
104
      }
105
     
106
     else if(!(PIND & (1<<PD6)))//5Min
107
     {PausenZeit=350000;
108
       }
109
     
110
     aktuelleZeit++;
111
     
112
     if(aktuelleZeit<MotorLaufzeit)
113
     { PORTB |= (1 << PB6);//Motor einschalten
114
       
115
     }
116
     
117
     else if(aktuelleZeit<PausenZeit+MotorLaufzeit)
118
     {   PORTB &= ~(1 << PB6); //Motor ausschalten
119
     }
120
     else { aktuelleZeit = 0;
121
     }
122
     
123
     _delay_ms(0.9);
124
    }
125
     }

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Testen musst du schon selber.

Tip fürs nächste mal: nicht gleich alles auf einmal.
Für deine Erstversion braucht es die ganzen 48 
Konfigurationsmöglichkeiten alle nicht. Du willst in der Erstversion 
wissen, ob die Motorsteuerung an sich funktioniert. Dazu willst du kein 
Programm, dass sich über 27 Bildschirmseiten hinzieht, sondern das 
überschaubar sich auf einer Bildschirmseite abspielt. Frei nach dem 
Motto: Wenn das Prinzip stimmt ... um mehr Möglichkeiten erweitern kann 
ich es immer noch. Aber erst mal will ich wissen, ob das Prinzip stimmt.

Funktioniert es denn?

: Bearbeitet durch User
von Faisal A. (faisaltu)


Lesenswert?

Karl Heinz schrieb:
> Testen musst du schon selber.
>
> Tip fürs nächste mal: nicht gleich alles auf einmal.
> Für deine Erstversion braucht es die ganzen 48
> Konfigurationsmöglichkeiten alle nicht. Du willst in der Erstversion
> wissen, ob die Motorsteuerung an sich funktioniert. Dazu willst du kein
> Programm, dass sich über 27 Bildschirmseiten hinzieht, sondern das
> überschaubar sich auf einer Bildschirmseite abspielt. Frei nach dem
> Motto: Wenn das Prinzip stimmt ... um mehr Möglichkeiten erweitern kann
> ich es immer noch. Aber erst mal will ich wissen, ob das Prinzip stimmt.
>
> Funktioniert es denn?

Ich muss leider noch mit dem Test warten, habe die Platine mit der es 
arbeiten soll erst bestellt :-).

von Karl H. (kbuchegg)


Lesenswert?

Und noch ein Tip:
1
     else if(aktuelleZeit<PausenZeit+MotorLaufzeit)
man darf sich ruhig Programmtext durch die Verwendung von Leerzeichen 
ein bischen lesbar gestalten. Seit du 6 Jahre als bist, hast du dein 
Gehirn darauf trainiert, dass zwischen 'Wörtern' in einem Text ein 
Leerraum steht. Benutze doch diese Konditionierung um dir das Lesen des 
Programms leichter zu machen. Die paar Sekunden, die du dazu brauchst um 
die Leerezeichen einnzufügen, sind gut investierte Zeit. Programmtext 
schreibt man einmal und ändert ihn manchmal noch ein paar mal. Aber man 
liest ihn viel öfter als man mit Schreiben an ihm verbringt.
1
     else if( aktuelleZeit < (PausenZeit + MotorLaufzeit) )

(ob man die rechte Seite in eine Klammer setzt um aus 2 Meter Entfernung 
erkennbar zu machen, dass hier ein Ausdruck steht, ist Ansichtssache. 
Notwendig wäre es nicht. Aber bei der Formatierung von Quelltext geht es 
nicht nur primär darum, was laut Sprachregeln notwendig wäre, sondern 
auch darum, welche 'Lesefehler' ich vermeiden will bzw. welche 
'Leseführung' ich meinem Code-Leser geben will.)

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