Проблема с симуляцией аналоговых датчиков

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Alex9456
Родился
Сообщения: 2
Зарегистрирован: Вс апр 13, 2014 22:12:38

Проблема с симуляцией аналоговых датчиков

Сообщение Alex9456 »

Здравствуйте, такая проблема делаю курсовой смоделировал устройство (Сигнализация), но не суть.
Вот скрин
СпойлерИзображение


Вот код прошивы:
Спойлер#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>

// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>
#include <ds18b20.h>

#include <stdlib.h>
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x40
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// 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;
}
float result;
float db;
int tempdb=0;
unsigned char devices;


void main(void)
{
int g1;
int g2;
int ik;
int ik1;
float db1;
float temper;
float temper1;
float prov;
unsigned char rom_code[4][9]; //масив с адресами найденых датчиков



PORTD=0x00;
DDRD=0xFF;


PORTB=0xFF;
DDRB=0x00;
devices=w1_search(DS18B20_SEARCH_ROM_CMD,rom_code); //определим сколько устройств подключено к шине 1-Wire

// ds18b20_init(&rom_code[0][0],-20,50,DS18B20_12BIT_RES);
// ds18b20_init(&rom_code[1][0],-21,50,DS18B20_12BIT_RES);

w1_init(); // Wire Bus initialization

ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;
//#asm("sei")
temper1=ds18b20_temperature(&rom_code[1][0]);
while(1)
{
temper=ds18b20_temperature(&rom_code[0][0]);

if(temper>=35) {
ik=1;
}

if(temper<35) {
ik=0;
}

delay_ms(50);


temper1=ds18b20_temperature(&rom_code[1][0]);
if(temper1>=35) {
ik1=1;
}

if(temper1<35) {
ik1=0;
}


if(tempdb==0) {
result=((5.00*adc_data[0])/1024.00);

if(result<0.00) {
result=result*(-1.00);
}

db=20.00*log(result/5.00);

if(db<0.00) {
db1=db*(-1);
if((db1>10)) {
tempdb=1;
}
}

}

if(PINB.1==1){
g1=1;
}

if(PINB.2==1){
g2=1;
}


if(PINB.1==0){
g1=0;
}

if(PINB.2==0){
g2=0;
}





if(g1+g2+ik+tempdb+ik1>=3) {
PORTD.1=1;


}



if(g1+g2+ik+tempdb+ik1<3) {
PORTD.1=0;
}

delay_ms(100);


}
}


Все нормально запускается, в логах варниг simulation is not running in real time due to excessive cpu load

И где-то если оставить симуляцию на минуту, то протеус закроется без ошибок просто уйдет.
P.S проблема в обработке аналогового сигнала как я понял(так как если убрать вольтметр все уходит)

Ненадо спрашивать зачем я там понавешивал(он как бы моделирует звуковой датчик снимает напряжение в точках звука и я его перевожу в Дб(все очень усовно!)) помоги как решить проблему.

Машина Core I5 ОЗУ хватает!
Ответить

Вернуться в «Периферия»