Sebastian A. schrieb:
> Vieleicht steh ich heute auf dem Schlauch.
Vielleicht?
> Ich habe einen ATTiny13A Proc mit 9,6 Mhz und toggle einen Pin zum
> messen. Jetzt Messe ich die Frequenz 1.032 Mhz ??? Ähhh
1 | > #include <avr/interrupt.h>
|
2 | > int main(void) {
|
3 | > DDRB = 1<<DDB4;
|
4 | > PORTB = 0b11101111;
|
5 | > while (1)
|
6 | > {
|
7 | > PORTB ^= ( 1 << PB4 );
|
8 | > }
|
9 | > }
|
> woran liegts ?
Vielleicht daran, daß die Schleife ja aus mehr als einem Maschinenbefehl
besteht? Wie kommst du auf die merkwürdige Idee, die ganze Schleife
könne in einem einzigen Takt ausgeführt werden?
Mein gcc macht aus deinem Code:
1 | while (1)
|
2 | {
|
3 | PORTB ^= ( 1 << PB4 );
|
4 | 2a: 90 e1 ldi r25, 0x10 ; 16
|
5 | 2c: 88 b3 in r24, 0x18 ; 24
|
6 | 2e: 89 27 eor r24, r25
|
7 | 30: 88 bb out 0x18, r24 ; 24
|
8 | 32: fc cf rjmp .-8 ; 0x2c <main+0xa>
|
Das sind für die Endlosschleife 4 Befehle = 4 Takte. Plus einen weiteren
Takt für den Sprung.
Sebastian A. schrieb:
> Aber wie kann ich dann die Taktfrequenz prüfen.
Warum mußt du zum Prüfen der Taktfrequenz genau mit der Taktfrequenz an
einem Pin wackeln? Wenn du weißt, daß ein Schleifendurchlauf 5 Takte
braucht, dann kannst du doch zurückrechnen.
Eleganter ist es, einen Pin als Taktausgang zu programmieren (per Fuse,
kann nicht jeder AVR). Oder du programmierst einen Timer, daß er alle
z.B. 50 Takte einen Pin toggelt (per output compare Funktion). Dann
kannst an diesem Pin den 100sten Teil der Taktfrequenz messen.