Помогите домучатить...
 
Уведомления
Очистить все

Помогите домучатить мультиплексор

1 Посты
1 Пользователи
0 Likes
4,245 Просмотры
temisvip
(@temisvip)
New Member
Присоединился: 13 лет назад
Сообщения: 1
Topic starter  

Здравствуйте. Разработал и собрал мультиплексор на AtMega48. Хочу реализовать автоматическую выборку максимального значения из 4-х каналов в 4-20 мА на 1 выход в 4-20мА без искажений. Для индикации выбранного канала использовал светодиоды. Программу написал на Си, в чём дело и почему не получается не пойму. :cry:

/**************************************************
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : atm48
Version : 1.1
Date : 27.11.2010
Author : Artem
Company : home
Comments:

Chip type : ATmega48
Clock frequency : 4,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
**************************************************/

#include <mega48p.h>

#include <delay.h>

unsigned int adc_data;
#define ADC_VREF_TYPE 0xC0
#define OCR1_A 0x88
// ADC interrupt service routine
// with auto input scanning
int input_index, adc_real, adc_0, adc_1, adc_2, adc_3, C, C_1, C_2;
int main(void)
{
int adc_isr()

DIDR0=0x0F;
ADCSRA=0xED;
ADCSRB&=0xF8;
ADMUX=(0 | (ADC_VREF_TYPE & 0xff))+input_index;
if (adc_real<0x00CC) adc_isr, input_index++;
if (adc_real>3)
input_index=0;
else ADMUX=(0 | (ADC_VREF_TYPE & 0xff))+input_index;
ADCSRA|=0x80; //ADC on
ADCSRA|=0x40; //ADC start
adc_real=ADCW;
ADCSRA&=~0x40; //ADC stop
ADCSRA&=~0x80; //ADC off (включение и выключение АЦП необходимо для переключения каналов внутренним мультиплексором МК)
if (adc_real<0x00CC)
{adc_isr};
else {
adc_0=adc_real;
ADC_INT;
delay_us(100);
adc_1=adc_real;
ADC_INT;
delay_us(100);
adc_2=adc_real
ADC_INT;
delay_us(100);
adc_3=adc_real;
ADC_INT;
delay_us(100);

if (adc_0>adc_1)
{C = adc_0}
else {C_1 = adc_1};
if (adc_2>adc_3)
C = adc_2
else C_2 = adc_3;
if (C_1>C_2)
C = C_1
else C = C_2;
adc_data = C;

adc_data-=((adc_data*4)/100);
if (ADCW>0x03E0)
{adc_data+=(adc_data/100);}
if (ADCW>0x03F4)
{adc_data+=(adc_data/100);}
if (ADCW>0x03FC)
{adc_data+=(adc_data/100);}

PORTD&=0x87;
PORTD|=(1<<(input_index+3));

#asm("cli")
OCR1AH = (char)(adc_data>>8); // ШИМ на PB1
OCR1AL = (char)adc_data;
#asm("sei")

PORTB=0x00;
DDRB=0x06;
PORTD=0x00;
DDRD=0x78;
TCCR1A=0xA3;
TCCR1B=0x09;
ICR1H = 0x00;//0x09;
ICR1L = 0x00;//0xC4;
TCCR1A = 0x83; // Установка режима работы выхода - PB1
TCCR1B = 0x0A; //start Timer
// Global enable interrupts
#asm("sei")
//delay_us(10);
}
while (1)
{};

}


Цитата