Код:
Код: Выделить всё
#include <io.h>
#include <tiny13.h>
#include <delay.h>
// Declare your global variables here
unsigned int adc_data;
// Bandgap Voltage Reference: On
//#define ADC_VREF_TYPE ((1<<REFS0) | (0<<ADLAR))
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
if ((ADCH>>1) != (adc_data>>1)) // отбрасываю младший разряд и проверяю, есть ли изменения. Устранение "дребезга"
{
adc_data = ADCH;
}
}
void Send_SPI(char data) //куча функций для вывода на один индикатор
{int i=0;
PORTB.2=0; //ss
for (i=0;i<9;i++)
{ delay_us(100);
PORTB.1=1;//SCK
if((data&(1<<i))==(1<<i))
{
PORTB.0=1; //MOSI
delay_us(100);
}
else
{
PORTB.0=0; //MOSI
delay_us(100);
}
delay_us(100);
PORTB.1=0; //SCK
};
delay_us(100);
PORTB.2=1;
}
//
void SPI_int(int num)
{
//char data;
if(num==0)
{ Send_SPI(0b00111111);}
if(num==1)
{ Send_SPI(0b00000110);}
if(num==2)
{ Send_SPI(0b10011011);}
if(num==3)
{ Send_SPI(0b10001111);}
if(num==4)
{ Send_SPI(0b10100110);}
if(num==5)
{ Send_SPI(0b10101101);}
if(num==6)
{ Send_SPI(0b10111101);}
if(num==7)
{ Send_SPI(0b00000111);}
if(num==8)
{ Send_SPI(0b11111111);}
if(num==9)
{ Send_SPI(0b10101111);}
// Send_SPI(data);
if(num==-1)
{ Send_SPI(0b00000000);}
}
// Read the AD conversion result
// with noise canceling
//unsigned int read_adc(unsigned char adc_input)
//{
//ADMUX=adc_input | ADC_VREF_TYPE;
//// Delay needed for the stabilization of the ADC input voltage
//delay_us(10);
//#asm
// in r30,mcucr
// cbr r30,__sm_mask
// sbr r30,__se_bit | __sm_adc_noise_red
// out mcucr,r30
// sleep
// cbr r30,__se_bit
// out mcucr,r30
//#endasm
//return adc_data;
//}
void send_int(int inp)
{
int i=0;
char N[4];
N[0]=inp/1000;
N[1]=(inp-N[0]*1000)/100;
N[2]=(inp/10-N[0]*100-N[1]);
N[3]=(inp-N[0]*1000-N[1]*100-N[2]*10);
for(i=0;i<4;i++)
{ SPI_int(N[i]);
delay_ms(500);
SPI_int(-1);
Send_SPI(0b10000000);
delay_ms(500);
SPI_int(-1);
}
SPI_int(-1);
delay_ms(3000);
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
//// ADC initialization
//// ADC Clock frequency: 62,500 kHz
//// ADC Bandgap Voltage Reference: On
//// ADC Auto Trigger Source: ADC Stopped
//// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
//DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
//ADMUX=ADC_VREF_TYPE;
//// ADMUX=0b01100001;
//ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
//ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
//
#asm("cli")
//========Разрешения прерываний АЦП микроконтроллера======
ADCSRA = ADCSRA|(1<<ADEN)|(1<<ADATE); //разрешение на работу АЦП, автозапуск.
ADCSRA = ADCSRA|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); //установка предделителя
ADCSRB = ADCSRB|(1<<ACME); //Установил режим работы непрерывного преобразования.
ADMUX = ADMUX|(0<<MUX1)|(1<<MUX0);//указал, какой у меня вход задействован в качестве АЦП.
ADMUX = ADMUX&(~(1<<REFS0));// установка источника опорного напряжения = VCC
ADMUX = ADMUX|(1<<ADLAR); // Результат преобразования сдвинут вправо. Результат можно читать из ADCH при этом в ADCL будут храниться в 7 и 8 бите младшие разряды рпеобразования, ими в нашем случае можно пренебречь.
DIDR0 = DIDR0|(1<<ADC2D); // отключение цифрового буфера от канала ADC2.
ADCSRB = (ADCSRB&0b11111000)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0); //Установка источника сигнала для выполнения преобразования...000 - непрерывное преобразование.
ADCSRA = ADCSRA|(1<<ADIE); //Разрешение прерывания
ADCSRA = ADCSRA|(1<<ADSC);//Запуск первого преобразования
//=======КОНЕЦ Разрешения прерываний АЦП микроконтроллера=
// Globally enable interrupts
#asm("sei")
while (1)
{
send_int(adc_data);
}
}

