Всем привет!
Задумал я для детишек сделать машинку-робота, которая б ездила по комнате объезжая препятствия.
Для начала реализовал робота, двигающегося на свет, без анализа препятствий. Сделал. Ездит.
Дальше упёрся в ИК-локатор. Перелопатил массу сайтов и решений, остановился на такой прогамной реализации:
Вот линк на сайт с которого я взял идею
http://licrym.org/index.php/ИК_бампер
/************************************************** ***
This program was produced by the
CodeWizardAVR V1.25.7 beta 5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 24.02.2008
Author : Spiritus Sancti
Company : licrym.org
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/
#include ‹mega8.h›
#include ‹delay.h›
#define ADC_VREF_TYPE 0x40
bit ADC_complete;
int gADC_result;
interrupt [ADC_INT] void adc_isr(void) //обработчик прерывания по завершению преобразования АЦП
{
unsigned int adc_data;
adc_data=ADCW;
gADC_result=adc_data; //отсылаем считанное значение в глобальную переменную и устанавливаем флаг
ADC_complete=1;
}
int poll_sensor(void){ //процедура опроса сенсора
int delta;
PORTB.0=1; //включаем светодиод ИК подсветки
delay_ms(1); //ждем пока разгорится
ADCSRA|=0x40; //отсылаем бит, запускающий процедуру АЦП
while(ADC_complete!=1); //ждем пока не закончится АЦП
delta=gADC_result;
ADC_complete=0; //сбрасываем флаг
PORTB.0=0; //выключаем светодиод, и снова измеряем
delay_ms(1);
ADCSRA|=0x40;
while(ADC_complete!=1);
delta=gADC_result-delta;//вычисляем значение разности
ADC_complete=0; //сбрасываем флаг
return delta;
}
void main(void)
{
int razn;
//инициализация портов и т.д.
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8B;
// Global enable interrupts
#asm("sei")
while (1)
{
razn=poll_sensor();
//пример использования сенсора. Присвоим переменной значение разности,
// и в зависимости от полученного значения будем зажигать светодиоды на порту D
//можно просто запускать какой либо процесс, если разность превышает определенный порог
if(razn ›10) PORTD.0=1;
if(razn ›20) PORTD.1=1;
if(razn ›30) PORTD.2=1;
if(razn ›40) PORTD.3=1;
if(razn ›50) PORTD.4=1;
if(razn ›60) PORTD.5=1;
if(razn ›70) PORTD.6=1;
if(razn ›80) PORTD.7=1;
delay_ms(1);
PORTD=0;
};
}
Запустил симуляцию в Протеусе. И тут начались для меня непонятки.
Оговорюсь, что в програмировании я новичок, хотя читаю уже года 4 это дело и могу писать прстейшие програмки на Си, это для меня хобби.
Так вот, что у меня с Протеусом не ясно.
После запуска симуляции выскакивает масса одинаковых сообщений (порядка 400-т):
PC=0x00AC. [AVR AD CONVERTER] Reference value = 0.
PC=0x00BA. [AVR AD CONVERTER] Reference value = 0.
PC=0x00AC. [AVR AD CONVERTER] Reference value = 0.
PC=0x00BA. [AVR AD CONVERTER] Reference value = 0.
PC=0x00AC. [AVR AD CONVERTER] Reference value = 0.
PC=0x00BA. [AVR AD CONVERTER] Reference value = 0.
PC=0x00AC. [AVR AD CONVERTER] Reference value = 0.
PC=0x00BA. [AVR AD CONVERTER] Reference value = 0.
PC=0x00AC. [AVR AD CONVERTER] Reference value = 0.
Вот эти строки на которые ругается Протеус:
PC=0x00AC while(ADC_complete!=1); //ждем пока не закончится АЦП
PC=0x00BA while(ADC_complete!=1);
Ещё и такое выскакивает:
ADC_complete R-254 ¦элемент (1 байт 0xFFFFFF02) вне блока памяти (0x00000460 байт).
gADC_result R-64252:R-64251 ¦элемент(2 байт 0xFFFF0504) вне блока памяти(0x00000460 байт).
На 23 ногу проца я повесил переменный резистор, никакой индикации на PORTD НЕТ.
На 14-й ноге генерация есть.
Если запустить в железе это дело, то всё работает. Я ИК-датчик пока не пробовал вешать, но если касаться рукой АЦП-входа, то на выходе порта D появляются импульсы.
Что не правильно, почему не работает симуляция? Помогите, пожалуйста.