Forum: Mikrocontroller und Digitale Elektronik Attiny13 falscher Takt


von Sebastian A. (xxlxx)


Lesenswert?

Hi

Vieleicht steh ich heute auf dem Schlauch.
Ich habe einen ATTiny13A Proc mit 9,6 Mhz und toggle einen Pin zum 
messen.
Jetzt Messe ich die Frequenz 1.032 Mhz ??? Ähhh
Stell ich die fuses auf 4,8Mhz messe ich 487khz.
CKDIV8 ist nicht gesetzt.

Info : Spannung 5V / IPS Programmer fest angeschlossen

hier mein Code :
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 ?

danke.

von Christian D. (chris83)


Lesenswert?

Vielleicht daran, dass der Befehl

PORTB ^= ( 1 << PB4 );

mehrere Takte benötigt.

Schau dir den Assembler code an.

von Sebastian A. (xxlxx)


Lesenswert?

Hi

danke. Aber wie kann ich dann die Taktfrequenz prüfen.
Ich hatte das vor einigen Jahrem mit einem ATmega8 gemacht.
Sorry Assembler ist gar nicht meins :-(

danke.

von Dietrich L. (dietrichl)


Lesenswert?

Christian D. schrieb:
> Vielleicht daran, dass der Befehl
>
> PORTB ^= ( 1 << PB4 );
>
> mehrere Takte benötigt.

Nicht nur der Befehl! Der Sprung für while (1) muss ja auch noch 
ausgeführt werden.

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

Sebastian A. schrieb:
> Hi
>
> danke. Aber wie kann ich dann die Taktfrequenz prüfen.
> Ich hatte das vor einigen Jahrem mit einem ATmega8 gemacht.
> Sorry Assembler ist gar nicht meins :-(

mittels _delay_ms eine LED an einem Pin toggeln lassen
1
#define F_CPU 9600000
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
int main()
6
{
7
  DDRB = ( 1 << PB4 );
8
9
  while( 1 )
10
  {
11
    PORTB |= ( 1 << PB4 );
12
    _delay_ms( 1000 );
13
    PORTB &= ~( 1 << PB4 );
14
    _delay_ms( 1000 );
15
  }
16
}

ist die LED 1 Sekunde an und 1 Sekunde aus, dann stimmt die bei F_CPU 
angegebene Taktfreuqenz mit der tatsächlichen des Tiny überein. 1 
Sekunde kannst du auch mit freiem Auge noch einigermassen gut 
abschätzen, zumal die Alternativen sich massiv niederschlagen. Läuft 
dein Tiny zb nicht mit 9.6Mhz sondern (wegen dem Taktteiler) nur mit 
einem 1/8 davon, dann leuchtet die nicht 1 Sekunde sonder deren 8 - ein 
Unterschied der leicht erkennbar ist. Das spielt es dann auch keine 
Rolle, ob der Tiny mit 9600000 oder doch nur mit 9580324 Hz getaktet 
wird. Die 1 Sekunde verlängert sich dadurch nur minimal. Es geht um 
Grössenordnungen und nicht darum, das letzte Hz zu erkennen.

von Dietrich L. (dietrichl)


Lesenswert?

Sebastian A. schrieb:
> Aber wie kann ich dann die Taktfrequenz prüfen.

Das geht schon damit, aber dann musst Du im Listing schauen, welchen 
Maschinencode der Compiler gemacht hat. Dann die Schleife einmal 
durchgehen und die Takte, die die Befehle brauchen, zusammenzählen.

> Sorry Assembler ist gar nicht meins :-(

Du musst ja Assembler nicht können, das macht der Compiler. Du musst 
lediglich im Dokument "Instruction Set" des µC die Anzahl Takte der 
Befehle nachschlagen.

Gruß Dietrich

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Sebastian A. (xxlxx)


Lesenswert?

Hallo

Danke erstmal an alle die mich zum denken angeregt haben. Im nachgang 
ist es erklärbar.

Ich setz das mal um.

Größes DANKE !

Sebastian

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.