マイコンを使った工作

cwg_main.c

最終更新:

匿名ユーザー

- view
管理者のみ編集可
main.c
/*

        Title:          Chaotic LFO
        Author:         Satoshi "Chuck" Takagi
        Date:           Nov., 16, 2005
        Software:       WinAvr
        Target:         ATmega88

        $Id$

*/

#include 
#include 
#include 
#include 

#define TEMPO(N) (65536-50-(N))
#define DACDATA PORTD
#define DACCNTL PORTB
#define DACCS0x PB6
#define DACCS1x PB7
#define DACWRx 0xFE
#define DACAxB PB1
#define DAC0A 0xBD      // 10111101
#define DAC0B 0xBF      // 10111111
#define DAC1A 0x7D      // 10111101
#define DAC1B 0x7F      // 10111111

#define MAXX 19.492022
#define MINX -19.412596
#define MAXY 26.908178
#define MINY -26.754900
#define MAXZ 47.866940
#define MINZ 0.000000


typedef uint8_t bool;
#define true 1
#define false 0

volatile bool isNew = false;
volatile uint8_t gix, giy, giz, giw = 0;

volatile uint16_t gTempo = 977;
volatile uint16_t gADC;


SIGNAL (SIG_OVERFLOW1)
{
        TCNT1 = TEMPO(gTempo);

        if(!isNew)
                return;

        DACCNTL = DAC0A;
        DACDATA = gix;
        DACCNTL &= DACWRx;
        DACCNTL |= ~DACWRx;

        DACCNTL = DAC0B;
        DACDATA = giy;
        DACCNTL &= DACWRx;
        DACCNTL |= ~DACWRx;

        DACCNTL = DAC1A;
        DACDATA = giz;
        DACCNTL &= DACWRx;
        DACCNTL |= ~DACWRx;

        DACCNTL = DAC1B;
        DACDATA = giw++;
        DACCNTL &= DACWRx;
        DACCNTL |= ~DACWRx;

        isNew = false;
}

SIGNAL (SIG_ADC)
{
        if ((ADMUX & 0x0F)==0)
                gADC = ADC;
}

void init_io(void)
{
        DDRD = 0xFF;            // Port D output
        PORTD = 0;

        DDRB = 0xFF;            // Port B output
        PORTB = 0xFF;

        /* timer1 initialization */                     // timer1 for Tempo Control
        TCNT1 = TEMPO(gTempo);
        TCCR1B = (1<<CS12)|(1<<CS10);           // timer1 prescaled by 1/1024
        TIMSK1 = (1<<TOIE1);                            // timer1 interrupt enabled

        /* ADC initial state*/
        ADMUX = 0;
        ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
        DIDR0 = (1<<ADC0D);

}

int main(void)
{
        float x = 0.0, y = 0.01, z = 0.0;
        float dx, dy, dz, dt = 1.0e-2;
        float tx, ty, tz;
        uint16_t lastADC;

        init_io();
        sei();                          /* enable interrupts     */

        for (;;) {
                if(!(ADCSRA & (1<<ADSC)))
                        ADCSRA |= (1<<ADSC);
                if(gADC != lastADC) {
                        lastADC = gADC;
                        gTempo = lastADC;
                }

                if (!isNew) {
                        dx = (-10.0 * x + 10.0 * y) * dt;
                        dy = (28.0 * x - y - x * z) * dt;
                        dz = (-8.0 / 3.0 * z + x * y) * dt;
        
                        x += dx;
                        y += dy;
                        z += dz;

                        tx = (x - MINX) / (MAXX - MINX) * 255.;
                        ty = (y - MINY) / (MAXY - MINY) * 255.;
                        tz = (z - MINZ) / (MAXZ - MINZ) * 255.;
                        if (tx < 0)             tx = 0;
                        if (tx > 255)   tx = 255;
                        if (ty < 0)             ty = 0;
                        if (ty > 255)   ty = 255;
                        if (tz < 0)             tz = 0;
                        if (tz > 255)   tz = 255;
                        gix = (int8_t)tx;
                        giy = (int8_t)ty;
                        giz = (int8_t)tz;
                        
                        isNew = true;
                }
        }
}

// $Log$
人気記事ランキング
ウィキ募集バナー