Если устройство обнаружено, то окно программы выглядит следующим образом.
Перед измерением можно проверить сенсор поочередно закрывая свет светодиодов. При этом программа должна выводить на экран нули. Если этого не происходит, значит сенсор не исправен. Проверить светодиоды можно с помощью цифрового фотоаппарата, web камеры и т.д. и т.п. Эти устройства видят инфракрасный свет излучаемый светодиодами. Если светодиоды светят, то проблема в фототранзисторах. Возможно перепутаны контактики фототранзисторов. Светодиоды могут не светить по той же причине.Добавлено (10.01.2013, 09:42)
---------------------------------------------
Теперь расскажу о программе для микроконтроллера.
Сенсор подключен к ножкам микроконтроллера за которыми закреплены прерывания по внешнему сигналу. Настройка этих прерываний осуществляется с через регистры: External Interrupt Control Register A (EICRA), External Interrupt Control Register B (EICRB), External Interrupt Mask Register (EIMSK), External Interrupt Flag Register (EIFR).
Ниже перечислены биты этих регистров.
EICRA: ISC31, ISC30, ISC21, ISC20, ISC11, ISC10, ISC01, ISC00.
EICRB: -, -, ISC61, ISC60, -, -, -, -.
EIMSK: -, INT6, -, -, INT3, INT2, INT1, INT0.
EIFR: -, INTF6, -, -, INTF3, INTF2, INTF1, INTF0.
Биты отмеченные как "-" не используются. Их значение ни на что не влияет.
Биты ISC01 и ISC00 регистра EICRA отвечают за прерывание INT0. Если бит ISC01 установлен в 1, а бит ISC00 сброшен в 0, то флаг прерывания устанавливается тогда, когда на ножке микроконтроллера PD0 логическая единица сменяется логическим нулем.
Биты ISC11 и ISC10 регистра EICRA отвечают за прерывание INT1. Здесь все аналогично. Только с этим прерыванием связана ножка микроконтроллера PD1.
Биты INT1 и INT0 регистра EIMSK отвечают за разрешение/запрещение прерываний INT1 и INT0. Если они установлены в 1, то эти прерывания разрешены.
Регистр EIFR это регистр флагов прерываний по внешнему сигналу. Запись 1 в биты INTF1 и INTF0 этого регистра приводит к сбросу флагов прерываний INT1 и INT0.
В обработчике прерывания INT0 запускается таймер/счетчик. В обработчике прерывания INT1 таймер/счетчик останавливается и результат счетного регистра пересылается через USART. Затем счетный регистр обнуляется.
Добавлено (10.01.2013, 09:45)
---------------------------------------------
Для подсчета времени я решил использовать шестнадцати разрядный таймер/счетчик 1.
За этим таймером/счетчиком закреплены следующие регистры: Timer/Counter1 Control Register A (TCCR1A), Timer/Counter1 Control Register B (TCCR1B), Timer/Counter1 Interrupt Mask Register (TIMSK1), Timer/Counter1 Interrupt Flag Register (TIFR1), Timer/Counter1 (TCNT1H, TCNT1L). Это не все регистры отведенные таймеру/счетчику 1 разработчиками микроконтроллера, но оставшиеся не важны для данной программы.
Биты регистров.
TCCR1A: COM1A1, COM1A0, COM1B1, COM1B0, COM1C1, COM1C0, WGM11, WGM10.
TCCR1B: ICNC1, ICES1, –, WGM13, WGM12, CS12, CS11, CS10.
TCCR1C: FOC1A, FOC1B, FOC1C, –, –, –, –, –.
TIMSK1: –, –, ICIE1, –, OCIE1C, OCIE1B, OCIE1A, TOIE1.
TIFR1: –, –, ICF1, –, OCF1C, OCF1B, OCF1A, TOV1.
Биты отмеченные как "-" не используются. У них нет названия и их значение ни на что не влияет.
TCNT1H и TCNT1L это счетные регистры таймера/счетчика 1. В них хранится то, что насчитал таймер/счетчик 1. Старший и младший байт соответственно.
В данной программе таймер/счетчик 1 работает в режиме Normal. Для того, чтобы таймер/счетчик 1 работал в этом режиме необходимо, чтобы биты WGM11, WGM10 регистра TCCR1A и биты WGM13, WGM12 регистра TCCR1B были сброшены в 0.
Теперь, чтобы таймер/счетчик 1 начал считать достаточно записать 1 в бит CS10 регистра TCCR1B. В данном случае предделитель не используется. Чтобы остановить таймер/счетчик 1 необходимо сбросить этот бит в 0.
В программе разрешено прерывание по переполнению таймера/счетчика 1. Для этого бит TOIE1 регистра TIMSK1 устанавливается в 1. В конце инициализации флаг этого прерывания сбрасывается записью 1 в бит TOV1 регистра TIFR1.
Обработчик прерывания останавливает таймер, обнуляет счетный регистр и посылает 0 по USART.
Частое получение нулей свидетельствует о неисправности сенсора. Возможно загрязнение светодиодов или фототранзисторов, нарушение контакта и т.д. и т.п.
Добавлено (10.01.2013, 09:50)
---------------------------------------------
Осталось рассказать про настройки USART. В ATmega32U4 для этого предназначены следующие регистры: USART I/O Data Register 1 (UDR1), USART Control and Status Register 1 A (UCSR1A), USART Control and Status Register 1 B (UCSR1B), USART Control and Status Register 1 C (UCSR1C), USART Control and Status Register 1 D (UCSR1D), USART Baud Rate Registers (UBRRH1, UBRRL1).
Биты регистров.
UCSR1A: RXC1, TXC1, UDRE1, FE1, DOR1, UPE1, U2X1, MPCM1.
UCSR1B: RXCIE1, TXCIE1, UDRIE1, RXEN1, TXEN1, UCSZ12, RXB81, TXB81.
UCSR1C: UMSEL11, UMSEL10, UPM11, UPM10, USBS1, UCSZ11, UCSZ10, UCPOL1.
UCSR1D: –, –, –, –, –, –, CTSEN, RTSEN.
Биты отмеченные как "-" не используются.
Регистр UDR1 несколько отличается от прочих. Подробно описывать его реализацию на аппаратном уровне я не буду. Скажу лишь, что в этот регистр помещаются данные предназначенные для передачи через USART и в этот же регистр помещаются данные полученные через USART.
Скорость передачи данных через USART зависит от значения числа записанного в регистры UBRRH1 и UBRRL1. Чтобы USART работал на скорости 9600 bps при тактовой частоте микроконтроллера в 16 MHz в эти регистры необходимо записать 103 (0x00 в UBRRH1 и 0x67 в UBRRL1).
Биты RXEN1 (Receiver Enable 1) и TXEN1 (Transmitter Enable 1) регистра UCSR1B предназначены для управления приемником и передатчиком USART. Записью 1 в эти биты включаются приемник и передатчик USART соответственно.
Бит RXCIE1 (RX Complete Interrupt Enable 1) регистра UCSR1B отвечает за прерывание по завершению приема данных. Запись 1 в этот бит разрешает это прерывание.
От значения бита UCSZ12 регистра UCSR1B и битов UCSZ11, UCSZ10 регистра UCSR1C зависит то, сколько бит данных будет передаваться/приниматься через USART. Запись 0 в UCSZ12 и 1 в UCSZ11, UCSZ10 предписывает USART работать с данными в один байт.
Бит USBS1 регистра UCSR1C определяет число стоп битов в посылке. Записи 0 в этот бит соответствует один стоп бит.
Биты UPM11 и UPM10 регистра UCSR1C предназначены для управления битом паритета. Он используется для контроля целостности переданных/полученных данных. В данной программе бит паритета не используется. Поэтому в биты UPM11 и UPM10 записаны 0.
От битов UMSEL11, UMSEL10 регистра UCSR1C зависит режим работы USART. Я использовал асинхронный режим (Asynchronous Mode). Для этого, при инициализации, эти биты сбрасываются в 0.
Пожалуй, еще нужно упомянуть бит U2X1 регистра UCSR1A. Он предназначен для управления скоростью передачи в асинхронном режиме. Запись 1 в этот бит приводит к удвоению скорости передачи. Ввиду отсутствия необходимости использования этой возможности, бит U2X1 сброшен в 0.
После всех описанных настроек, по завершению приема данных через USART микроконтроллер будет передавать управление обработчику прерывания по завершению приема, где из UDR1 выполняется чтение полученного байта и отправка ответа.
Для передачи байта достаточно поместить его в UDR1. Только прежде необходимо проверить свободен ли регистр. Для этого нужно узнать значение бита UDRE1 регистра UCSR1A. Если UDRE1 равен 1, регистр свободен и можно отправлять данные.