Forum: Mikrocontroller und Digitale Elektronik _delay_ms() Atmega8 C


von Der Lars (Gast)


Lesenswert?

Moin moin,

ich häng da schonwieder an einem Problem...
Ich habe eine Ampelschaltung, die LED´s möchte ich mit Hilfe von 
_delay_ms() abwechselnd schalten.

Mein Problem ist, dass es mir nicht möglich ist, die Blinkabstände zu 
regulieren.
Ich habe
1
_delay_ms(10000);
 auf 100000 erhöht, aber trotzdem sind die Blinkabstände gleich 
geblieben.
Auch die Einstellung
1
#define F_CPU 1000000
 kann ich beliebig verändern ohne dass sich was am Blinkzyklus ändert.

Das einzige was einen Erfolg hat ist, wenn ich die Fuses von
"Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms"
auf
"Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms" setze.
Dann blinkt es etwas langsamer.
Ich brauche aber für ein weiteres Projekt, was später auch auf die 
Platine soll die 8MHz.

Wie bekomme ich es hin, dass ich durch verändern von
1
_delay_ms();
die Blinkgeschwindigkeit verändern kann?

Mein Code sieht wie folgt aus:
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
void Initialisieren()
8
{
9
DDRC = 0xff;
10
PORTC = 0xff;
11
12
}
13
14
void Status (unsigned char state)
15
{
16
17
  switch (state)
18
  {
19
    case 1:
20
      PORTC = 0xff;
21
      PORTC = ~(1<<PC3);  
22
      break;
23
    case 2:
24
      PORTC &= ~(1<<PC2);  
25
      break;
26
    case 3:
27
      PORTC = ~(1<<PC1);    
28
      break;
29
    case 4:
30
      PORTC = ~(1<<PC2);
31
      break;
32
  }
33
}
34
35
36
int main()
37
{
38
  Initialisieren();
39
40
41
  while(1)
42
  {
43
    Status(1);
44
    _delay_ms(10000);
45
    Status(2);
46
    _delay_ms(10000);
47
    Status(3);
48
    _delay_ms(10000);
49
    Status(4);
50
    _delay_ms(10000);
51
  }
52
}

von Karl H. (kbuchegg)


Lesenswert?

Der Lars schrieb:

> Ich brauche aber für ein weiteres Projekt, was später auch auf die
> Platine soll die 8MHz.

OK.
Stell auf 8Mhz ein.


F_CPU musst du dann logisherweise auch auf 8000000 stellen.


> _delay_ms(10000);

10000 ist zuviel.
6.5 Sekunden sind das Maximum dessen was geht.
Aber es steht dir natürlich frei aus mehreren kurzen Wartezeiten eine 
längere zusammenzusetzen.


Später wirst du irgendwann mal lernen, dass man so lange Watrezeiten 
nicht mit delay realisiert sondern mit einem Timer und abzählen.

von Der Lars (Gast)


Lesenswert?

Vielen Dank für deine Hilfe.

Ich glaube ich nehme dann doch den Timer. Ich wollte den eigentlich 
nicht nehmen, weil ich mir den für das andere Projekt aufsparen wollte.
Aber Somit nutz ich das als weitere kleine Übung mit dem Timer umzugehen 
;-)

von Karl H. (kbuchegg)


Lesenswert?

Der Lars schrieb:
> Vielen Dank für deine Hilfe.
>
> Ich glaube ich nehme dann doch den Timer.

Spätestens wenn deine Ampel eine Fussgängertaste bekommt, wirst du mit 
den delays am Ende angelangt sein. Allerdings erfordert ein Timer einen 
etwas anderen Ansatz, als das was du da gemacht hast.

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.