Archiv verlassen und diese Seite im Standarddesign anzeigen : LEDs Blinken statt einfach zu leuchten.
#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?
Ich würde statt
for(;;){}
while(1){}
probieren.
Eine For - Schleife ist eigentlich keine Endlosschleife.
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...
wit der while schleife blinkts immer noch ....
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...
Mit einem ATmega128 16AI ... wie kann ich den Watchdog denn aus machen?
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...
Bei mir gibt es nur WDTON ... naja werd mal das datenblatt durchsuchen ;)
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 ... ;)
an was lags jetzt, an der leeren Schleife oder am Watchdog?
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.