اطلاعیه
Collapse
No announcement yet.
اسیلوسکوپ با AT mega32
Collapse
X
-
پاسخ : اسیلوسکوپ با AT mega32
کدAVR_oscilloscope.c
کد:#include <avr/io.h> // include I/O definitions (port names, pin names, etc) #include <avr/interrupt.h> #include "glcd.c" void USART_Init(unsigned int baudrate); void timePause(unsigned long count); void ADC_init (void); void initTimer (void); /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 16000000UL #endif #define msUp 1 #define msDwn 4 #define YposUp 0 #define YposDwn 3 #define freeze 2 #define AC 0 #define DC 1 #define SQUARE 2 #define TRUE 0 #define FALSE 1 unsigned int counter = 0; unsigned int dataCounter = 0; unsigned int timeDiv = 52; unsigned int analogInput = 0; unsigned char trigger = 2; unsigned char cnt = 0; unsigned char empty = 0; unsigned int out = 0; unsigned char findZero = 0; unsigned char pressedButton = 0; unsigned char upLimit = 0; unsigned char dnLimit = 255; unsigned char limitBkup = 0; unsigned char voltageType = AC; unsigned char complete = TRUE; signed char Ypos = 0; signed char Ypos2 = 0; signed char position = 0; int main (void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRA = 0b00000000; unsigned char temp1; unsigned int temp2; unsigned char i; glcdInit(); ADC_init(); createWelcomeScreen(); showTheWave(); timePause(10000000); for(;;) { //--------- if (pressedButton == 0) { if (~PINC & (1<<msUp) && (timeDiv <= 1000)) { if(timeDiv == 0) timeDiv = 52; else timeDiv += 145; pressedButton = 1; } if (~PINC & (1<<msDwn) && (timeDiv >= 52)) { if(timeDiv <= 145) timeDiv = 0; else timeDiv -= 145; pressedButton = 1; } if (~PINC & (1<<YposUp) && (Ypos2 <= 60)) Ypos2++; if (~PINC & (1<<YposDwn) && (Ypos2 >= -60)) Ypos2--; if (~PINC & (1<<freeze)) while (~PINC & (1<<freeze)); // It freezes the display to watch the wave. } else { temp1 = PINC; if (temp1 == 255) pressedButton = 0; } //--------v // This routine makes the trigger. dataCounter = 0; findZero = 0; upLimit = 0; dnLimit = 255; for (i=99; i>0; i--) { ADCSRA |= (1 << ADSC); // Enable ADC loop_until_bit_is_set(ADCSRA, ADIF); // wait until conversion complete. temp1 = ADCL; temp2 = ADCH; timePause(timeDiv); //(7); if (upLimit < temp2) // find the higher voltage level of the input waveform. upLimit = temp2; if (dnLimit > temp2) // find the lower voltage level of the input waveform. dnLimit = temp2; if (temp2 > 0) { temp2 += 5; temp2 /= 5; temp2 += 2; }else temp2 = 2; position = temp2 + Ypos2 +5; if (position <= 63 && position >= 0) // Adjust Up-Down the wave. fillDataLcdBuffer(i,position); else fillDataLcdBuffer(i,0); } if(upLimit != dnLimit) trigger = (((upLimit - dnLimit)/2)+ dnLimit); // find the middle of the wave, to be used it as a trigger. //--------^ createRaster(); createWave(); showTheWave(); dataCounter = 0; do { limitBkup = temp2; ADCSRA |= (1 << ADSC); // Enable ADC loop_until_bit_is_set(ADCSRA, ADIF); temp1 = ADCL; temp2 = ADCH; //timerPause(timeDiv); if(limitBkup == temp2) { dataCounter++; if(dataCounter >= 500) voltageType = DC; else voltageType = AC; } if((voltageType == AC) && ((temp2 == trigger) && (limitBkup < temp2))) complete = TRUE; else if((voltageType == DC) && (limitBkup == temp2) && (upLimit != dnLimit)) { dataCounter = 0; do { ADCSRA |= (1 << ADSC); // Enable ADC loop_until_bit_is_set(ADCSRA, ADIF); temp1 = ADCL; temp2 = ADCH; complete = TRUE; dataCounter++; }while ((temp2 > trigger) && (dataCounter <1000)); dataCounter = 0; do { ADCSRA |= (1 << ADSC); // Enable ADC loop_until_bit_is_set(ADCSRA, ADIF); temp1 = ADCL; temp2 = ADCH; complete = TRUE; dataCounter++; }while ((temp2 < trigger) && (dataCounter <1000)); } else if((voltageType == DC) && (limitBkup == temp2)) complete = TRUE; else complete = FALSE; } while(complete == FALSE); } } //=============================================================================== // //=============================================================================== void ADC_init (void) { ADMUX = 0b01100000; // PA0 -> ADC0, ADLAR=1 (8bit) ADCSRA = 0b11000100; // ADC prescaler at 16 } //=============================================================================== // //=============================================================================== void timePause(unsigned long count) { while(count--); } //=============================================================================== // //===============================================================================
دودمانم بر باد رفت
-
پاسخ : اسیلوسکوپ با AT mega32
کدglcd.c
کد:#include "glcd.h" void glcdInit (void) { data_port_pins = 0; //DATA Port Low data_port_ddr = 0xff; //Make DATA port output ctrl_port = 0; //CONTROL Port Low ctrl_port_ddr = 0xff; //Make CONTROL port outputs ctrl_port |= (1<<lcdrst); ctrl_port |= (1<<lcdcs1); //Enable the CS1 of the display ctrl_port |= (1<<lcdcs2); //Enable the CS2 of the display ctrl_port &= ~(1<<lcdrs); //Clear RS \_ ctrl_port &= ~(1<<lcdrw); //Clear RW / Command mode delayTime(10000); data_port = 0b11000000; //Display start line = 0 (0-63) eStrobe(); delayTime(10000); data_port = 0b01000000; //Set address = 0 (0-63) eStrobe(); delayTime(10000); data_port = 0b10111000; //Set page = 0 (0-7) eStrobe(); delayTime(10000); data_port = 0b00111111; //Display ON eStrobe(); ctrl_port &= ~(1<<lcdcs1); //Disable the CS1 of display ctrl_port &= ~(1<<lcdcs2); //Disable the CS2 of display createRaster(); // Äçìéïýñãçóå ôï raster... showTheWave(); // êáé åìöÜíéóÝ ôï óôçí LCD. } //==================================================================== // create "welcome" screen //==================================================================== void createWelcomeScreen (void) { unsigned int size; lcdAddress = 0; flashAddress =0; const char *data = welcomeScreen; for (size = 0; size<1024; size++) lcdBuffer[lcdAddress++] = pgm_read_byte(data++); } //==================================================================== // ÁíôéãñáöÞ ôùí 1024 bytes áðï ôçí flash óôç RAM. // Copy the 1024 bytes from flash to RAM. //==================================================================== void createRaster (void) { unsigned int size; lcdAddress = 0; flashAddress =0; const char *data = LcdRaster; for (size = 0; size<1024; size++) lcdBuffer[lcdAddress++] = pgm_read_byte(data++); } //==================================================================== // //==================================================================== void changeLine (unsigned char lineData) { ctrl_port |= (1<<lcdcs1); //Enable the CS1 of the display ctrl_port |= (1<<lcdcs2); //Enable the CS2 of the display ctrl_port &= ~(1<<lcdrs); //Clear RS. Command mode ctrl_port &= ~(1<<lcdrw); //Clear RW. Command mode lineData += 0b10111000; data_port = lineData; //Set page = 0 (0-7) eStrobe(); data_port = 0b01000000; //Set address = 0 (0-63) eStrobe(); ctrl_port |= (1<<lcdrs); //Set RS. Data mode } //==================================================================== // //==================================================================== void fillDataLcdBuffer (unsigned char address, unsigned char data) { dataLcdBuffer[address] = data; } //==================================================================== // //==================================================================== void showTheWave (void) { for(lcdAddress = 0; lcdAddress < 1024 ;lcdAddress++) { if (line == 8) line = 0; if (column == 128) { column = 0; line++; if (line == 8) line = 0; changeLine(line); } if (column <= 63) enable_cs1(); if (column == 64) enable_cs2(); delayTime(10); ctrl_port |= (1<<lcdrs); // "DATA SEND" mode ctrl_port &= ~(1<<lcdrw); data_port = lcdBuffer[lcdAddress]; eStrobe(); column++; // increase column (maximum 128). } } //==================================================================== // Ãñáøå ôá äåäïìÝíá ãéá ìéá êõìáôïìïñöÞ óôïí buffer dataLcdBuffer. // Write the data for 1 waveform to the buffer dataLcdBuffer. //==================================================================== void createWave (void) { unsigned char data; unsigned char byte; unsigned char i = 0; for (i=0; i<128; i++) { byte = 0b10000000; lcdAddress = 996; //996 åßíáé ôï ôåëåõôáßï pixel ìÝóá óôï ñÜóôåñ ôïõ ðáëìïãñÜöïõ. //996 is the final pixel of the oscilloscope's raster. if(i<100) // Íá ìçí åìöáíßæïíôáé ôá pixels åêôüò ôïõ ñÜóôåñ ôçò äÝóìçò (ð÷ "AVR SCOPE...). // Do not show pixels out of the beam's raster (exlude area with text "AVR SCOPE..."). { data = dataLcdBuffer[i]; for (; data>7; data-=8) lcdAddress -= 128; lcdAddress -= i; for(; data>0; data--) byte >>= 1; lcdBuffer[lcdAddress] |= byte; } } } //==================================================================== // //==================================================================== void enable_cs1 (void) { ctrl_port |= (1<<lcdcs1); //Enable the CS1 of the display ctrl_port &= ~(1<<lcdcs2); //Disable the CS2 of the display } //==================================================================== // //==================================================================== void enable_cs2 (void) { ctrl_port |= (1<<lcdcs2); //Enable the CS2 of the display ctrl_port &= ~(1<<lcdcs1); //Disable the CS1 of the display } //==================================================================== // Wait for graphics LCD to be unbusy //==================================================================== void glcdWait (void) { unsigned char dataIn; data_port_ddr = 0; //Make portB all inputs ctrl_port |= (1<<lcdrw); //Set r/w pin to read ctrl_port &= ~(1<<lcdrs); //Set register select to command do { eStrobe(); dataIn = data_port_pins; //Read busy flag }while bit_is_set(dataIn, 7); // loop until bit7 of 'dataIn' will be cleared. data_port_ddr = 0xff; //Make portB all outputs ctrl_port &= ~(1<<lcdrw); //Set r/w pin to write ctrl_port |= (1<<lcdrs); //Set register select to data } //==================================================================== // //==================================================================== void eStrobe (void) { ctrl_port |= (1<<lcde); //lcd 'E' pin high delayTime(10); ctrl_port &= ~(1<<lcde); //lcd 'E' pin low delayTime(10); } //==================================================================== // //==================================================================== void delayTime (unsigned long counter) { while (counter--); }
دودمانم بر باد رفت
دیدگاه
-
پاسخ : اسیلوسکوپ با AT mega32
کدglcd.h
کد:#include <avr/io.h> #include <avr/pgmspace.h> #define lcdrs 0 // LCD's RS pin is connected to Pin0 of AVR #define lcdrw 1 // LCD's r/w pin is connected to Pin1 of AVR #define lcde 2 // LCD's e pin is connected to Pin2 of AVR #define lcdcs1 5 // LCD's CS1 pin is connected to Pin5 of AVR #define lcdcs2 4 // LCD's CS2 pin is connected to Pin4 of AVR #define lcdrst 3 // LCD's RST pin is connected to Pin3 of AVR #define ctrl_port PORTB #define ctrl_port_ddr DDRB #define ctrl_port_pins PINB #define data_port PORTD #define data_port_ddr DDRD #define data_port_pins PIND void glcdInit (void); void createWelcomeScreen (void); void createRaster (void); void delayTime (unsigned long counter); void glcdWait (void); void eStrobe (void); void enable_cs1 (void); void enable_cs2 (void); void showTheWave (void); void changeLine (unsigned char data); void createWave (void); void fillDataLcdBuffer (unsigned char address, unsigned char data); unsigned char column = 0; unsigned char line = 0; unsigned char lcdBuffer[1024]; unsigned int lcdAddress = 0; unsigned int flashAddress = 0; static unsigned char dataLcdBuffer[128]; unsigned int backupLcdAddress = 0; const char LcdRaster[] __attribute__ ((progmem)) = { 255,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1, 1,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1, 1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1, 1,171,1,1,1,1,1,1,1,1,1,3,1,1,1,1, 1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,3, 1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1, 1,1,1,1,255,0,0,0,0,0,224,80,72,80,224,0, 248,0,0,0,248,0,248,72,200,72,48,0,0,0,0,0, 255,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,8,0,0,0,0,0,0,0,0,0,8,0,0, 0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0, 8,170,8,0,0,0,0,0,0,0,0,8,0,0,0,0, 0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,8, 0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,8,255,0,0,192,32,32,35,0,192,32,35,32, 0,193,34,33,192,0,227,32,32,193,2,224,32,32,32,0, 255,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0, 0,0,0,32,0,0,0,0,0,0,0,0,0,32,0,0, 0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0, 32,170,32,0,0,0,0,0,0,0,0,32,0,0,0,0, 0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,32, 0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0, 0,0,0,32,255,0,0,72,73,73,70,64,71,72,72,72, 64,71,72,72,71,64,79,65,65,64,64,79,73,73,9,0, 255,128,0,128,0,128,0,128,0,192,0,128,0,128,0,128, 0,128,0,192,0,128,0,128,0,128,0,128,0,192,0,128, 0,128,0,128,0,128,0,192,0,128,0,128,0,128,0,128, 128,234,128,128,0,128,0,128,0,128,0,192,0,128,0,128, 0,128,0,128,0,192,0,128,0,128,0,128,0,128,0,192, 0,128,0,128,0,128,0,128,0,192,0,128,0,128,0,128, 0,128,0,128,255,0,0,152,164,160,152,132,164,152,0,0, 48,72,64,48,8,72,48,0,0,0,0,0,0,0,0,0, 255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,171,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,255,0,0,92,82,82,82,82,82,92,0,0, 161,161,161,161,161,161,189,0,0,224,32,64,128,0,0,0, 255,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, 0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, 2,170,2,0,0,0,0,0,0,0,0,2,0,0,0,0, 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2, 0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, 0,0,0,2,255,0,0,198,41,40,230,33,41,38,0,0, 140,82,16,140,66,82,140,0,0,25,164,164,164,165,165,25, 255,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,8,0,0,0,0,0,0,0,0,0,8,0,0, 0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0, 8,170,8,0,0,0,0,0,0,0,0,8,0,0,0,0, 0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,8, 0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0, 0,0,0,8,255,0,0,56,165,37,57,37,165,37,0,0, 49,74,74,121,72,74,73,0,0,99,148,20,36,68,132,243, 255,128,128,128,128,128,128,128,128,160,128,128,128,128,128,128, 128,128,128,160,128,128,128,128,128,128,128,128,128,160,128,128, 128,128,128,128,128,128,128,160,128,128,128,128,128,128,128,128, 160,170,160,128,128,128,128,128,128,128,128,160,128,128,128,128, 128,128,128,128,128,160,128,128,128,128,128,128,128,128,128,160, 128,128,128,128,128,128,128,128,128,160,128,128,128,128,128,128, 128,128,128,128,255,0,0,99,148,132,103,20,148,99,0,0, 17,17,17,17,17,10,4,0,0,60,66,90,82,90,66,60}; const char welcomeScreen[] __attribute__ ((progmem)) = { 255,1,1,1,1,225,33,33,33,33,33,33,33,33,33,33 ,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33 ,33,33,33,33,33,33,225,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,193,225,49,25,25,49,225,193,1,1 ,249,249,1,1,1,1,249,249,1,1,249,249,25,25,25,57 ,241,225,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,255 ,255,0,0,0,0,255,0,0,0,17,0,0,0,17,0,0 ,0,17,0,0,0,0,85,0,0,0,17,0,0,0,17,0 ,0,0,17,0,0,0,255,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,127,127,12,12,12,12,127,127,0,0 ,15,31,48,96,96,48,31,15,0,0,127,127,6,6,6,15 ,123,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255 ,255,0,0,0,0,255,0,8,0,73,0,8,0,73,0,8 ,0,73,0,8,0,8,93,8,0,8,65,8,0,8,65,8 ,0,8,65,8,0,8,255,0,0,0,0,0,0,0,0,0 ,252,254,2,254,252,0,156,190,34,238,204,0,252,254,2,14 ,12,0,0,2,254,254,2,0,254,254,0,0,0,0,254,254 ,0,0,0,0,252,254,2,254,252,0,156,190,34,238,204,0 ,252,254,2,14,12,0,252,254,2,254,252,0,254,254,34,62 ,28,0,254,254,34,34,34,0,0,0,0,0,0,0,0,255 ,255,0,0,0,0,255,0,0,0,68,0,0,0,68,0,0 ,0,68,0,0,0,0,85,0,0,0,68,0,0,0,68,0 ,0,0,68,0,0,0,255,0,0,0,0,0,0,0,0,0 ,1,3,2,3,193,32,1,3,2,3,129,128,129,3,2,3 ,33,192,0,2,3,3,2,0,3,3,2,66,34,32,35,195 ,2,194,34,32,161,195,2,195,33,32,161,195,2,35,33,32 ,161,99,2,3,1,0,1,3,2,227,33,32,35,195,0,128 ,0,0,131,3,2,2,2,0,0,0,0,0,0,0,0,255 ,255,0,0,0,0,3,2,2,2,2,130,130,130,2,2,130 ,130,130,130,130,2,130,131,130,130,2,2,2,130,130,130,2 ,2,2,130,130,130,2,3,0,128,128,128,0,0,128,128,128 ,128,0,0,0,135,136,128,0,0,7,136,136,136,5,0,0 ,8,7,0,0,0,128,0,0,0,128,0,12,138,137,137,8 ,0,7,138,137,136,7,0,7,138,137,136,7,0,0,142,129 ,128,0,0,128,0,0,0,0,0,15,137,137,137,6,0,19 ,148,140,135,0,0,0,0,0,0,0,0,0,0,0,0,255 ,255,0,0,0,0,0,0,0,0,19,36,36,36,25,0,63 ,36,36,36,32,0,63,4,4,12,51,0,63,8,8,8,63 ,0,19,36,36,36,25,0,0,32,63,32,0,0,63,32,32 ,32,31,0,0,32,63,32,0,0,19,36,36,36,25,0,0 ,0,0,0,0,0,15,16,32,16,15,0,63,8,8,8,63 ,0,19,36,36,36,25,0,19,36,36,36,25,0,0,32,63 ,32,0,0,63,32,32,32,32,0,0,32,63,32,0,0,19 ,36,36,36,25,0,0,0,0,0,0,0,0,0,0,0,255 ,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,252,36,36,36,4,0,0 ,0,244,0,0,0,16,224,16,16,32,0,240,16,96,16,224 ,0,240,128,192,128,240,0,128,80,80,80,224,0,16,224,16 ,16,32,0,224,80,80,80,32,0,0,176,176,0,0,0,0 ,0,0,0,0,0,0,8,252,0,0,0,0,128,128,0,0 ,0,248,68,36,20,248,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255 ,255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128 ,128,128,128,128,128,128,128,128,128,129,128,128,128,128,128,128 ,128,129,129,128,128,129,129,129,128,128,128,129,128,128,128,129 ,128,128,129,128,129,128,128,128,129,129,129,129,128,129,129,129 ,128,128,128,128,129,129,129,128,128,128,129,129,128,128,128,128 ,128,128,128,128,128,128,129,129,129,128,128,128,129,129,128,128 ,128,128,129,129,129,128,128,128,128,128,128,128,128,128,128,128 ,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,255};
دودمانم بر باد رفت
دیدگاه
-
پاسخ : اسیلوسکوپ با AT mega32
نوشته اصلی توسط kasperبیخیال. این مدار بیشتر از 100 کیلو نمیتونه. حتی بیشتر از 50 کیلو هم نمیتونه. درسته دوستان ؟
فقط به درد دیدن فرکانس برق شهر میخوره .
Frequency measurement up to 5 kHz - square wave
توانا بود هر که دارا بود ز ثروت دل پیر برنا بود
دیدگاه
دیدگاه