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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт мар 05, 2009 08:15:25

Сообщение Johnson »

Здравствуйте, уважаемые!
Столкнулся с проблемой, нужно срочно решить, сам уже не справляюсь =( Заранее прошу не пинать в торону поиска и не швырять тапками - поиск юзал.

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

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

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

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

Архив с сырцами в аттаче. Подскажите пожалста ошибку.
Заранее благодарен.
Вложения
Clock4.rar
Сырцы, фьюзы и схема
(91.27 КБ) 171 скачивание
Контактная информация:
Реклама
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт мар 05, 2009 08:15:25

Сообщение 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мс очень отчетливо видна... подскажите, как ещё можно избавиться это этого импульса... если нужно - могу осциллогрммы выложить, когда домой приду...
Заранее благодарен!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18852
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

никогда не используйте в прерываниях функции задержек!!!

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

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

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт мар 05, 2009 08:15:25

Сообщение 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;  //Инкрементим разряд
}
Импульс есть... Блин все страдают, как бы уменьшить время отклика, а я страдаю как его увеличить)) Были бы диоды помедленнее - ничего не засвечивалось бы, обычная диодная матрица не засвечивается - слишком медленная, несколько НС для неё ничто...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18852
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

если у вас нет ошибок в схеме, если нет поврежденных деталей, и если все массивы содержат правильные константы, то импульс может появляться только из-за того, что где-то еще в программе делается вывод в порт. обработчик прерываний тут ни при чем. и быстродействие светодиодов тоже ни при чем.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Johnson писал(а):Здравствуйте, уважаемые!
Архив с сырцами в аттаче. Подскажите пожалста ошибку.
Заранее благодарен.
Если не секрет где брали исходники и схему?
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт мар 05, 2009 08:15:25

Сообщение Johnson »

Исходники в своё время давал один из форумчан, но они сильно изменены, как и схема... мне нужны были только примеры алгоритмов работы - не знал как с 1-wire и с I2C работать

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

Вернуться в «Микроконтроллеры и ПЛИС»