SPDR = 0x00; // не важно
while (!(SPSR & temp)); // ожидание завершения
передачи
PORTB
else
PORTB
}
}
void playback(void)
{
unsigned int page_counter = 0;
unsigned int buffer_counter = 0;
unsigned char active_buffer = 1; // активный буфер = буфер 1
unsigned char temp = 0x80;
TCCR1A = 0x21; // 8 бит ШИМ, используется COM1B
TCNT1 = 0x00; // обнуление счётчика 1
TIFR = 0x04; // сброс флага превышения счётчика 1
TIMSK = 0x04; // разрешение прерывания переполнения счётчика 1
TCCR1B = 0x01; // коэф. Пересчёта счётчика 1 = 1
OCR1B = 0x00; // обнуление выходного регистра сравнения B
// прерывания запрещены, порт SPI включён, «ведущий» режим, первый MSB, 3 режим SPI, Fcl/4
SPCR = 0x5C;
next_page_to_next_buffer (active_buffer, page_counter); // чтение страницы 0
в буфер 1
while (!(PINB & 0x02)); // ожидание завершения передачи данных из страницы 0
в буфер 1
while ((page_counter < 4095)&(!(PIND & 2))) // пока кнопка воспроизведения
(кнопка 1) нажата
{
page_counter++; // теперь берём следующую страницу
next_page_to_next_buffer (active_buffer, page_counter);
active_buffer_to_speaker (active_buffer);
if (active_buffer == 1) // если буфер 1 является активным буфером
{
active_buffer++; // то устанавливаем буфер 2 в качестве активного
}
else // иначе
{
active_buffer--; // устанавливаем буфер 1 в качестве активного
}
}
TIMSK = 0x00; // запрещаем все прерывания
TCCR1B = 0x00; // останавливаем счётчик 1
SPCR = 0x00; // отключаем SPI
}
void next_page_to_next_buffer (unsigned char active_buffer, unsigned int page_counter)
{
unsigned char temp = 0x80;
while(!(PINB & 0x02)); // ждём, пока флэш не освободится
PORTB &= ~DF_CHIP_SELECT; // включаем DataFlash
if (active_buffer == 1) // если буфер 1 активный
{
SPDR = MM_PAGE_TO_B2_XFER; // то передаём следующую страницу в
буфер 2
}
else // иначе
{
SPDR = MM_PAGE_TO_B1_XFER; // передаём следующую страницу в
буфер 1
}
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = (char)(page_counter >> 6);
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = (char)(page_counter << 2);
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // записываем не имеющий значения байт
while (!(SPSR & temp)); // ожидаем завершения передачи
PORTB |= DF_CHIP_SELECT; // выключаем DataFlash и начинаем передачу
}
void interrupt[TIMER1_OVF1_vect] out_now(void)
{
wait = 0; // возникновение прерывания
}
void active_buffer_to_speaker (unsigned char active_buffer)
{
// пока активный буфер не очистится воспроизводим его содержимое на динамике
unsigned int buffer_counter = 0;
unsigned char temp = 0x80;
PORTB &= ~DF_CHIP_SELECT; // включение DataFlash
if (active_buffer == 1) // если буфер 1 активный буфер
{
SPDR = BUFFER_1_READ; // то читаем из буфера 1
}
else // иначе
{
SPDR = BUFFER_2_READ; // читаем из буфера 2
}
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // начать с адреса 0 буфера
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
while (buffer_counter < 528)
{
SPDR = 0xFF; // записываем фиктивное значение в начало
сдвигового регистра
while (!(SPSR & temp)); // ожидаем завершения передачи
while(wait); // ожидаем прерывание переполнения таймера 1
OCR1B = SPDR; // воспроизводим данные из сдвигового регистра
wait = 1; // сброс флага сигнала
buffer_counter++;
}
PORTB |= DF_CHIP_SELECT; // выключение DataFlash
}
void main(void)
{
setup();
for(;;)
{
if (!(PIND & 8)) // если кнопка записи нажата (кнопка 3)
{
PORTB &= 0xF7; // зажигаем LED
recording();
}
if (!(PIND & 4)) // если нажата кнопка очистки (кнопка 2)
{
PORTB &= 0xF7; // зажигаем LED
erasing();
while (!(PIND & 4)); // ждём пока кнопка очистки не
отпущена (кнопка 2)
}
if (!(PIND & 2)) //если нажата кнопка воспроизведения(кнопка 1)
{
PORTB &= 0xF7; // зажигаем LED
playback();
while (!(PIND & 2)); // ждём пока кнопка воспроизведения
не отпущена (кнопка 1)
}
PORTB |= 0x08; // гасим LED во время «холостой» работы
}
}
DataFlash.h
// изменён 19.04.1999
// для использования 8535
#include “ina90.h”
#pragma language=extended
// DataFlash вывод сброса порта (PB 0)
#define DF_RESET 0x01
// DataFlash вывод состояния порта готов/занят (PB 1)
#define DF_RDY_BUSY 0x02
// DataFlash защита от записи загрузочного сектора (PB 2)
#define DF_WRITE_PROTECT 0x04
// DataFlash вывод порта выбора микросхемы (PB 4)
#define DF_CHIP_SELECT 0x10
// буфер 1
#define BUFFER_1 0x00
// буфер 2
#define BUFFER_2 0x01
// определение всех кодов операций
// запись буфера 1
#define BUFFER_1_WRITE 0x84
// запись буфера 2
#define BUFFER_2_WRITE 0x87
// чтение буфера 1
#define BUFFER_1_READ 0x54
// чтение буфера 2
#define BUFFER_2_READ 0x56
// Буфер 1 в основную страницу памяти программы с встроенным стиранием
#define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
// Буфер 2 в основную страницу памяти программы с встроенным стиранием
#define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
// Буфер 1 в основную страницу памяти программы без встроенного стирания
#define B1_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x88
// Буфер 2 в основную страницу памяти программы без встроенного стирания
#define B2_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x89
// Основная страница памяти программы сквозь буфер 1
#define MM_PAGE_PROG_THROUGH_B1 0x82
// Основная страница памяти программы сквозь буфер 2
#define MM_PAGE_PROG_THROUGH_B2 0x85
// автоматическая перезапись страницы через буфер 1
#define AUTO_PAGE_REWRITE_THROUGH_B1 0x58
// автоматическая перезапись страницы через буфер 2
#define AUTO_PAGE_REWRITE_THROUGH_B2 0x59
// сравнение основной страницы памяти с буфером 1
#define MM_PAGE_TO_B1_COMP 0x60
// сравнение основной страницы памяти с буфером 2
#define MM_PAGE_TO_B2_COMP 0x61
// передача основной страницы памяти в буфер 1
#define MM_PAGE_TO_B1_XFER 0x53
// передача основной страницы памяти в буфер 2
#define MM_PAGE_TO_B2_XFER 0x55
// регистр состояния DataFlash для чтения плотности, сравнения состояний,
// и состояния готов/занят
#define STATUS_REGISTER 0x57
// чтение основной страницы памяти
#define MAIN_MEMORY_PAGE_READ 0x52
// очистка 528 байт страницы
#define PAGE_ERASE 0x81
// очистка 512 страниц
#define BLOCK_ERASE 0x50
#define TRUE 0xff
#define FALSE 0x00
РАСЧЕТ ВРЕМЕНИ НАРАБОТКИ НА ОТКАЗ
Интенсивность отказов устройства, содержащего разнотипные элементы, определяется следующим соотношением:
Среднее время наработки на отказ устройства составляет:
Tср = 1/λ
№
Тип элемента
Число элементов Q
λ
Q*λ
1
К1401УД2
AT90S8535-8PI
AT45DB32
2
1
1
0.017*10-6
0.017*10-6
0.017*10-6
0.034*10-6
0.017*10-6
0.017*10-6
2
Паяные соединения
210
10-9
0.21*10-6
3
Конденсаторы
9
0.004*10-6
0.012*10-6
4
Резисторы МЛТ
15
0.02*10-6
0.30*10-6
5
Диод
4
0.02*10-6
0.08*10-6
6
Транзистор
1
0.05*10-6
0.05*10-6
7
Вилка разъема
1
0.011*10-6
0.011*10-6
8
Резонатор
1
0.09*10-6
0.09*10-6
9
Микрофон
1
10-5
10-5
10
Громкоговоритель
1
10-5
10-5
11
Переключатель
3
0.01*10-5
0.03*10-5
Суммарная интенсивность отказов
2.851*10-6
Перечень комплектующих элементов устройства и значений интенсивности их отказов:
Время наработки на отказ разработанного устройства при этом составит:
Тотк=106/1.691=350754 час
ОЦЕНКА КОЛИЧЕСТВА ОШИБОК В ПРОГРАММЕ
N=ΣajZj
Z1- сложность условных операторов If
Z2 – общее число ветвей в программе
Z3 – число связей с прикладными программами
Z4 – число связей с системными программами
Z5 – число операций I/O
Z6 – число вычислительных операторов
Z7 – число операторов обработки данных
Z8 – число комментариев
a1 |
a2 |
a3 |
a4 |
a5 |
a6 |
a7 |
a8 |
0.4 |
0.02 |
0.4 |
0.07 |
0.05 |
0.03 |
0.02 |
-0.002 |
Z1 |
Z2 |
Z3 |
Z4 |
Z5 |
Z6 |
Z7 |
Z8 |
8 |
5 |
4 |
7 |
28 |
25 |
30 |
39 |
N=8.062
Т.о. при данной сложности ПО возможно проявление 9 ошибок
ЗАКЛЮЧЕНИЕ
В результате была разработана структурная и принципиальная схема цифрового диктофона для записи голосовой информации в течение 1 часа. Спроектированное устройство обладает следующими достоинствами: высокая надежность хранения записанной информации, высокая надежность самого устройства вследствие отсутствия движущихся механических деталей; звуковое сопровождение «нажатий» клавиш; удобство работы с диктофоном.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Гук М. Аппаратные средства IBM PC. - С.-Петербург: Издательство «Питер Ком» 999. -816с.
2. Аванесян Г. Р., Левшин В. П. Интегральные микросхемы ТТЛ, ТТЛШ: Справочник. - М.: Машиностроение, 1993
3. Воробьёв Е. П., Сенин К. В. Интегральные микросхемы производства СССР и их зарубежные аналоги - М.: 1990
4. www.atmel.ru