Есть такая задачка, сваять измеритель мощности на atmega32p. Первое время все шло гладко, вроде и схему сваял и код написал
#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//--------------------------------------------
unsigned int i;
unsigned char R1=0, R2=0;
//--------------------------------------------
void segchar (unsigned char seg)
{
switch(seg)
{
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11111000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
case 0: PORTD = 0b11000000; break;
}
}
//--------------------------------------------
void timer_ini(void)
{
TCCR1B |= (1<<WGM12);
OCR1AH = 0b00001111; //записываем в регистр число для сравнения
OCR1AL = 0b01000010;
TCCR1B |= (1<<CS11);//установим делитель.
}
//--------------------------------------------
unsigned char n_count=0;
//--------------------------------------------
ISR (TIMER1_COMPA_vect)
{
if(n_count==0) {PORTB&=~(1<<PORTB0);PORTB|=(1<<PORTB1);segchar(R1);}
if(n_count==1) {PORTB&=~(1<<PORTB1);PORTB|=(1<<PORTB0);segchar(R2);}
n_count++;
if (n_count>1) n_count=0;
}
//--------------------------------------------
void ledprint(unsigned int number)
{
R1 = number%10;
R2 = number/10;
}
//--------------------------------------------
void ADC_Init(){
ADCSRA |= (1 << ADEN) // Включаем АЦП
|(0 << ADPS1)|(0 << ADPS0); // устанавливаем пределитель преобразователя на 8
ADMUX=(1<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(1<<REFS0)|(0<<REFS1);
}
int main(void)
{
unsigned int u;
ADC_Init();
timer_ini();
DDRD = 0xFF;
DDRB = 0b00111111;
PORTD = 0b11111111;
PORTB = 0b0000000;
i=0;
sei();
ledprint(97);
while(1)
{
unsigned int u, u_VCC;
ADCSRA|=(1<<ADEN) //Включение АЦП
|(1<<ADPS1)|(1<<ADPS0); // Предделитель преобразователя на 8
ADMUX|=(0<<MUX0)|(1<<MUX1)|(1<<MUX2)|(0<<MUX3)//Вход PC0
|(1<<REFS0)|(0<<REFS1); //AVcc является опорным напряжением
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
if (u > -32767){
PORTD = 0b00000110;
}else{
PORTD = 0b00111111;
}
/*
switch(max)
{ case -1: PORTD = 0b00000110; break;
case -2: PORTD = 0b01011011; break;
case -3: PORTD = 0b10110000; break;
case -4: PORTD = 0b10011001; break;
case -5: PORTD = 0b10010010; break;
case -6: PORTD = 0b10000010; break;
case -7: PORTD = 0b11111000; break;
case -8: PORTD = 0b10000000; break;
case -9: PORTD = 0b10010000; break;
case 0: PORTD = 0b00111111; break;
case 1: PORTD = 0b00000110; break;
case 2: PORTD = 0b01011011; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11111000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
};*/
/*
PORTB = 0b11111110;
PORTD = 0b00000110;
_delay_ms(1);
PORTB = 0b11111111;
Центральный верхний
PORTB = 0b11111101;
PORTD = 0b01011011;
_delay_ms(1);
PORTB = 0b11111111;
//Левый верхний
PORTB = 0b11111011;
PORTD = 0b01001111;
_delay_ms(1);
PORTB = 0b11111111;
//Правый нижний
PORTB = 0b11110111;
PORTD = 0b01100110;
_delay_ms(1);
PORTB = 0b11111111;
//Центральный нижний
PORTB = 0b11101111;
PORTD = 0b01101101;
_delay_ms(1);
PORTB = 0b11111111;
//Левый нижний
PORTB = 0b11011111;
PORTD = 0b01111101;
_delay_ms(1);
PORTB = 0b11111111;
*/
}
}
только вот значение получаемое в "u" (в нее мы ADC получаем) равно -32768 вместо положенного диапазона от 100 до 600, может кто подскажет чего?