Ano, slo by to. Ak Ti nebude vadit neurcitost obsluhy prerusenia +/- par stoviek nanosekund kym sa vykona potencionalne najdlhsia instrukcia a az po jej vykonani sa zacne realizovat kod pod prerusenim. Ak chces generovat signaly s periodou 100us a krokom 1us, potom by ti to nemalo moc vadit.
///Obsluha preruseni TIMER2 pri TCNT2=OCR2
ISR(TIMER2_COMP_vect)
{
PORTA &=~(0x80);
}
//Obsluha preruseni TIMER2 pri preteceni
ISR(TIMER2_OVF_vect)
{
PORTA |=0x80;
}/
void main (void)
{
// inicializace mcu
DDRA |= 0xFF; // port A jako vystup
DDRB |= 0xFF; // port B jako vystup
DDRC |= 0xFF; // port C jako vystup
DDRD |= 0xFF; // port D jako vystup
//zhasne vsechny LED
PORTA |= 0x00;
PORTB |= 0x00;
PORTC |= 0x00;
PORTD |= 0x00;
//Globalni povoleni preruseni
sei();
//Nastaveni TIMER2 a Preruseni
TIMSK = 0xC0; //povolim preruseni preteceni a shody (u PWM rezimu neni nutno asi… ?)
OCR2 = 0x00;
TCCR2 =0x6B; // Rzchly PWM,neinvertujici,delicka 32
Nj dik,jen skoda ze v tom neni ta chyba,potrebuju aby nekdo kouk na to PWM,me se to zda dobre ale delam stim podruhy vzivote a to jeste po strasny dobe!!
#define MOJ_BITIK 3 // poradie bitu v cisle pocitany od 0, miesto MOJ_BITIK si vloz co len chces :-)
#define PORT_MOJ_BITIK PORTB // napriklad
#define DDR_MOJ_BITIK DDRB // napriklad
#define PIN_MOJ_BITIK PINB // napriklad
//nastavi pin ako vstupny
#define IN_MOJ_BITIK (DDR_MOJ_BITIK &= ~(1<<MOJ_BITIK))
//nastavi pin ako vystupny
#define OUT_MOJ_BITIK (DDR_MOJ_BITIK |= (1<<MOJ_BITIK))
// ak je pin nastaveny na vystup, nastavi hodnotu log.1
#define SET_MOJ_BITIK (PORT_MOJ_BITIK |= (1<<MOJ_BITIK))
// ak je pin nastaveny na vystup, nastavi hodnotu log.0
#define RES_MOJ_BITIK (PORT_MOJ_BITIK &= ~(1<<MOJ_BITIK))
// vrati nenulovu hodnotu ak je pin v stave log.1
#define GET_MOJ_BITIK (PIN_MOJ_BITIK &= (1<<MOJ_BITIK))
// priklad
//...
static char i = 0;
// programik v nekonecnej slucke cvici s Tvojim bitikom ako sibnuty :-)
OUT_MOJ_BITIK;
while(1) {
i++;
if(i & 0x01) SET_MOJ_BITIK;
else RES_MOJ_BITIK;
}
// alebo sa to da aj takto
// Definice makier s parametrami
#define SET(PREMENNA,BIT) ((PREMENNA) |= (1<<(BIT)))
#define RES(PREMENNA,BIT) ((PREMENNA) &= ~(1<<(BIT)))
// neguje hodnotu bitu v premennej
#define NEG(PREMENNA,BIT) ((PREMENNA) ^= (1<<(BIT)))
#define TST(PREMENNA,BIT) ((PREMENNA) & (1<<(BIT)))
// ...
static char nejaka_hodnota
static char nejaky_bit = 2;
//...
SET(nejaka_hodnota, nejaky_bit);
//...
RES(nejaka_hodnota, nejaky_bit);
// ...
// podmienka je splnena, ak je bit nenulovy
// vsimni si, ze TST() uz nemusi byt ozatvorkovane. Preco je to tak, to je na domacu ulohu :-)
if TST(nejaka_hodnota, nejaky_bit) {
//...
}
pre nastavovanie bitov v registri sa pouzivaju nasledovne zapisy a im podobne:
// uryvok z rozsiahlejsieho cyklu
#define SPI0_ENABLE_MASTER SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)
#define SPI0_DATA_REGISTER SPDR
#define SPI0_PRENOS_UKOCENY (SPSR & (1<<SPIF))
// alebo
#define AKTIVUJ_AD SET(ADCSRA,ADEN)
#define SPUSTI_AD_PREVOD SET(ADCSRA,ADSC)
#define AUTOTRIGER_AD SET(ADCSRA,ADATE)
//...
SPI0_ENABLE_MASTER;
if SPI0_PRENOS_UKOCENY {
// bla bla bla
}
takyto pristup Ti umozni vytvorit si pre kazdy procesor (aj z nejakym uplne inym jadrom) header v ktorom budu na konkretnom mieste ine nazvy bitikov a registrov. Tvoj C-ckovy kod vsak ostane bezo zmeny.
Kdyz tam dam tu osluhu preruseni tak najednou funguje,ale myslel sem ze tam obsluhu vubec davat nemusim kdyz pouzivam pin CO2.Ale ma to proad chybu.Pri OCR2=0x00; to slabe sviti !!!
//Obsluha preruseni TIMER2 pri TCNT2=OCR2
ISR(TIMER2_COMP_vect)
{
}
//Obsluha preruseni TIMER2 pri preteceni
ISR(TIMER2_OVF_vect)
{
}
void main (void)
{
// inicializace mcu
DDRA = 0xFF; // port A jako vystup
DDRB = 0xFF; // port B jako vystup
DDRC = 0xFF; // port C jako vystup
DDRD = 0xFF; // port D jako vystup
//zhasne vsechny LED
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
//Globalni povoleni preruseni
sei();
//Nastaveni TIMER2 a Preruseni
Pokud používáš pin OC2, tak tam obsluhy být nemusí (a přerušení by neměla být povolená pokud je nevyužíváš ikdyž překladač se postará), pin ovšem musí být nastaven jako výstup. OC2 je na PD7.