Страница 1 из 1

Проблемы с ATmega8 и DS18B20

Добавлено: Чт дек 24, 2009 11:39:03
Johnson
Здравствуйте, уважаемые!
Столкнулся с проблемой, нужно срочно решить, сам уже не справляюсь =( Заранее прошу не пинать в торону поиска и не швырять тапками - поиск юзал.

Проблема такая: есть часы с термометром и динамической индикацией. Около года назад я прошивку сделал и благополучно забыл. Сырцы остались, но не с последними изменениями.
Теперь приспичило немного сменить алгоритм, но забыл, что сырцы старые... В общем похерил прошивку...
Теперь не могу зазобраться =( Постарел, видимо, да и СИ подзабыл основательно.

Проблема сейчас такая: 1-вайр определяет датчик температуры, но при съеме показаний выдаёт -9999, соответственно и нет индикации
(кстати, вобще сложилось такое мнение, что датчик "отпадывает" - с предыдущей прошивкой, при аппаратном отключении датчика и последующим включении, часы останавливались. теперь они останавливаются при первом же обращении к датчику)

Помню только, что последние изменения были не значительные, на логику алгоритма не распостранялись. Прерывания не останавливал.

Железные подключения:
I2C на portD.5 и portD.6
1-W на portD.7
катоды индикации на portD.0-portD.3
аноды на portB.0-portB.7
кнопки на potrC.0-portC.7

Архив с сырцами в аттаче. Подскажите пожалста ошибку.
Заранее благодарен.

Добавлено: Чт дек 24, 2009 12:03:14
Johnson
Извиняюсь, нашел ошибку: забыл логику И в вывод катодов добавить - на портД.7 приходили нули на каждом прерывании, вот датчик и сходил с ума )

Теперь небольшой вопрос по логике динамической индикации:

Четвертый разряд в пол накала подсвечивается информацией с первого разряда, если сегмент потушен... На осциллограме вижу коротки (1-2мс) имупульс, который остаётся с первого разряда... как бы его убрать? видимо нужно поставить задержки...

Обновлено:

Поставил задержки в прерывании, вот так:

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void){
        PORTD|=0b00001111;
        delay_ms(2);                   
        if (ind_ON == 1) PORTD&=(cursor[cur_dig]);  
        PORTB=digits[digit_out[cur_dig]];          
        if ((zpt_ON == 1) && (cur_dig ==3)) PORTB.0=1;
        cur_dig++; if (cur_dig>=4) cur_dig=0;
}
Время этого паразитного импульса ещё сильнее увеличилось, соответственно нужно как-то ускорить обработку прерывания... но как? будет ли врезка на асме работать быстрее? если да - то подскажите, как реализовать (асм совершенно не знаю)?

Светодиоды на табло используются сверх яркие, красные... управляют ими полевички... поэтому подсветка даже на 1мс очень отчетливо видна... подскажите, как ещё можно избавиться это этого импульса... если нужно - могу осциллогрммы выложить, когда домой приду...
Заранее благодарен!

Добавлено: Чт дек 24, 2009 12:51:25
ARV
никогда не используйте в прерываниях функции задержек!!!

в своем олбработчике всего-навсего сделайте так:
1. погасить все индикаторы, подав на все общие аноды нули (или единицы на катоды)
2. вывести в PORTB новый символ
3. включить нужный индикатор, подав на нужный катод/анод правильный уровень

сейчас у вас просто индикатор включается ДО того, как появится ЕГО символ - вот он и высвечивает ПРЕДЫДУЩИЙ символ

Добавлено: Чт дек 24, 2009 13:10:10
Johnson
Я уже по-разному пробовал... Ваш вариант тоже.
Вот его конкретное исполнение:

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void){
        PORTD|=0b00001111;  //Гасим 0-3 разряды, не трогая 4-7
                                 
        if (ind_ON == 1) {       //Если разрешена индикация
           PORTB=digits[digit_out[cur_dig]];   //Выводим на портБ цифру
           PORTD&=(cursor[cur_dig]);            //Высвечиваем нужный разряд
        } 
        if ((zpt_ON == 1) && (cur_dig ==3)) PORTB.0=1; // Если надо - зажигаем точку
        cur_dig++; if (cur_dig>=4) cur_dig=0;  //Инкрементим разряд
}
Импульс есть... Блин все страдают, как бы уменьшить время отклика, а я страдаю как его увеличить)) Были бы диоды помедленнее - ничего не засвечивалось бы, обычная диодная матрица не засвечивается - слишком медленная, несколько НС для неё ничто...

Добавлено: Чт дек 24, 2009 16:23:52
ARV
если у вас нет ошибок в схеме, если нет поврежденных деталей, и если все массивы содержат правильные константы, то импульс может появляться только из-за того, что где-то еще в программе делается вывод в порт. обработчик прерываний тут ни при чем. и быстродействие светодиодов тоже ни при чем.

Re: Проблемы с ATmega8 и DS18B20

Добавлено: Чт дек 24, 2009 19:09:18
Danko
Johnson писал(а):Здравствуйте, уважаемые!
Архив с сырцами в аттаче. Подскажите пожалста ошибку.
Заранее благодарен.
Если не секрет где брали исходники и схему?

Добавлено: Пт дек 25, 2009 08:31:48
Johnson
Исходники в своё время давал один из форумчан, но они сильно изменены, как и схема... мне нужны были только примеры алгоритмов работы - не знал как с 1-wire и с I2C работать

ЗЫ: пользуясь случаем, спрошу: есть ли нормальный компилятор под AVR на языке паскаль? он как-то привычнее, Си плохо очень знаю...