Generátor: Generovaní sinusového a trojúhelníkového průběhu

Co Ti povedali testy v simulatore?

Vidno, ze si to neskusal ani len prelozit. Ty nas skusas? To nerob, mohlo by nas to tu prestat bavit :slight_smile:

  1. Nemas zadefinovanu konstatnu SINUS.
  2. Priradujes premennej ukazatel a nie premennu. Konkretne
signal = troj;
...
signal = sinu;

Zmena jednej vzorky Ti trva priemerne 1.12us. Ak si s tymto spokony, potom je vsetko OK (samozrejme po odstraneni chyb ktore som uviedol)
1.12us pri 20 vzorkach na trojuholniku Ti neda 50kHz. 17-18 vzoriek uz ano.

kod bez chyb:
ATtiny2313, -O3,

[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 SINUS 0xff
#define TROJUHOLNIK 0x00
#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 = TROJUHOLNIK;
OCR0A = OCR_TROJUHELNIK;
}
else
{
signal = SINUS;
OCR0A = OCR_SINUS;
}
return;
}
[/code]**