// Titel : Funktionsgenerator AVR Minimus -- Atmega32u2@16MHz
//----------------------------------------------------------------------
// Funktion : Schaltet Portpins PD0-PD7 als DAC 8Bit
// Schaltung : R2R Netzwerk an PD0-PD7
//----------------------------------------------------------------------
// Prozessor : ATmega32u2
// Takt : 16.0 MHz
// Sprache : C
//----------------------------------------------------------------------
// Hardware : PD5 LED blau, PD6 LED rot, PD7 Btn
#define F_CPU 16000000 // Taktfrequenz des myAVR-Boards
#include <avr/io.h> // AVR Register und Konstantendefinitionen
#include <util/delay.h> // Delay Funktion
#include <avr/pgmspace.h> // Program Space
#include <avr/interrupt.h> // Interruptfunktionen
//----------------------------------------------------------------------
int8_t choice=1;
static const int8_t sinustable[] PROGMEM =
{
126, 129, 132, 135, 138, 141, 144, 148, //Anfang der positiven Halbwelle
151, 154, 157, 160, 163, 166, 168, 171,
174, 177, 180, 183, 185, 188, 191, 193,
196, 199, 201, 204, 206, 208, 211, 213,
215, 217, 219, 221, 223, 225, 227, 229,
231, 232, 234, 236, 237, 239, 240, 241,
242, 244, 245, 246, 247, 247, 248, 249,
250, 250, 251, 251, 251, 252, 252, 252,
252, 252, 252, 252, 251, 251, 251, 250,
250, 249, 248, 247, 247, 246, 245, 244,
242, 241, 240, 239, 237, 236, 234, 232,
231, 229, 227, 225, 223, 221, 219, 217,
215, 213, 211, 208, 206, 204, 201, 199,
196, 193, 191, 188, 185, 183, 180, 177,
174, 171, 168, 166, 163, 160, 157, 154,
151, 148, 144, 141, 138, 135, 132, 129, //Ende der positiven Halbwelle
126, 123, 120, 117, 114, 111, 108, 104, //Anfang der negativen Halbwelle
101, 98, 95, 92, 89, 86, 84, 81,
78, 75, 72, 69, 67, 64, 61, 59,
56, 53, 51, 48, 46, 44, 41, 39,
37, 35, 33, 31, 29, 27, 25, 23,
21, 20, 18, 16, 15, 13, 12, 11,
10, 8, 7, 6, 5, 5, 4, 3,
2, 2, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 2,
2, 3, 4, 5, 5, 6, 7, 8,
10, 11, 12, 13, 15, 16, 18, 20,
21, 23, 25, 27, 29, 31, 33, 35,
37, 39, 41, 44, 46, 48, 51, 53,
56, 59, 61, 64, 67, 69, 72, 75,
78, 81, 84, 86, 89, 92, 95, 98,
101, 104, 108, 111, 114, 117, 120, 123 //Ende der negativen Halbwelle
};
static const int8_t sawtoothtable[] PROGMEM =
{
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, // 1-20
20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, // 21-40
40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59, // 41-60
60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 61-80
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99, // 81-100
100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119, // 101-120
120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139, // 121-140
140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 141-160
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, // 161-180
180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199, // 181-200
200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219, // 201-220
220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 221-240
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 241-255
};
static const int8_t squaretable[] PROGMEM =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 1-20
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 21-40
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 41-60
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 61-80
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 81-100
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 101-120
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 121-140
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 141-160
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 161-180
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 181-200
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 201-220
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 221-240
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 // 241-255
};
static const int8_t triangletable[] PROGMEM =
{
0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38, // 1-20
40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76, // 21-40
78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116, // 41-60
118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156, // 61-80
158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196, // 81-100
198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236, // 101-120
238,240,242,244,246,248,250,252,254,254,252,250,248,246,244,242,240,238,236,234, // 121-140
232,230,228,226,224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194, // 141-160
192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154, // 161-180
152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114, // 181-200
112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74, // 201-220
72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34, // 221-240
32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2 // 241-255
};
static const int8_t randomtable[] PROGMEM =
{
188,201,121,216,21,58,99,183,36,81,143,173,116,41,229,254,238,101,126,49, // 1-20
238,162,42,89,119,50,144,60,168,89,231,51,148,174,60,46,37,13,254,98, // 21-40
165,173,174,139,165,242,218,107,244,37,61,82,254,52,102,209,23,39,207,216, // 41-60
69,219,35,103,60,92,81,194,200,187,18,15,22,0,234,237,83,40,151,90, // 61-80
168,131,6,16,199,203,145,132,157,160,65,198,30,72,127,80,135,131,186,68, // 81-100
103,232,104,47,110,169,243,52,45,218,7,216,43,169,44,167,134,62,58,101, // 101-120
92,236,100,136,81,245,221,134,61,102,85,61,44,100,136,217,220,139,43,129, // 121-140
193,85,195,12,0,126,176,177,208,7,228,42,252,80,245,53,174,95,171,239, // 141-160
254,194,9,95,192,173,33,105,214,139,96,75,232,102,158,198,241,124,136,124, // 161-180
2,165,49,180,197,172,239,16,194,239,34,115,84,6,137,177,196,130,100,233, // 181-200
244,215,140,239,146,121,80,125,216,64,46,206,50,199,182,181,83,247,231,36, // 201-220
221,243,40,102,250,193,18,218,74,58,148,19,97,191,94,190,9,235,158,5, // 221-240
158,178,69,62,210,198,135,127,80,230,202,14,140,189,200 // 241-255
};
void long_delay(uint16_t ms) {
for(; ms>0; ms--) _delay_ms(1);
}
ISR(INT7_vect) //Interrupt 7 Hardwarebutton
{
choice = choice++;
PORTD ^= ( 1 << PD6 ); // LED toggle
if (choice > 5){choice = 0;};
}
main ()
{
int16_t count;
DDRD &= ~(1 << PD7); // als Eingang
DDRD |= (1<<PD5); // als Ausgang
DDRD |= (1<<PD6); // als Ausgang
DDRB |= (1<<PB0); // als Ausgang
DDRB |= (1<<PB1); // als Ausgang
DDRB |= (1<<PB2); // als Ausgang
DDRB |= (1<<PB3); // als Ausgang
DDRB |= (1<<PB4); // als Ausgang
DDRB |= (1<<PB5); // als Ausgang
DDRB |= (1<<PB6); // als Ausgang
DDRB |= (1<<PB7); // als Ausgang
EICRB = (1 << ISC70);
EIMSK |= (1 << INT7); // INT7 erlauben
sei(); // Interrupts aktivieren
while(1)
{
switch (choice)
{
case 1: //Sinustabelle
for(count = 0;count < 255; count++)
{
PORTB = pgm_read_word(&sinustable[count]);
_delay_us(1);
}
break;
case 2: //Sägezahntabelle
for(count = 0;count < 255; count++)
{
PORTB = pgm_read_word(&sawtoothtable[count]);
_delay_us(1);
}
break;
case 3: //Rechtecktabelle
for(count = 0;count < 255; count++)
{
PORTB = pgm_read_word(&squaretable[count]);
_delay_us(1);
}
break;
case 4: //Dreiecktabelle
for(count = 0;count < 255; count++)
{
PORTB = pgm_read_word(&triangletable[count]);
_delay_us(1);
}
break;
case 5: //Zufallstabelle
for(count = 0;count < 255; count++)
{
PORTB = pgm_read_word(&randomtable[count]);
_delay_us(1);
}
break;
default: //Default bei anderem Wert
PORTD ^= ( 1 << PD5 ); // LED toggle
break;
}
}
}
//----------------------------------------------------------------------