// 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; } } } //----------------------------------------------------------------------