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...
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...
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.
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
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.
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
M. K. schrieb: > UBRR0L = ((F_CPU+baudRate*8)/(baudRate*16)-1) && 0xff; Das ist falsch, logische != boolean Operator. leo
leo schrieb: > Das ist falsch, logische != boolean Operator. Soll heissen ... bitwise != boolean ... leo
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.