/*
Тип чипа |
ATmega8 |
Тактовая частота |
3,000000 MHz |
Модель памяти |
Small |
Внешний размер |
0 |
Размер данных стека |
256 |
*/
1. #include <mega8.h> /* Включаем библиотеку для работы с микроконтроллером Atmega8 */
2. #include <stdio.h> /* Включаем стандартный заголовочный файл ввода-вывода */
3. #include <delay.h> // Включаем библиотеку для организации задержек
4. void avr_init(void) // Инициализация контроллера
5. {
6. DDRB = 0b11101111; /* Зададим бит 4 порта В как вход, остальные - выходы */
7. PORTB=0b11011111; /* Установим бит 5 порта В как выход, на котором установлен уровень логического 0, остальные – логическая 1 */
8. DDRD = 0xFF; // Зададим все биты порта D как выходы
9. PORTD = 0x00; /* Установим все биты порта D как выходы, на которых установлен уровень логического 0 */
/* Инициализация USART
Параметры связи: 8 данных, 1 стоп, без контроля четности
USART Приемник: Выключен
USART передатчика: Включен
USART Режим: Асинхронный */
10. UCSRA=0x00; // Обнуляем регистр состояния
11. UCSRB=0x08;
12. UCSRC=0x86;
13. UBRRH=0x00; // Регистр UBRR отвечает за скорость передачи данных.
14. UBRRL=0x19; /*Задаются значения младшего (L) и старшего (H) байтов регистра */
15. }
16. unsigned int adc_read() //определяем функцию чтения из АЦП
17. {
18. int i; // объявляем целую переменную
19. unsigned int result=0; /* объявляем и инициализируем целую без знака переменную */
20. PORTB.1 = 1; /* Устанавливаем бит 1 порта В как выход, на котором установлена логическая единица */
21. PORTB.2 = 0; //CS = 0
22. delay_us(20); // сгенерируем задержку в 20 мкс
23. PORTB.5 = 1; /* Устанавливаем бит 5 порта В как выход, на котором установлена логическая единица */
/* #asm – говорит компилятору о начале ассемблерного кода. Ее используют для включения в любое место исходной программы ассемблерного кода. NOP - команда, которая предписывает ничего не делать. */
24. #asm("nop")
25. #asm("nop")
26. #asm("nop")
27. #asm("nop")
28. #asm("nop")
29. #asm("nop")
30. #asm("nop")
31. #asm("nop")
32. #asm("nop")
33. #asm("nop")
34. #asm("nop")
35. #asm("nop")
36. PORTB.5 = 0; /* Устанавливаем бит 5 порта В как выход, на котором установлен логический ноль */
37. for(i=0;i<16;i++) /* цикл будет выполняться, начиная со значения i=0, после каждого выполнения цикла i будет увеличиваться на единицу и тело цикла будет выполняться с новым значением i до тех пор, пока i не превысит 16 */
38. {
39. PORTB.5 = 1; //SS=1
40. #asm("nop")
41. #asm("nop")
42. #asm("nop")
43. #asm("nop")
44. delay_us(8); // сгенерируем задержку в 8 мкс
45. if (PINB.4 == 0) result = result << 1; /* Если DOUT=0, тогда просто сдвигаем result влево */
46. if (PINB.4 == 1) result = (result << 1) + 1; /* Если DOUT=1 - тогда сдвигаем и прибавляем единицу */
47. PORTB.5 = 0; //SS=0
48. delay_us(10); // сгенерируем задержку в 10 мкс
49. };
50. PORTB.5 = 0; /* Устанавливаем бит 5 порта В как выход, на котором установлен логический ноль */
51. PORTB.2 = 1; //CS=1
52. PORTB.1 = 0; /* Устанавливаем бит 1 порта В как выход, на котором установлен логический ноль */
53. return result; // возвращаем значение переменной
54. }
55. void main(void) // основная функция программы
56. {
57. unsigned long a; // объявляем длинную без знака переменную
58. avr_init(); // первоначальная инициализация процессора
/* printf является универсальной функцией для форматного вывода */
59. printf("Test");
60. while(1) // бесконечный цикл
61. {
62. a = 0; // переменной а присваивается 0
63. a = adc_read(); // переменной а присваивается adc_read()
64. PORTD.6 = 1; /* Устанавливаем бит 6 порта В как выход, на котором установлена логическая единица */
65. delay_ms(100); // сгенерируем задержку в 100 мс
66. PORTD.6 = 0; /* Устанавливаем бит 6 порта В как выход, на котором установлен логический ноль */
67. printf("%04d",a); /* спецификация преобразования %04d означает, что число а будет напечатано в поле с шириной, по крайней мере в 6 символов в десятичном виде(символ преобразования ‘d’ */
68. delay_ms(1000); // сгенерируем задержку в 1000 мс
69. };
70. }
Знаками /* (начало) и */ (конец) выделены блоки с комментариями, а затем знаком // - строки с комментариями.
Рисунок 5.1 – Проверка работы SPI
Рисунок 5.2 – Осциллограмма
Рисунок 5.2 – Собранная вPROTEUS схема
Рисунок 5.1 – Код программы в AVR Studio |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.