C Anfängerfrage While-Schleife

Flex

Neues Mitglied
19. Okt. 2011
24
0
0
Sprachen
Hallo,
ich bin gerade von Bascom auf C umgestiegen. Ich habe mit AVR Studio 5 ein kleines Programm entwickelt, dass ein Lauflicht darstellen soll. Jetzt möchte ich eine Variable einfügen, die nache jedem Durchgang um +1 erhöht wird. Wenn das Lauflicht 10x durchgelaufen ist, dann soll das Programm in die While Schleife Springen und dort einen kurzen Code ausführen und dann wieder von vorne anfangen. Mein Problem ist es jetzt, das erstellen einer Variable und die Erstellung einer While Schleife.
Das ist mein Code:
Code:
#include <avr/io.h> 
#include <util/delay.h>             

#define F_CPU 8000000UL

int main(void)
{
    DDRC = 0b11111111;                      
    while(1)
    {
        PORTC = 0b00000000;  
        _delay_ms(500);
		
		PORTC = 0b00000001;  
        _delay_ms(500);                

        PORTC = 0b00000011;            
        _delay_ms(500);    
		
		PORTC = 0b00000111;
		_delay_ms(500);  
		
		PORTC = 0b00001111;
		_delay_ms(500);  
	
		PORTC = 0b00011111;
		_delay_ms(500);  
		
		PORTC = 0b00111111;
		_delay_ms(500);  
		
		PORTC = 0b01111111;
		_delay_ms(500); 
		
		PORTC = 0b11111111;
		_delay_ms(500);   	
	}
}
Was mir auch noch aufgefallen ist, dass die Pausen keine 500ms sind. Liegt das an dem Quarz?

Gruß
Flex
 
Hallo Flex,

ich weiß nun nicht genau, was du in der zweiten while Schleife machen möchtest, bzw. mit welcher Bedingung diese beendet werden soll, aber vielleicht hilft dir folgendes weiter:

Code:
int main(void)
{
  uint8_t i;
  // Initialisierungen

  i = 0;
  while (1)
  {

    // hier dein Lauflicht

    i++;
    if (10 == i)
    {
      i = 0;

      // hier deine while-Schleife      
    }

  }

  return 0;
}

Wegen der Systemfrequenz:
Ist die Taktquelle richtig eingestellt (vielleicht möchtest du den Quarzoszillator verwenden und es ist noch der interne RC-Ostillator aktiviert)?
Vielleicht ist auch das Fusebit CKDIV8 (falls es das bei deinem Mikrocontroller gibt) aktiviert, der Systemtakt wird dann nochmal durch 8 geteilt.
Definiere mal F_CPU vor #include <util/delay.h>.

Grüße,
Dirk
 
Danke Dirk, es hat geklappt wie ich mir das vorstelle.
Vielleicht ist auch das Fusebit CKDIV8 (falls es das bei deinem Mikrocontroller gibt) aktiviert, der Systemtakt wird dann nochmal durch 8 geteilt.
Es ist ein ATmega32, aber das Fusebit ist nicht verfügbar. Ich habe auch das mit dem verschieben vor delay.h versucht, aber es bringt nichts. Unter Bascom habe ich es doch auch geschafft, nur hier will es nicht klappen.

Gruß
Felx
 
Hallo Flex,

gibt es warnings bezüglich _delay_ms oder delay.h. Eventuell nutzt du eine ältere Version, bei der _delay_ms lediglich 8Bit als Parameter verfügt.
Damit wären nur Werte bis 255 möglich. Schreibe testweise einfach mal anstelle _delay_ms(500) zweimal _delay_ms(250).

Schau auch mal in die Projekteinstellungen. Wurde hier vielleicht F_CPU mit einem anderen Wert definiert?

Mehr fällt mir jetzt eigentlich nicht ein.

Gruß,
Dirk
 
Hallo,
ich habe es jetzt geschafft. Ich verstehe aber nicht, warum es jetzt klappt, vielleicht kann es mir ja jemand erklären.
Code:
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <util/delay.h>

Gruß
Flex
 
Hallo Flex,

was passiert denn, wenn du die bedingte Compileranweisung entfernst? Es dürfte nichts ausmachen, wenn F_CPU zuvor nicht definiert wurde :)

Also so:
Code:
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>


Übrigens:
Falls vor delay.h kein F_CPU definiert wurde, warnt dies der Compiler (bzw. delay.h) und definiert selber F_CPU.

Siehe dir hierzu auch delay.h näher an:
Code:
//...
#ifndef F_CPU
/* prevent compiler error by supplying a default */
# warning "F_CPU not defined for <util/delay.h>"
# define F_CPU 1000000UL
#endif
// ...

Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)