Takto jsem to zkusil ja. Myslite ze je to OK?
[code]#define F_CPU 20000000UL
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#define SET(BAJT,BIT) ((BAJT) |= (1<<(BIT))) //nastav!
#define TST(BAJT,BIT) ((BAJT) & (1<<(BIT))) //je nastaven?
#define OCR_SINUS 19 //2441670=1000000;20000000/(11000000)-1=19
#define OCR_TROJUHELNIK 19 //2050000=1000000;20000000/(11000000)-1=19
#define DA_SMER_PORT DDRB //DA na porte B
#define DA_PORT PORTB //DA na porte B
#define TLACITKO_SMER_PORT DDRD //tlacitko na porte D
#define TLACITKO_PORT PIND //tlacitko na porte D
#define TLACITKO_BIT 2 //tlacitko PD2
#define VZORKY_SINUS 24 //pocet vzorku
#define VZORKY_TROJUHELNIK 20 //pocet vzorku
uint8_t signal = SINUS;
uint8_t i=0;
unsigned char sinu [VZORKY_SINUS] =
{};
unsigned char troj [VZORKY_TROJUHELNIK] =
{};
int main(void)
{
//========= inicializace ===========
sei(); //globalni preruseni
SET(GIMSK,INT0); //preruseni od INT0
SET(MCUCR, ISC01); // preruseni na dobezne hrane
OCR0A = OCR_SINUS;
SET(TCCR0A,WGM01); //CTC
SET(TCCR0B,CS00); //preddelicka: f/1
SET(TLACITKO_SMER_PORT,TLACITKO_BIT); //tlacitko na PD2
DA_SMER_PORT = 0xFF; //vystup pro DA
//==================================
while(1)
{
if (TST(TIFR,OCF0A)) //je nastaven OCF0A?
{
SET(TIFR,OCF0A); //vynuluj TIFR
//========= generovani vzorku ============
if (signal == SINUS)
{
DA_PORT = sinu*;
i++;
if (i >= VZORKY_SINUS)
{
i = 0;
}
}
else
{
DA_PORT = troj*;
i++;
if (i >= VZORKY_TROJUHELNIK)
{
i = 0;
}
}
//=======================================
}
}
}
ISR (INT0_vect)
{
if (signal == sinu)
{
signal = troj;
OCR0A = OCR_TROJUHELNIK;
}
else
{
signal = sinu;
OCR0A = OCR_SINUS;
}
return;
}[/code]
Jen si jeste nejsem jist tim RETURN; Myslim zde:
ISR (INT0_vect)
{
if (signal == sinu)
{
signal = troj;
OCR0A = OCR_TROJUHELNIK;
}
else
{
signal = sinu;
OCR0A = OCR_SINUS;
}
return;
}
Jakou presne funkci to plni?**