Forum: Mikrocontroller und Digitale Elektronik AVR Atmega328p Fuse Bit Calibration


von andreas (Gast)


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...

von c-hater (Gast)


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...

von andreas (Gast)


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.

von M. K. (sylaina)


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.

: Bearbeitet durch User
von Stefan F. (Gast)


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.

von M. K. (sylaina)


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

von leo (Gast)


Lesenswert?

M. K. schrieb:
> UBRR0L = ((F_CPU+baudRate*8)/(baudRate*16)-1) && 0xff;

Das ist falsch, logische != boolean Operator.

leo

von leo (Gast)


Lesenswert?

leo schrieb:
> Das ist falsch, logische != boolean Operator.

Soll heissen
... bitwise != boolean ...

leo

von M. K. (sylaina)


Lesenswert?

In der Tat, leo, ich hab das gestern Abend aus der Erinnerung heraus 
getippt und mich da vertipp, es ist ein & zuviel in dieser Zeile. Danke 
für diesen Hinweis ;)

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.