Mám zakomentovanou jen předděličku (1024)
Udělal jsem změny:
- Výměna krystalu za 14 745 600Hz
- tento MCU jsem měl doma i s DPS…tak není co řešít…inak to samozřejmě nepotřebuju
Když odkomentuju předděličku a přepíšu konstanty v časovači, bude to vypadat takhle:
[code]#define F_CPU 14745600UL
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <math.h>
volatile unsigned int tim0; //pomocna promenna - kolikrat pretece TIMER0
int main(void)
{
sei();//init interrupt
TIMSK|= (1 << TOIE0);// prerušeni pri pretečení TCNT0
TCCR0|= (1 << CS00)|(1 << CS00); // preddelicka /1024 //datasheet str.73
DDRB |= (1 << PB0); // LEDka na PB0
while (1)
{
}
}
//////////////////////////////////////////////////////////////////////////
// TIMER 0
ISR (TIMER0_OVF_vect){ //pocita do 255 - 8bitu
TCNT0 = 111; //Prerusi se po 10ms =>(14745600/1024)/(255-111)
tim0++;
switch (tim0)
{
case 1:
PORTB = (1 << PB0);
break;
case 2:
PORTB ^= (1 << PB0);
tim0=0;
break;
}
}[/code]
FUSES - LOW 0xDF, HIGH 0x D9
Výsledná frekvence by pak měla být 14745600/ 1024/ (255-111)/2
=20ms
Zpoždění MCU je 2us/cyklus…
Takže byl zřejmě špatný krystal…
Teď už jen vymyslet, jak to udělat, aby MCU dával přesně! 60 kHz (nebo 40kHz)
PS: Není to úkol…
Chtěl jsem udělat 12 000 000 bez předděličky, jenom do CASEů napsat 100+100
…bez zpoždění by to vyšlo přesně, byl by prostor na doladění (99+99)
scope_5.bmp (394 KB)