AT90S2323 2 Probleme

Gast #166589
µ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.
Gast #166590
wenn du t als float/real/double definiert hast (Gleitpunktzahl) dann
kann ich mir das vorstellen (MathematikLibrary wird dann mit
eingebunden)

Gruss
Gast #166593
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.
Gast #166594
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.
Gast #166595
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.