Forum: Mikrocontroller und Digitale Elektronik Fragen zu Frequenz in AVR uController (avrdude)


von Bodo K. (bodokaiser)


Lesenswert?

Ich probiere mich gerade an einem Interrupt-Timer, allerdings hänge ich 
bei der genauen Berechnung der Zeit fest. Dabei ist das größte Problem 
eigentlich, dass ich nicht weiß mit welcher Frequenz der interne 
Oszillator vom Atmega16 läuft.

Im Gegensatz zu dem Beispiel aus dem Wiki 
(https://www.mikrocontroller.net/articles/AVR_Fuses#AVRDUDE) zeigt 
avrdude nämlich keine Oszillator Frequenz:
1
avrdude -p m16 -c avrisp2 -P usb -n -v
2
3
avrdude: Version 6.2, compiled on Dec 16 2015 at 07:10:46
4
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
5
         Copyright (c) 2007-2014 Joerg Wunsch
6
7
         System wide configuration file is "/usr/local/Cellar/avrdude/6.2/etc/avrdude.conf"
8
         User configuration file is "/Users/bodokaiser/.avrduderc"
9
         User configuration file does not exist or is not a regular file, skipping
10
11
         Using Port                    : usb
12
         Using Programmer              : avrisp2
13
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200220428
14
         AVR Part                      : ATmega16
15
         Chip Erase delay              : 9000 us
16
         PAGEL                         : PD7
17
         BS2                           : PA0
18
         RESET disposition             : dedicated
19
         RETRY pulse                   : SCK
20
         serial program mode           : yes
21
         parallel program mode         : yes
22
         Timeout                       : 200
23
         StabDelay                     : 100
24
         CmdexeDelay                   : 25
25
         SyncLoops                     : 32
26
         ByteDelay                     : 0
27
         PollIndex                     : 3
28
         PollValue                     : 0x53
29
         Memory Detail                 :
30
31
                                  Block Poll               Page                       Polled
32
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
33
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
34
           eeprom         4    10   128    0 no        512    4      0  9000  9000 0xff 0xff
35
           flash         33     6   128    0 yes     16384  128    128  4500  4500 0xff 0xff
36
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
37
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
38
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
39
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
40
           calibration    0     0     0    0 no          4    0      0     0     0 0x00 0x00
41
42
         Programmer Type : STK500V2
43
         Description     : Atmel AVR ISP mkII
44
         Programmer Model: AVRISP mkII
45
         Hardware Version: 1
46
         Firmware Version Master : 1.23
47
         Vtarget         : 2.4 V
48
         SCK period      : 8.00 us
49
50
avrdude: AVR device initialized and ready to accept instructions
51
52
Reading | ################################################## | 100% 0.00s
53
54
avrdude: Device signature = 0x1e9403 (probably m16)
55
avrdude: safemode: hfuse reads as 99
56
57
avrdude: safemode: hfuse reads as 99
58
avrdude: safemode: Fuses OK (E:FF, H:99, L:E1)
59
60
avrdude done.  Thank you.

Mein aktuelles Programm sieht so aus:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
volatile int count = 0;
5
6
int main(void) {
7
    DDRA = (1 << PA0);
8
    DDRB = (1 << PB0);
9
    DDRD = (1 << PD0);
10
11
    PORTA &= (1 << PA0);
12
    PORTB |= (1 << PB0);
13
    PORTD ^= (1 << PD0);
14
15
    TIMSK = (1 << TOIE0);
16
    TCCR0 = (1 << CS02) | (1 << CS00);
17
    TCNT0 = 0x00;
18
19
    sei();
20
21
    for (;;) {
22
        if (count < 10) {
23
            PORTD ^= (1 << PD0);
24
        }
25
    };
26
27
    return 0;
28
}
29
30
ISR (TIMER0_OVF_vect) {
31
    count++;
32
}

Dabei schaltet sich die LED nach ca. 3s aus. Daraus die Frequenz 
herzuleiten führt irgendwie auch nicht ganz zum richtigen Ergebnis 
(glaub ich, Prescaler p, Counts c, Frequenz f, Zeit t):

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

count wird in der Interrupt Routine geändert. Mach die Variable mal 
volatile.

Die Frequenz des internen Oszillators ist im Auslieferungszustand 1MHz.

von Bodo K. (bodokaiser)


Lesenswert?

Georg G. schrieb:
> count wird in der Interrupt Routine geändert. Mach die Variable mal
> volatile.

Okay, habe das geändert.

>
> Die Frequenz des internen Oszillators ist im Auslieferungszustand 1MHz.

Wo könnte man das in avrdude ablesen? Was ist dann an der verwendeten 
Formel falsch?

von Sönke O. (soenio)


Lesenswert?

Schreibe für int lieber uint8_t.
Der Code ist Müll weil die LED viel zu oft an und ausgeschaltet wird und 
man es nicht mitbekommt. Frage auf if(count == 0) ab.
In deiner Formel muss c = 2^8 = 256 1/s sein.
p ist Einheitenlos und 1024
Takt ist 1 Mhz

: Bearbeitet durch User
von Bodo K. (bodokaiser)


Lesenswert?

Danke!

Und wie könnte man die Oszillatorfrequenz mit avrdude auslesen?

von klöner (Gast)


Lesenswert?

Bodo K. schrieb:
> Georg G. schrieb:
>> Die Frequenz des internen Oszillators ist im Auslieferungszustand 1MHz.
>
> Wo könnte man das in avrdude ablesen?

Steht in den fuse settings:
> avrdude: safemode: Fuses OK (E:FF, H:99, L:E1)
Vergleiche mit Datenblatt.

von Sönke O. (soenio)


Lesenswert?


von Karl M. (Gast)


Lesenswert?

Bodo K. schrieb:
> Danke!
>
> Und wie könnte man die Oszillatorfrequenz mit avrdude auslesen?

Bold das kann man nur indirekt über die Interpretation der Zahlen der 
Fuse-Bits.

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.