Столкнулся с одной проблемой, нужно реализовать такую схему, чтобы можно было остановить двигатель по срабатыванию нескольких концевиков которые подключены последовательно, и при этом нужно чтобы высвечивался номер концевика. Параллельно концевикам подключены переменные резисторы.
Нашёл подходящий код для моей программы, изменил её под себя, в Proteus работает как надо. А вот на отладочной плате не хочет. После старта программы показывает индикацию как будто на ADC0 всё время +5в. , даже если я провод сажаю напрямую на землю. Кто знает в чём может быть дело?
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20
interrupt [ADC_INT] void adc_isr(void) //стандартное прерывание по ADC от CVAVR
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
void main(void)
{
PORTD=0x00;
DDRD=0xFF;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;
#asm("sei")
while (1)
{
while((adc_data[0]<24)) // Индикация кнопка стоп
{
PORTB.1=0; // Выключить реле двигателя
PORTD=0xF0;
delay_ms (300);
PORTD=0x27;
delay_ms (300); };
if((adc_data[0]>25)&&(adc_data[0]<50)) //Индикация концевик №1
PORTD=0xEB;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>50)&&(adc_data[0]<75)) //Индикация концевик №2
PORTD=0x32;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>75)&&(adc_data[0]<100)) //Индикация концевик №3
PORTD=0xA2;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>100)&&(adc_data[0]<125)) //Индикация концевик №4
PORTD=0xE1;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>125)&&(adc_data[0]<150)) //Индикация концевик №5
PORTD=0xA4;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>150)&&(adc_data[0]<175)) //Индикация концевик №6
PORTD=0x24;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>175)&&(adc_data[0]<200)) //Индикация концевик №7
PORTD=0xEA;
PORTB.1=0; // Выключить реле двигателя
if((adc_data[0]>200)&&(adc_data[0]<225)) //Индикация концевик №8
PORTD=0x20;
PORTB.1=0; // Выключить реле двигателя
//else PORTD=0x00;
while((adc_data[0]>225)) // Индикация работы двигателя
{
PORTB.1=1; // Вкючить реле двигателя
PORTD=0xFE;
delay_ms (50);
PORTD=0xFB;
delay_ms (50);
PORTD=0xEF;
delay_ms (50);
PORTD=0xbf;
delay_ms (50);
PORTD=0x7F;
delay_ms (50);
PORTD=0xFD;
delay_ms (50); };
};
} 


