AVR Atmega328p Fuse Bit Calibration

Gast #6121364
Lesenswert?
• ▲
▼
AVR Atmega328p Fuse Bit Calibration

Ich lesen bei einem arduion uno mit dem oben genanten chip per AVR 
Extreme Burner aus und erhalte bei calibration bits FFFFFF85, warum? ich 
betreibe den Arduino mit einem Can mcp2515 Modul. auf diesem wurde der 
Oszillator von 8000 gegen 16000mhz getauscht. ist das diese Kalibrierung 
?

Danke für jeden tipp.

Die anderen Lock bits verstehe ich einigermassen.

Mit dieser Kalibrierung vom Kolleg läuft es auch so wie es soll. nur 
frage ich mich ob ich dieses Calibration bit überhaupt setzen muss. wen 
ich die daten clone...
Gast #6121534
Lesenswert?
• ▲
▼
andreas schrieb:

> Ich lesen bei einem arduion uno mit dem oben genanten chip per AVR
> Extreme Burner aus und erhalte bei calibration bits FFFFFF85, warum?

Weil in OSCCAL wohl 0x85 steht und die EXTREME bescheuerte Software das 
vorzeichenrichtig (aber vollkommen sinnlos) auf 32 Bit aufbläst...


> betreibe den Arduino mit einem Can mcp2515 Modul. auf diesem wurde der
> Oszillator von 8000 gegen 16000mhz getauscht. ist das diese Kalibrierung
> ?

Nein, natürlich nicht. OSCCAL wirkt auf den im ATMega eingebauten 
RC-Oszillator und auf nix anderes. Außerdem: auf den üblichen 
MCP2515-Modulen sitzen keine Oszillatoren, sondern Quarze. Hat aber 
beides absolut nix mit dem OSCCAL-Register des ATMega zu schaffen.

Außerdem ist es bei Arduinos normalerweise sowieso vollkomen 
wirkungslos, weil die nicht den internen RC-Oszillator als Taktquelle 
benutzen, sondern einen Quarz oder (häufiger) einen Keramik-Resonator.





>
> Mit dieser Kalibrierung vom Kolleg läuft es auch so wie es soll. nur
> frage ich mich ob ich dieses Calibration bit überhaupt setzen muss. wen
> ich die daten clone...
Gast #6121680
Lesenswert?
• ▲
▼
c-hater schrieb:
> benutzen, sondern einen Quarz oder (häufiger) einen Keramik-Resonator.

Richtig Quarz wurde getauscht.  :)  mein denkfehler..

ja auch richtig ;) auf dem bord arduino uno ist ein externer 16000 quarz 
verlötet.

also muss man nichts reinschreiben. weil original arduinos nanos 328p 
habe ich FFFFFF89. ausgelesen. ohne dass diese beschrieben worden sind.
#6122169
Lesenswert?
• ▲
▼
andreas schrieb:
> also muss man nichts reinschreiben. weil original arduinos nanos 328p
> habe ich FFFFFF89. ausgelesen. ohne dass diese beschrieben worden sind.

Richtig, beim nicht Benutzen des RC-Oszilators des AVRs muss man da 
nichts reinschreiben.
Und wenn man da was rein schreibt sollte man da was Passendes rein 
schreiben und nicht etwas, dass man irgendwo anders mal ausgelesen hat.
Gast #6122700
Lesenswert?
• ▲
▼
M. K. schrieb:
> Und wenn man da was rein schreibt sollte man da was Passendes rein
> schreiben und nicht etwas, dass man irgendwo anders mal ausgelesen hat.

Damit meint er, dass der konkrete OSCCAL Wert bei jedem Chip anders ist. 
Der Hersteller ermittelt den richtigen Wert schon in der Fabrik vor dem 
Verkauf. Wenn man diesen Wert ändert, sollte man einen guten Grund 
haben: z.B. wenn der Chip mit einer anderen Spannung oder Temperatur 
betrieben werden soll, als wofür er kalibriert wurde.
#6122793
Lesenswert?
• ▲
▼
Stefan ⛄ F. schrieb:
> Damit meint er, dass der konkrete OSCCAL Wert bei jedem Chip anders ist.
> Der Hersteller ermittelt den richtigen Wert schon in der Fabrik vor dem
> Verkauf.

Der Hersteller garantiert nur eine Genauigkeit von ±10% der Taktrate, 
gibt im Datenblatt aber auch an, dass der Endbenutzer durch eigenes 
Vermessen die Genauigkeit auf durchaus ±1% runter bringen kann. ;)

Mit einem kleinen Trick kann man das recht gut selbst für Einzelgeräte 
bestimmen indem man sich des UARTs bedient. Einfach folgenden Code z.B. 
auf den Atmega flashen und dann die Ausgabe des UARTs mit geeigneten 
UART2USB auf dem PC verfolgen.
1
### Programm zur Bestimmung von OSCCAL ohne Frequenzgenerator ###
2

3
#include <stdlib.h>
4
#include <avr/io.h>
5

6
void uartSetup(uint16_t baudRate){
7
    UBRR0H = ((F_CPU+baudRate*8)/(baudRate*16)-1) >> 8;
8
    UBRR0L = ((F_CPU+baudRate*8)/(baudRate*16)-1) && 0xff;
9
    UCSR0B |= (1<<TXEN0);
10
}
11
void sendChar(unsigned char zeichen){
12
    {
13
        /* Wait for empty transmit buffer */
14
        while ( !( UCSR0A & (1<<UDRE0)) );
15
        /* Put data into buffer, sends the data */
16
        UDR0 = zeichen;
17
    }
18
}
19
void sendString(const char* charOfString){
20
    //send string from ram
21
    while *charOfString != '\0 {
22
        sendChar(*charOfString);
23
        charOfString++;
24
    }
25
}
26
int main(void) {
27
    uartSetup(9600);
28
    char valueToSend[5];
29
    for (uint8_t i=0x00; i<0x7f; i++) {
30
        OSCCAL = i;
31
        sendString("OSCCAL is now: ");
32
        itoa(OSCCAL,
33
             valueToSend,
34
             10);
35
        sendString(valueToSend);
36
        sendString("\r\n");
37
        
38
    }
39
  for (;;) {
40
  }
41
  return 0; // never reached
42
}

Von den lesbaren Zeilen pickt man sich die Mittlere heraus und hat den 
passenden Wert für das OSCCAL-Register. Je nach Frequenzbereich muss man 
sich die Laufvariable i bzw. den Bereich, den sie durchläuft, passend 
auswählen, Näheres dazu sagt die AVR053: Calibration of the internal 
RC-oscillator

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.