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