Это стенд для обучения медиков по кровообращению. В общем есть 2 режима: обучение и контроль, в режиме обучения при нажатии на определенную кнопку, например "височная" загорается в определенном месте диод у височной артерии. В режими контроль, случайным образом загораются диоды, и нужно нажать на кнопку с правильным ответом, если ответ правилен высвечивается диод верно, иначе неверно. Так же есть кнопка сброс. Ребят. помогите пожалуйста! Сроки работы горят, этот код дал мне коллега к приблизительно похожему стенду.
// Скелет
#define F_CPU 8000000UL // Частота - 8 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#define PortD PORTD
#define PortC PORTC
#define BOUDRATE 51 // 9600
volatile uint8_t out[49], num, key;
volatile uint8_t rndcase, choice, j, k;
void PLAY (uint8_t track)
{
UDR0 = track; MY_DEL(100);
}
void MY_DEL(int max)
{
for (int i = 0; i < max; i++)
{
if (~(PINC) & (1<<PC1))
{
PortC |= (1 << PC0); // вкл "сброс"
PLAY(49); _delay_ms(800);
WDTCSR |= (1<<WDCE);
WDTCSR |= (1<<WDE); // запуск сторожевого таймера
PortC &= ~(1 << PC0); // выкл "сброс"
}
_delay_ms(0.5);
}
}
void LIGHT ()
{
for (j = 1; j < 49; j++)
{
if (out[49-j] == 1) PortD |= (1 << PD3); // состояние '1' на DS
PortD |= (1 << PD0); MY_DEL(1); // тактовый импульс '1'
PortD &= ~(1 << PD3); // состояние '0' на DS
PortD &= ~(1 << PD0); MY_DEL(1); // тактовый импульс '0'
}
PortD |= (1 << PD2); // состояние '1' на STCP - начало импульса защелки
MY_DEL(1);
PortD &= ~(1 << PD2); // состояние '0' на STCP - конец импульса защелки
}
void Opros(void)
{
while (key == 0)
{
for (j = 1; j < 33; j++)
{
PortD |= (1 << PD7); // стартовый импульс '1'
for (k = 0; k < j; k++)
{
PortD |= (1 << PD0); MY_DEL(1); // тактовый импульс '1'
PortD &= ~(1 << PD7); // стартовый импульс '0'
PortD &= ~(1 << PD0); MY_DEL(1); // тактовый импульс '0'
}
PortD |= (1 << PD6); // состояние '1' на STCP - начало импульса защелки
MY_DEL(1);
PortD &= ~(1 << PD6); // состояние '0' на STCP - конец импульса защелки
if ((PIND & (1<<PD4))) { num = j; key = 1;} //обработка первой платы
if ((PIND & (1<<PD5))) { num = j+32; key = 1;} //обработка второй платы
}
MY_DEL(10);
}
key = 0;
}
void KONTROL(void)
{
PLAY(45); out[45] = 1; LIGHT(); // вкл "контроль"
MY_DEL(1); srand(TCNT0); // начальное значение генератора
while (1)
{
out[choice] = 0; out[47] = 0; LIGHT(); // выкл "верно" и ответ
num = 0; rndcase = 1 + rand()%44; // выбор процессора
while (rndcase != num)
{
out[choice] = 0;
out[48] = 0; LIGHT(); // выкл "ошибка" и ответ
out[rndcase] = 1; LIGHT(); // зажигаем выбор MK
Opros(); choice = num; // ответ пользователя
out[choice] = 1; LIGHT(); // вкл выбор студента
if (rndcase !=choice)
{
out[48] = 1; LIGHT(); // вкл "ошибка"
PLAY(48); MY_DEL(2000); // проигрываем трек
}
}
out[47] = 1; LIGHT(); // вкл "верно"
PLAY(47); MY_DEL(2000); // проигрываем трек
}
}
void STUDY ()
{
PLAY(46); out[46] = 1; LIGHT(); MY_DEL(1); // вкл "обучение"
while (1)
{
Opros(); choice = num; // ответ пользователя
out[choice] = 1; LIGHT(); // вкл выбор студента
PLAY(choice); MY_DEL(2000); // проигрываем трек
out[choice] = 0; LIGHT(); // выкл выбор студента
}
}
int main(void)
{
MCUSR &= ~(1<<WDRF); // очищаем флаг сброса на всякий случай
WDTCSR |= (1<<WDCE)|(1<<WDE); // разрешаем изменение бита вкл/выкл таймера и пишем "1"
WDTCSR = 0x00; // очищаем все биты таймера
DDRD = 0b11001111; PORTD = 0b00000000;
DDRC = 0b00000001; PORTC = 0b11111110;
TCCR0B |= (1<<CS01); // старт счетчика, предделитель 8
LIGHT(); // базовое состояние герконов и светодиодов
UCSR0A=0x80;
UCSR0B=0x48; //d8
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);
UBRR0H = (unsigned char)(BOUDRATE>>8);
UBRR0L = (unsigned char)BOUDRATE;
// UCSR0B |= (1 << TXEN0); // разрешаем работу USART передатчика (UCSR0B=0x08)
// UCSR0C = (1 << UCSZ01)|(1 << UCSZ00); // задаем длинну байта - 8 бит (UCSR0C=0x06)
// UBRR0L=0x12; // задеем скорость передачи (UBRR0H=0x00; UBRR0L=0x17)
num = 0;
while (1)
{
MY_DEL(900); // выкл "сброс"
if (~(PINC) & (1<<PC2)) KONTROL(); //обработка нажатия "КОНТРОЛЬ"
if (~(PINC) & (1<<PC3)) STUDY(); //обработка нажатия "ОБУЧЕНИЕ"
PortC |= (1 << PC0); MY_DEL(900); // вкл "сброс"
PortC &= ~(1 << PC0); // выкл "сброс"
if (~(PINC) & (1<<PC2)) KONTROL(); //обработка нажатия "КОНТРОЛЬ"
if (~(PINC) & (1<<PC3)) STUDY(); //обработка нажатия "ОБУЧЕНИЕ"
}
}
Помогите разобраться с кодом.
- Реклама
Re: Помогите разобраться с кодом.
Нечитаемо совершенно. Оформите исходник вложением, или хотя бы используйте тег code.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
