################################################### main.c #include #include "stdlib.h" #include "intern_adc.h" // intern_ADC-Funktionen #include "ad7305.h" // DAC-Funktionen int main(void) { unsigned char sin_table[255] = { 0x7F,0x82,0x85,0x88,0x8B,0x8E, 0x91,0x94,0x97,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD, 0xAF,0xB2,0xB5,0xB8,0xBB,0xBE,0xC0,0xC3,0xC6,0xC8, 0xCB,0xCD,0xD0,0xD2,0xD4,0xD7,0xD9,0xDB,0xDD,0xDF, 0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF0, 0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB, 0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD, 0xFD,0xFD,0xFD,0xFC,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8, 0xF7,0xF6,0xF5,0xF4,0xF3,0xF2,0xF0,0xEF,0xEE,0xEC, 0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDB,0xD9, 0xD7,0xD4,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC0, 0xBE,0xBB,0xB8,0xB5,0xB2,0xAF,0xAD,0xAA,0xA7,0xA4, 0xA1,0x9E,0x9B,0x97,0x94,0x91,0x8E,0x8B,0x88,0x85, 0x82,0x7F,0x7B,0x78,0x75,0x72,0x6F,0x6C,0x69,0x66, 0x62,0x5F,0x5C,0x59,0x56,0x53,0x50,0x4E,0x4B,0x48, 0x45,0x42,0x3F,0x3D,0x3A,0x37,0x35,0x32,0x30,0x2D, 0x2B,0x29,0x26,0x24,0x22,0x20,0x1E,0x1C,0x1A,0x18, 0x16,0x14,0x13,0x11,0xF,0xE,0xD,0xB,0xA,0x9, 0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x2,0x1,0x1, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x1,0x1,0x2,0x2,0x3,0x4,0x5,0x6,0x7,0x8, 0x9,0xA,0xB,0xD,0xE,0xF,0x11,0x13,0x14,0x16, 0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,0x26,0x29,0x2B, 0x2D,0x30,0x32,0x35,0x37,0x3A,0x3D,0x3F,0x42,0x45, 0x48,0x4B,0x4E,0x50,0x53,0x56,0x59,0x5C,0x5F,0x62, 0x66,0x69,0x6C,0x6F,0x72,0x75,0x78,0x7B,0x7F,0x82 }; unsigned int adc_value16,diff_value16,half_adc=512; unsigned char test8=0,half8=127,adc8=0,diff8=0; unsigned char vor=0,rueck=0,mark=2,schritt=0; ad7305_init(); // DAC INIT PORTs und Grundstellung intern_adc_init(CH0); // internen ADC auf Kanal 0 einstellen //adc_value = getConversion_intern_adc(); // eine ADC-Wandlung 10bit //dac_value = (unsigned char)(adc_value>>2); // 10bit => 8bit schieben //ad7305_one(A, dac_value); // DAC-einstellen 8bit for(;;) { adc_value16 = getConversion_intern_adc(); // eine ADC-Wandlung 10bit adc8 = (unsigned char)(adc_value16>>2); // 10bit zu 8bit /*if(adc8 >= half8) // Vorwärtsbewegung { //diff8 = (adc8 & 0x7F); // Differenz bilden 0xXX & 0x7F(127er löschen) //test8 += (diff8>>2); vor = vor + 1; ad7305_one(D, sin_table[vor]); // DAC-einstellen 8bit ad7305_one(C, sin_table[vor+63]); // DAC-einstellen 8bit ad7305_one(B, sin_table[vor+127]); // DAC-einstellen 8bit ad7305_one(A, sin_table[vor+191]); // DAC-einstellen 8bit }*/ if(adc8 < half8) // Vorwärtsbewegung { diff8 = (half8 - adc8); // Differenzbilden + umkehren test8 = (adc8>>3)+1; rueck += test8; ad7305_one(D, sin_table[rueck]); // DAC-einstellen 8bit ad7305_one(C, sin_table[64 + rueck]); // DAC-einstellen 8bit ad7305_one(B, sin_table[128 + rueck]); // DAC-einstellen 8bit ad7305_one(A, sin_table[192 + rueck]); // DAC-einstellen 8bit } } ################################################### ad7305.h #ifndef intern_adc_H #define intern_adc_H // ################### DEFINES #define DACPORTDIR DDRB // DAC Datenrichtungsregister #define DACPORT PORTB // DAC Port #define DACPIN PINB // DAC Pin #define DAC_CONPORTDIR DDRD // DAC Kontrollport-Datenrichtung #define DAC_CONPORT PORTD // DAC KontrollPort #define DAC_CONPIN PIND // DAC KontrollPin #define A 0x00 // DAC - Adresse A #define B 0x01 // DAC - Adresse B #define C 0x02 // DAC - Adresse C #define D 0x03 // DAC - Adresse D #define WR 5 #define LDAC 6 // ################### INITIALISIERUNGEN void ad7305_init(void); // DAC Init void ad7305_one(unsigned char kanal, unsigned char daten); // schreibt Daten // auf einen Kanal #endif ################################################### ad7305.c #include #include "stdlib.h" #include "ad7305.h" void ad7305_init(void) { DACPORTDIR = 0xFF; // DACPORT alles Ausgänge DAC_CONPORTDIR = 0x63; // WR LDAC A0 A1 = Ausgänge (PD0,PD1,PD5,PD6) DACPORT = 0x00; // Spannungswert = NULL DAC_CONPORT = 0x63; // Adresse auf Kanal A + WR & LDAC = High } void ad7305_one(unsigned char kanal, unsigned char daten) { DAC_CONPORT = (DAC_CONPORT & 0xFC) | kanal; // Adresse einstellen (A,B,C oder D) asm("nop"); asm("nop"); DACPORT = daten; // Daten an den Port legen asm("nop"); asm("nop"); cbi(DAC_CONPORT,WR); // WR-Bit LOW asm("nop"); asm("nop"); sbi(DAC_CONPORT,WR); // WR-Bit HIGH cbi(DAC_CONPORT,LDAC); asm("nop"); asm("nop"); sbi(DAC_CONPORT,LDAC); // LDAC toggeln um DAC-Wert auszugeben }