Forum: Mikrocontroller und Digitale Elektronik AT90S2323 2 Probleme


von tobi (Gast)


Lesenswert?

µC Typ: AT90S2323
Takt: 10 MHz Quarz
Programmer: Atmel AVRISP
Compiler: WinAVR
-----------------

Problem 1: _delay_ms() Befehl und Taktfrequenz
Egal welche Taktfrequnz ich im Makefile angebe, die Zeiten  die ich
beim delay-Befehl angebe, stimmen nachher nie.
Beim AT90S2323 gibt es keine Fusebits, mit denen ich den Takt
einstellen kann, denn den AT90S2323 kann ich nur mit einem ext. Quarz
betreiben.

Merkwürdigerweise, stimmen die Zeiten, wenn ich z.B. einen ATtiny 26
intern mit 1 MHz takte, egal was ich im Makefile eintrage.

Muss ich noch irgendwo die Taktfrequenz eintragen, ausser im Makefile,
oder geht der delay-Befehl nur mit 1 MHz ???

Problem 2: -- bzw ++
Wenn z.B. das hier schreibe:

...
t=10
for(;;)
{
t--;
//mach irgendwas;
if (t==0) goto next;
}
next:
....

Sobald ich ++ oder -- zum zählen benutze,
wächst mein Code plötzlich auf bis zu das 6 fache.
Das verstehe ich irgendwie nicht.

von T.Stütz (Gast)


Lesenswert?

wenn du t als float/real/double definiert hast (Gleitpunktzahl) dann
kann ich mir das vorstellen (MathematikLibrary wird dann mit
eingebunden)

Gruss

von tobi (Gast)


Lesenswert?

Ich habe t als int definiert. Also:
int t=10;

von tobi (Gast)


Lesenswert?

Das erste Problem hat sich erledigt. (siehe: Delay -Problem GCC Forum)

Das zweite, verstehe ich immer noch nicht.

von ERDI - Soft (Gast)


Lesenswert?

Autsch, das tut weh. (Schmutziger geht die Programmierung ja ncht mehr.)


for(;;)
{
t--;
//mach irgendwas;
if (t==0) goto next;
}

das macht man doch besser so:

for(t = 0, t <= 10, t++)
{
   blubber schwall;
}

goto wird in der C-Programmierung nicht benutzt.

Zur Erklärung der for-Schleifenparameter:

das t = 0 setzt den Startwert der Variable beim Aufruf der Schleife
fest. Der zweite Parameter setzt deinen Endwert fest und der dritte
gibt an, wie gezählt werden soll (pre-, post-, increment oder
decrement)

So durchläuft er die Schleife so oft, bis t = 10.

von tobi (Gast)


Lesenswert?

Ursprünglich hatte ich meinen ersten Code in einer switch-case
Konstruktion gehabt, aber irgendwie wollte die nicht so ganz funzen.
Wenn ich den Code noch finde, dann poste ich ihn mal.

von Michael Wilhelm (Gast)


Lesenswert?

Nach meinem ANSI-C-Buch ist es egal, ob man in einer For-Schleife t++
oder ++t schreibt, es wird auf alle Fälle als postincrement aufgelöst.

Das mit dem goto ist keine gute Technik, aber wenn es ist erlaubt laut
C. Also nict so laut schimpfen.

Die obige Schleife lässt sich etwas eleganter auflösen:
t=10;
do
{
//irgendwas
}
while(t);

oder wenn ein Dekrement in der nicht in den Anweisungen stattfindet:

t=10;
do
{
//irgendwas
}
while(--t);

Das garantiert eine bestimmte Anzahl Durchläufe.

MW

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
Noch kein Account? Hier anmelden.