mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik _delay_ms() Atmega8 C


Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
_delay_ms(10000);
 auf 100000 erhöht, aber trotzdem sind die Blinkabstände gleich 
geblieben.
Auch die Einstellung
#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
_delay_ms();
die Blinkgeschwindigkeit verändern kann?

Mein Code sieht wie folgt aus:
#define F_CPU 1000000

#include <avr/io.h>
#include <util/delay.h>


void Initialisieren()
{
DDRC = 0xff;
PORTC = 0xff;

}

void Status (unsigned char state)
{

  switch (state)
  {
    case 1:
      PORTC = 0xff;
      PORTC = ~(1<<PC3);  
      break;
    case 2:
      PORTC &= ~(1<<PC2);  
      break;
    case 3:
      PORTC = ~(1<<PC1);    
      break;
    case 4:
      PORTC = ~(1<<PC2);
      break;
  }
}


int main()
{
  Initialisieren();


  while(1)
  {
    Status(1);
    _delay_ms(10000);
    Status(2);
    _delay_ms(10000);
    Status(3);
    _delay_ms(10000);
    Status(4);
    _delay_ms(10000);
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 
;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.