_delay_ms() Atmega8 C

Gast #1944257
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
}
#1944259
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.
Gast #1944295
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 
;-)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.