Habe Probleme mit Simulator. Habe das Programm mit zahlreichen
Breakpoints durchlaufen lassen. Beim ersten Programmdurchlauf wird die
erste und dritte for-schleife durchlaufen, die Zweite wird übersprungen:
#define F_CPU 8000000
#include <avr\io.h>
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <util\delay.h>
int ZeilenVektor[8];
int co;
int z1;
int z2;
int z0;
int i;
double BRENNDAUER;
int main ()
{
DDRB = 0xFF;
PORTB = 0xFF;
DDRD = 0xFF;
PORTD = 0x00;
BRENNDAUER = 50;
for (z0=0;z0<=7;z0++) // wird durchlaufen
ZeilenVektor[z0] = 0;
while(1)
{
for (z1=0;z1<=7;z1++) // wird übersprungen
{
PORTD = ZeilenVektor[z1];
PORTB &=~(1<<z1); void _delay_ms(double BRENNDAUER);
PORTB |= (1<<z1);
PORTD = 0x00;
};
co = 1; // wird übersprungen
for (z2=0;z2<=7;z2++)// wird durchlaufen
{
ZeilenVektor[z2]=ZeilenVektor[z2]+co;
if (ZeilenVektor[z2]==256)
ZeilenVektor[z2]=0;
else
co=0;
};
};
};
Turmburger schrieb: > Was soll mir das sagen? Dass der µC, in diesem Fall der Simulator, genau das macht, was ihm der Programmierer gesagt hat, aber nicht das, was der Programmierer von im will. Der µC kann schließlich nicht hellsehen.
Und schau Dir nochmal die Doku zu _delay_ms() an. Das mag nämlich nur Konstanten.
Turmburger schrieb: > for (z0=0;z0<=7;z0++) // wird durchlaufen > ZeilenVektor[z0] = 0; ok, ein array das mit nullen gefuellt wird... Turmburger schrieb: > for (z1=0;z1<=7;z1++) // wird übersprungen > { > PORTD = ZeilenVektor[z1]; jetzt gehst du in das array rein, um daraus eine null zu lesen... wie waere es einfach mit "PORTD = 0" ? Turmburger schrieb: > PORTD = 0x00; ergibt keinen sinn, weil eh schon ne null drin steht Turmburger schrieb: > for (z2=0;z2<=7;z2++)// wird durchlaufen > { > ZeilenVektor[z2]=ZeilenVektor[z2]+co; Ok, vom prinziep steht da: ZeilenVektor[z2] = 0 + co Wie waere es mit ZeilenVektor[z2] = co Turmburger schrieb: > co = 1; // wird übersprungen Wird wegoptimiert weil es sich nie aendert! Turmburger schrieb: > Habe Probleme mit Simulator. Habe das Programm mit zahlreichen > Breakpoints durchlaufen lassen. Beim ersten Programmdurchlauf wird die > erste und dritte for-schleife durchlaufen, die Zweite wird übersprungen: Wenn da was nicht funktioniert, dann weil der Compiler Dinge wegoptimiert, und das zu recht! An deinem Problem ist weder der Compiler, noch der Simulator, noch die Tatsache das es sich um eine Beta-Version handelt schuld. Schalte die optimierung ab, oder programmiere ordentlich!
Kaj schrieb: > Turmburger schrieb: >> for (z1=0;z1<=7;z1++) // wird übersprungen >> { >> PORTD = ZeilenVektor[z1]; > jetzt gehst du in das array rein, um daraus eine null zu lesen... > wie waere es einfach mit "PORTD = 0" ? > > Turmburger schrieb: >> PORTD = 0x00; > ergibt keinen sinn, weil eh schon ne null drin steht Aber ist PORTD nicht volatile? Theoretisch könnte es einen Interrupt geben, welcher zwischen den beiden Zuweisungen PORTD ändert...
Kaj schrieb: > Schalte die optimierung ab, oder programmiere ordentlich! Warum "oder"? Und all, das, was du da schreibst, erklärt nicht, warum die Schleife überspungen wird. Die Ports sind alle volatile, da darf der Compiler nichts wegoptimieren. Oliver
Jay schrieb: > Theoretisch könnte es einen Interrupt > geben, welcher zwischen den beiden Zuweisungen PORTD ändert... Theoretisch ja, praktisch nein, da der TO keine Interrupts benutzt. Ausgehend von dem Stueck Code da oben, werden keine Interrupts benutzt und damit aendert sich der Port auch nicht. Ansonsten hast du recht. Gruesse
Kaj schrieb: > Jay schrieb: >> Theoretisch könnte es einen Interrupt >> geben, welcher zwischen den beiden Zuweisungen PORTD ändert... > Theoretisch ja, praktisch nein, da der TO keine Interrupts benutzt. > Ausgehend von dem Stueck Code da oben, werden keine Interrupts benutzt > und damit aendert sich der Port auch nicht. > Ansonsten hast du recht. Mein theoretisch bezieht sich (wie du richtig anmerkst) eben darauf, dass im Quellcode des TOs keine Spuren eines Interrupts gibt. Aber der Compiler muss doch trotzdem davon ausgehen, dass sich PORTD in der Zwischenzeit geändert haben könnte und kann die Zeilen nicht einfach wegoptimieren. Bei genauerer Betrachtung des Codes sehe ich aber du hast unrecht: Das ist die Initialisierung:
1 | for (z0=0;z0<=7;z0++) // wird durchlaufen |
2 | ZeilenVektor[z0] = 0; |
Danach kommt eine grosse while Schleife als Mainloop(neu formatiert):
1 | while(1) |
2 | {
|
3 | for (z1=0;z1<=7;z1++) // wird übersprungen |
4 | {
|
5 | PORTD = ZeilenVektor[z1]; |
6 | PORTB &=~(1<<z1); |
7 | void _delay_ms(double BRENNDAUER); |
8 | PORTB |= (1<<z1); |
9 | PORTD = 0x00; |
10 | } |
11 | |
12 | co = 1; // wird übersprungen |
13 | for (z2=0;z2<=7;z2++)// wird durchlaufen |
14 | {
|
15 | ZeilenVektor[z2]=ZeilenVektor[z2]+co; |
16 | if (ZeilenVektor[z2]==256) |
17 | ZeilenVektor[z2]=0; |
18 | else |
19 | co=0; |
20 | } |
21 | } |
Beim ersten Durchlauf hast du recht, da sind alle Werte von ZeilenVektor
== 0. Aber im unteren Teil wird ZeilenVektor verändert(sieht ein bischen
aus wie ein, ziemlich schräger, 64bit Counter). Danach beginnt die while
Schleife wieder von vorne.
Ich glaube also nicht, dass der Compiler hier grossartig etwas weg
optimieren kann. Jedenfalls nicht so wie du es oben beschreibst.
> Gruesse
Gruesse zurueck...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.