PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LEDs Blinken statt einfach zu leuchten.



klucky
23.10.2004, 02:31
#include <avr/io.h>

int main(void)
{
DDRA=0xff;
PORTA=0xff;
DDRB=0xff;
PORTB=0x0;
DDRC=0xff;
PORTC=0x0;
DDRD=0xff;
PORTD=0x0;
DDRE=0xff;
PORTE=0x0;
DDRF=0xff;
PORTF=0x0;
DDRG=0xff;
PORTG=0x0;
for (;;) {}
}

Normalerweise sollte dies Programm einfach durchlaufen und die LEDs an Port A zum leuchten bringen und dann in der Endlosschleife bleiben. Allerdings blinken die LEDs die ganze zeit woran kann das liegen? Ich könnte mir vorstellen das das Programm immer wieder von vorne gestartet wird anstatt in der endlosschleife zu bleiben aber warum?

churchi
23.10.2004, 11:19
Ich würde statt
for(;;){}
while(1){}
probieren.

Eine For - Schleife ist eigentlich keine Endlosschleife.

Pascal
23.10.2004, 11:31
eigentlich hast du recht, aber for(;;){} dürfte schon das gleiche bewirken wie while(1){}, denn normalerweise gibt man bei for-Schleifen noch Bedingungen an, wenn man die allerdings wie oben gezeigt weglässt, hat man auch eine Endlosschleife

berichtigt mich, wenn ich falsch liege

Edit: denkt euch meine for-Schleife wie die vorherigen, der Smilie ist ungewollt...

klucky
23.10.2004, 11:33
wit der while schleife blinkts immer noch ....

Pascal
23.10.2004, 11:38
vielleicht ist der Grund ja eher in der Hardware zu suchen...
oder, was mir grad eingefallen ist, mit welchem µC arbeitest du?
vielleicht ist da ja der Watchdog standartmäßig an und wenn man ihn nicht regelmäßig auf 0 setzt, löst er einen Reset aus...

klucky
23.10.2004, 11:43
Mit einem ATmega128 16AI ... wie kann ich den Watchdog denn aus machen?

Pascal
23.10.2004, 11:54
ich hab im Datenblatt für einen ATMEGA8 nachgeschaut und folgendes herausgefunden:

To disable an enabled Watchdog Timer, the following procedure must be followed:
1. In the same operation, write a logic one to WDCE and WDE. A logic one must be written to WDE even though it is set to one before the disable operation starts.
2. Within the next four clock cycles, write a logic 0 to WDE. This disables the Watchdog.

WDE und WDCE sind Bits im WatchDogTimerControlRegister WDTCR

allerdings ist das vielleicht beim 128er anders...musst mal im Datenblatt nachschauen

darkscout
23.10.2004, 11:57
Meine Vermutung :
for(;;){}
while(1){}

werden vom Compiler weg-optimiert...

wie wäre es mit:
while(1) asm volatile("nop");

dann NOPed er die ganze Zeit.

Ich hätte ein ähnliches Problem als ich in Assembler programmiert habe...
Als das Programm durchgelaufen ist hat sich mein AVR immer resetted - dadurch führte er das programm immer wieder aus...

klucky
23.10.2004, 11:59
Bei mir gibt es nur WDTON ... naja werd mal das datenblatt durchsuchen ;)

klucky
23.10.2004, 12:04
Genau daran lags ... danke ... und du hast damit auch noch gleich ein anderes problem im Elektronikforum von mir gelöst ;) die pins tuns jetzt normal ... ;)

Pascal
23.10.2004, 13:21
an was lags jetzt, an der leeren Schleife oder am Watchdog?

klucky
23.10.2004, 15:55
an dem watchdog der war standartmäßig aktiviert und der hat auch diesen fehler hier ausgelöst: https://www.roboternetz.de/phpBB2/viewtopic.php?t=4167