Как я побеждал I2C (STM8L)

Убил сегодня весь день на то, чтобы заставить дискавери читать датчик sht21 и выводить показания на LCD стекляшку.

В общем-то первые результаты, похожие на адекватные, появились довольно скоро. Но на то, чтобы заставить эту шляпу не зависать каждые пять минут, пришлось убить сотни времени.
На данный момент поделие работает уже 15 минут и даже ни разу не зависло (постучал по деревяшке, чтоб не сглазить :)). А зависало оно потому, что датчик внезапно взбыкивал и давал NACK. Поделие ожидало флага завершения передачи в бесконечном цикле — нормальная ситуация, казалось-бы. Но в этих ваших (теперь уже моих) STM8, если нам не сказали ACK, поднимется флаг AF (Acknowledge Fail), а флаг готовности — нет. (Вообще i2c там укуреный чуть менее, чем совсем. В AVR был явно проще)

Но с фига ему <датчику>, спрашивается, не подавать ACK? Датчик исправен (проверял через FT232), скорость не велика — 10кГц. После долгих плясок выяснилось, что если уменьшить скорость до 1кГц, то глюк пропадает. Но блин, чо ему на 10к не работается-то?!11

Завтра буду пытаться осознать тот black magic, который сейчас крутится в процессоре и как-то его оптимизировать (4к4 байта кода на выходе!).

Алсо, ловите креативные держалки для платы:
Mindfuck: где-то в тексте есть баг, найди его :)
Mindfuck: где-то в тексте есть баг, найди его :)

За сим разрешите откланятся,
sbi MCUCR, SE
sleep
  • 0
  • 23 июля 2011, 01:23
  • dcoder

Комментарии (12)

RSS свернуть / развернуть
а покажи код инициализации I2C?
0
Пока все сделано через стандартную библиотеку:
I2C_DeInit(I2C1);
   I2C_Init(I2C1, 1000, 0x38, I2C_Mode_I2C, I2C_DutyCycle_2, I2C_Ack_Enable,I2C_AcknowledgedAddress_7bit);

Цифра 0x38 это адрес в режиме ведомого. У меня этот режим не используется, поэтому можно писать всякую чушь.
0
А можно это же только скопированое из окна дизасемблера?
0
А я писал, что i2c в этих ваших stm8 невнятен, чуть более чем полностью:)
0
  • avatar
  • PRC
  • 23 июля 2011, 04:22
С датчика готовая влажность приходит, или ее надо считать?
Нужно ли приводить ее к текущей температуре?

ОМГ, что там за хаос на заднем фоне 0_0
0
К температуре приводить не надо,
а считать по такой формуле:
Влажность [%] = -6 + 125*(CODE/65536)
Упрощается до этого:
RH = -6 + raw_RH/524;


На заднем фоне балкон, куда складируется все то, что не получилось вывезти на дачу :) На самом деле хаос там не такой уж страшный.
0
А смысл этого «упрощения»? Вместо битового сдвига нужно будет выполнять деление.
+1
Вообще да, что-то я не подумал. если сначала умножить на 125, а потом сдвинуть, то да, будет проще.
0
В стм8 есть аппаратный разделитель.
0
И еще, я смотрю, ты заюзал штатный дисплейчик. Пины i2c не были заняты сегментами дисплея.
0
Нет, они не заняты. Кстати, смотрел по магазинам подобные дисплейчики — все что видел, с одним общим выводом. Получается что с ними количество сегментов ограничено 24 штуками. Печально это :(
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.