Hallo zusammen,
habe eine simple Anfängerfrage mit der ich mich schon viel zu lange
beschäftige. Da mein Programm nicht wie erwartet funktioniert hat, habe
ich den Fehler eingekreist und festgestellt, dass meine Clock nicht so
arbeitet, wie ich erwartet habe.
Daher habe ich mir folgendes Progrämmchen geschrieben, um die Frequenz
zu überprüfen:
1 | #define F_CPU 1000000
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void){
|
7 | DDRD |= (1<<DDD5);
|
8 | while(1){
|
9 | PORTD ^= (1<<PD5);
|
10 | _delay_ms(1000);
|
11 | }
|
12 | }
|
Gebaut habe ich es mit:
1 | $ avr-gcc -Os -mmcu=atmega8 -std=gnu99 main.c -o main.o
|
2 | $ avr-objcopy -O ihex main.o main.hex
|
Dann die Fuses des ATmega8 auf 1MHz internal Osc.
1 | $ avrdude -p m8 -c usbasp -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m
|
Und abschließend das Programm geflasht:
1 | $ avrdude -p m8 -c usbasp -U flash:w:main.hex
|
Ich benutze das AtmelEvalBoard von Pollin, einen Atmega8-16PU und einen
USBASP programmer mit der fischl-firmware.
Die LED blinkt auch artig, ABER sie blinkt exakt vier mal so schnell wie
sie soll. Statt 1000ms delay habe ich ein delay von exakt 250ms (auf die
ms genau am Oszilloskop nachgemessen).
Auch wenn ich den externen Quarz mit 16MHz benutze (lfuse:0xcf und
hfuse:0xd9) und das F_CPU define auf 16000000 anpasse, habe ich exakt
das selbe verhalten (250ms delay, statt 1000ms).
Dieses Phänomen hatte ich noch nie. Ein zweiter Atmega8 verhält sich
exakt genauso.
Ich habe keine Idee mehr, woran das jetzt liegen könnte, bzw was ich
falsch mache (habe bestimmt schon 2 Jahre kein AVR mehr programmiert und
bin ziemlich eingerostet ... wollte jetzt wieder anfangen und jetzt
sowas).
Ich hoffe ihr könnt mir helfen.
Vielen Dank euch schonmal.
Besten Gruß
t0mM3k