Proteus. Выдает ошибку
Сделал схему ультразвукового дальномера на основе микроконтроллера ATmega8. Загрузил код в микроконтроллер, после чего выдал вот такую ошибку: Invalid opcode 0xFFFF at PC=0x0002 @0.000002000s. Эта ошибка возникает из-за кода или схемы?
#include <mega8.h>
#include <delay.h>
#include <alcd.h>
#include <stdio.h>
#define TRIGGER_PIN 0
#define ECHO_PIN 1
#define RS_PIN 3
#define RW_PIN 2
#define E_PIN 1
#define D4_PIN 4
#define D5_PIN 5
#define D6_PIN 6
#define D7_PIN 7
#define SB1_PIN 2
#define SB2_PIN 3
#define SB3_PIN 6
#define SB4_PIN 1
#define SB5_PIN 0
unsigned int distance = 0;
int temperature = 25; // Начальная температура
void trigger_pulse() {
PORTD.0 = 1;
delay_us(10);
PORTD.0 = 0;
}
unsigned int measure_distance() {
unsigned int time = 0;
trigger_pulse();
while (!PIND.1);
TCNT1 = 0;
while (PIND.1){
time = TCNT1;
}
return (time / 58 / 2);
}
void measure_temperature() {
// Отправляем команду для измерения температуры US-100
PORTD.0 = 1;
delay_ms(1);
PORTD.0 = 0;
delay_ms(1);
// Команда для измерения температуры
PORTD.0 = 1;
delay_ms(100);
PORTD.0 = 0;
// Считываем температуру
temperature = 25;
}
void increase_distance() {
if (distance < 999) {
distance += 10;
}
}
void decrease_distance() {
if (distance >= 10) {
distance -= 10;
}
}
void main(void) {
char str[16];
DDRC.0 = 0; // Настройка входа для SB5
DDRC.1 = 0; // Настройка входа для SB4
DDRC.2 = 1; // Настройка вывода для SB1
DDRC.3 = 1; // Настройка вывода для SB2
DDRC.6 = 1; // Настройка вывода для SB3
DDRD.0 = 1;
DDRD.4 = 1;
DDRD.5 = 1;
DDRD.6 = 1;
DDRD.7 = 1;
DDRB.1 = 1;
DDRB.2 = 1;
DDRB.3 = 1;
PORTC.2 = 1; // Включение подтягивающего резистора для SB1
PORTC.3 = 1; // Включение подтягивающего резистора для SB2
PORTC.6 = 1; // Включение подтягивающего резистора для SB3
lcd_init(16);
while (1) {
lcd_clear();
lcd_gotoxy(0, 0);
sprintf(str, "Distance: %u cm", distance);
lcd_puts(str);
lcd_gotoxy(0, 1);
sprintf(str, "Temperature: %d C", temperature);
lcd_puts(str);
if (PINC.0 == 0) {
measure_distance();
} else if (PINC.1 == 0) {
measure_temperature();
} else if (PINC.2 == 0) {
increase_distance();
} else if (PINC.3 == 0) {
decrease_distance();
} else if (PINC.6 == 0) {
// Действие для SB3 (RESET)
while (1);
}
delay_ms(500);
}
