Че то у меня какието странные проблеммы с i2c Взял код из примера программирования OR, почитал первоисточник http://www.robot-electronics.co.uk/htm/Atmega32.htm и написал свои функции для CMPS03, SRF08, I2C-It но работает только с CMPS03 при попытке общения с другими девайсами все виснет ((( что странно так как вроде по DeaD этим кодом SRF08 читал ... Код для CMPS03
unsigned int range; i2c_transmit(0xE0,0,0x51); // Даём команду на запуск сонара, указав результат вернуть в сантиметрах _delay_ms(70); // Ждем 70мс, пока сонар проведёт измерение range = i2c_read(0xE0,2) <<8; // Читаем старший бит расстояния range += i2c_read(0xE0,3); // Читаем младший бит расстояния printf("Range: %d\n",range); //Покажем результат по уарту _delay_ms(930); //Ждем 0.930 сек (мерять будем раз в секунду)
Если даёшь на вход модуля +5, то на выходе линейного стабилизатора будет что-то типа 4В с копейками, сонар не заведётся. Просто компас более толерантен к просадкам напряжения, а может там вообще регулятор до 3.3В стоит...
И вообще! в документации сказано:
Контроллер общего назначения с портом ДД Микроконтроллер: ATMega32 @ 7.3728 МГц Напряжение питания: 6-16 В
На выходных запитал от 7 вольт проблема не решилась. при более тщательном осмотре увидел что срабатывает светодиод 1 раз. написал программу на баскоме ... все работает и при 7 вольтах и при 5 вольтах. короче где то косяк в коде примера от Devantech ...
Короче проблемма порешалась. Все как обычно оказалось в сущей мелочи. Прочитал доку от начала внимательно. В проекте почему то не сохраняется значение частоты контроллера. Если каждый раз ставить при открытии и компилировать то все работает.