Forum: Mikrocontroller und Digitale Elektronik Ausführung in C 16mal zu schnell, in Bascom richtig


von AnoBit (Gast)


Lesenswert?

Moin!

Ich habe zur Zeit folgendes Problem:

Mein AtMega8 läuft, sofern ich ihn in C programmiere, 16x mal zu 
schnell.
Mit Bascom blinkt die LED immer schön im Sekundentakt (was sie auch 
soll).

Zuerst dachte ich daran, dass C Probleme mit _delay_ms mit größeren 
Werten hat. Also habe ich das umgeändert in

void delay_second()
{
  int x;
  for (x=0;x<=50;x++)
  {
  _delay_ms(20);
  }
}

Immernoch dasselbe Problem.
Der Takt ist in der makefile richtig eingestellt. (16000000)
Testweise habe ich den Takt in dem C code auch definiert, mit dem selben 
ergebnis.
Für mich klingt das im moment so, als würde C mein "F_OSC = 16000000" 
ignorieren.

Langsam werde ich verrückt. In Bascom funktioniert alles wunderbar, in C 
rennt mir der Controller hoffnungslos davon.

Hat irgendwer eine Idee was des Übels Wurzel sein könnte?
Die Suche hat mir bisher noch nicht geholfen...

MfG AnoBit

von Peter D. (peda)


Lesenswert?

AnoBit schrieb:
> Für mich klingt das im moment so, als würde C mein "F_OSC = 16000000"
> ignorieren.

Würde ich auch.

Schau mal in die "delay.h", wies richtig heißen muß.


Peter

von AnoBit (Gast)


Lesenswert?

Das "F_OSC = 16000000" steht in der makefile.
Im C-Code ists "#define F_CPU 16000000L"
Ist imho richtig so... Oder habe ich gerade ein Brett vorm Kopf?

MfG AnoBit

von David M. (md2k7)


Lesenswert?

Es muss 16000000UL heißen (oder auch nur L). Das Makefile überschreibt 
die Einstellungen im C-Code, deswegen funktioniert es nicht (vermutlich 
kein L-Suffix im Makefile).

Nachtrag 2: es muss natürlich auch F_CPU heißen, sonst ist das der 
delay.h egal. Und im C-Code muss die Definition VOR dem Inkludieren der 
delay.h geschehen.

und bezüglich Genauigkeit:
1
void delay_second()
2
{
3
  int x;
4
  for (x=0;x<=50;x++)
5
  {
6
  _delay_ms(20);
7
  }
8
}

diese Schleife läuft 51-mal durch und erzeugt damit einen Delay von 1020 
ms.

Gruß
David

von AnoBit (Gast)


Lesenswert?

Ah, ok. Der Fehler lag darin, dass ich F_CPU erst nach dem einbinden der 
delay.h definiert habe. -.-

'tschuldigung. Doofer Fehler...


Jap, da war wohl ein = zu viel.

Dankeschön ^^

MfG AnoBit

von blubb (Gast)


Lesenswert?

solange dieses nicht für die init gebraucht wird ..
lieber einen timer nutzen

von Michael (Gast)


Lesenswert?

Irgendwie typisch. Ich hasse C und muss mit diesem Dreck jeden Tag 
arbeiten. Ekelhafter alter Grind unterm Zehenagel.

von Peter D. (peda)


Lesenswert?

Michael schrieb:
> Irgendwie typisch. Ich hasse C und muss mit diesem Dreck jeden Tag
> arbeiten. Ekelhafter alter Grind unterm Zehenagel.

Oder einfach mal an die eigene Nase fassen, weil man die Warnungen nicht 
liest:

c:/avr/winavr/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warning "F_CPU not defined for <util/delay.h>"


Peter

von Michael (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Oder einfach mal an die eigene Nase fassen, weil man die Warnungen nicht
> liest:

er hat sich an die Nase gefasst. Da wird sich der Peter wohl diesmal an 
die benannte Nase fassen dürfen, weil er die Namen nicht gelesen hat :)

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.