Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » 7 Segment Display и 18B20 (Подмигивает)
7 Segment Display и 18B20
ivan_fd Дата: Вт, 25.08.2009, 19:00  |                                                                                                                Сообщение # 16
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Ясно, спасибо!
Dmitry Дата: Вт, 25.08.2009, 22:40  |                                                                                                                Сообщение # 17
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (ivan_fd)
через интервал за который происходит прерывание, дисплей подмигивает.

Знакомо, знакомо. Тоже спотыкался об это. Связано с тем, что софтверное прерывание (on interrupt) выполняется только после окончания очередного оператора. И если оператор длительный по времени, то...
В моем случае вылечилось переписыванием прерывания на асме, но это на любителя. Код не выкладываю, там без 100 грамм не разберешься. smile
Посмотрел ваш код, да нету там вроде длинных операторов в рамках disable...enable.
Вызывает сомнения вот этот кусок:
Disable
' OWrite dq, 1, [$CC, $44]'Отправляем запрос на очередное измерение (команда Convert T)
OWrite dq, 1, [$CC, $BE] 'Считываем результат предыдущего измерения (команда Read ScratchPad)
' DelayMS 1
ORead dq, 2,[Temp_read.LowByte, Temp_read.HighByte]
Enable

Чего то мне кажется, что после ConvertT ds-ка будет заниматься конверсией ( в течение указанного в даташите времени), а не отвечать на запросы. А спустя те самые 750 мс можно ее читать. Т.е. надо отправить convertT, разрешить прерывания, подождать секунду, снова запретить и читать ds-ку. ИМХО.

demanik Дата: Вт, 25.08.2009, 23:00  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (Dmitry)
Чего то мне кажется, что после ConvertT ds-ка будет заниматься конверсией ( в течение указанного в даташите времени)

В программе точно так и есть. Посмотрите внимательно строчка которая вас смутила выделена как комментарий. А рабочая команда Convert T чуть выше и там ожидание прибл. секунду.


Попробуй всё и вся... может быть пол...

Dmitry Дата: Вт, 25.08.2009, 23:15  |                                                                                                                Сообщение # 19
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Точно, торможу.

Зато вот, нашел свой код с 7-seg и ds1820 (sorry, PBP). Прерывание, правда ассемблерное, но оно тоже запрещается. При чтении ds-ки ничего не моргает АБСОЛЮТНО. (Моргает чу-у-точку, но при записи в ЕЕПРОМ. Ну там деваться некуда, 10 мс изволь сидеть и не рыпаться) :

Code
        
                    tmp = CurDig               ' Curdig - номер цифры на семисегментнике, которая светится в данный момент.
                      ' CurDig крутится по кругу в обработчике прерывания
                    while tmp = CurDig      '  ждем, пока переключится очередная цифра (т.е. обработчик прерывания
                    wend                    ' изменит переменную CurDig)    
                    TMR0IE = 0                 ' запрет прерывания
                    OWOut DQ1, 1, [$CC, $44]       ' Start temperature conversion
                    TMR0IE = 1                  ' можно прерываться
waitloop:  tmp = CurDig                    
                    while tmp = CurDig      '  опять ждем переключения очередной цифры
                    wend      
                    TMR0IE = 0                 ' запрет прерывания
                    OWIn DQ1, 4, [converted]    ' Check for still busy converting
                    TMR0IE = 1      
                    if converted = 0 Then waitloop  ' ждем окончания конверсии      
                    tmp = CurDig                    
                    while tmp = CurDig      '  опять ждем переключения очередной цифры
                    wend      
                    TMR0IE = 0                 ' запрет прерывания
                    OWOut DQ1, 1, [$CC, $BE]  ' Read the temperature
                    TMR0IE = 1      
                    tmp = CurDig                    
                    while tmp = CurDig      '  опять ждем переключения очередной цифры
                    wend      
                    TMR0IE = 0                 ' запрет прерывания
                         ' наконец, читаем скретчпад с вожделенной температурой
                    OWIn DQ1, 0, [Dsdat[0],Dsdat[1],Dsdat[2],Dsdat[3],Dsdat[4],Dsdat[5],Dsdat[6],Dsdat[7], dsdat[8]]
                    TMR0IE = 1

Сообщение отредактировал Dmitry - Вт, 25.08.2009, 23:26
ivan_fd Дата: Чт, 27.08.2009, 00:08  |                                                                                                                Сообщение # 20
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Спасибо! Начал делать на АСМ. прерывании. Сейчас пока со временем туго, о результатах отпишу.
ivan_fd Дата: Пн, 31.08.2009, 16:54  |                                                                                                                Сообщение # 21
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Сделал на АСМ прерывании, все супер работает. Прилагаю файл кому интересно.

Добавлено (31.08.2009, 16.54.07)
---------------------------------------------
Еще немного поексперементировал, взял этот код, только вставил
OWrite, ORead и вновь есть помигивания.

Прикрепления: TEST_Displyy_In.zip (44.6 Kb)

Сообщение отредактировал ivan_fd - Пн, 31.08.2009, 16:55
ЯНДЕКС Дата: 31.08.2009
Dmitry Дата: Пн, 31.08.2009, 20:32  |                                                                                                                Сообщение # 22
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Ну так правильно. В коде нет ожидания переключения очередной цифры на семисегментнике. Т.е. тупо запретили прерывания и давай за onewire дергать. А если в это время пора очередную цифру рисовать?
Еще раз посмотрите код в сообщении №19. Фишка в том, что перед командами oread и owrite надо подождать момента когда происходит переключение катодов. Тогда до следующего переключения у вас есть сколько-то миллисекунд (зависит от частоты переключения катодов), когда можно спокойно запретить прерывания и заниматься шиной onewire.
ivan_fd Дата: Вт, 01.09.2009, 13:51  |                                                                                                                Сообщение # 23
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (Dmitry)
Ну так правильно. В коде нет ожидания переключения очередной цифры на семисегментнике. Т.е. тупо запретили прерывания и давай за onewire дергать. А если в это время пора очередную цифру рисовать?
Еще раз посмотрите код в сообщении №19. Фишка в том, что перед командами oread и owrite надо подождать момента когда происходит переключение катодов. Тогда до следующего переключения у вас есть сколько-то миллисекунд (зависит от частоты переключения катодов), когда можно спокойно запретить прерывания и заниматься шиной onewire.


Спасибо.
Код, тот что сверху, работает нормально, без миганий. Они появляются только тогда, когда вставляю команды oread и owrite, а в том коде нету этих команд.
Dmitry Дата: Вт, 01.09.2009, 23:04  |                                                                                                                Сообщение # 24
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Странно. Получается, если запретить перывания и вручную посылать/принимать биты по шине 1-wire (как в вышеприведенном коде), то не моргает, а если эту же задачу поручить oread/owritе, то моргает. Непонятно. Наверное, чего-то лишнего в oread/owrite напихали. smile
ivan_fd Дата: Вт, 01.09.2009, 23:20  |                                                                                                                Сообщение # 25
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (Dmitry)
Странно. Получается, если запретить перывания и вручную посылать/принимать биты по шине 1-wire (как в вышеприведенном коде), то не моргает, а если эту же задачу поручить oread/owritе, то моргает. Непонятно. Наверное, чего-то лишнего в oread/owrite напихали. smile

Спасибо! Сделал по вашей рекомендации, тоесть сделал ожидание переключения очередной цифры, и все стало норма.
А с oread/owritе я думаю ситуация такая, если писать 1-Wire вручную то инициализация проходит за 1.2мс, чтение-запись за 620мкс.
А oread-owrite? инициализация ~1мс, чтение-запись ~2.3мс

Но счас все норма и с тем, и с тем вариантом.

p.s: Хорошо если есть кому посоветовать. applause applause

ivan_fd Дата: Чт, 03.09.2009, 00:22  |                                                                                                                Сообщение # 26
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Так прикладываю немного почищенный проект с протеусом, может кому нибудь будет полезен.
Прикрепления: 7Seg_Display_In.zip (85.7 Kb)
vovan16384 Дата: Вт, 02.03.2010, 19:15  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 30.12.2008

Статус: Offline

Quote (ivan_fd)
Так прикладываю немного почищенный проект с протеусом, может кому нибудь будет полезен

у меня не компилируется
пишет ошибку при компиляции asm

Добавлено (02.03.2010, 19.15.10)
---------------------------------------------
compiler version 3.4.0.8

terrarus Дата: Ср, 03.03.2010, 08:49  |                                                                                                                Сообщение # 28
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Quote (ivan_fd)
Так прикладываю немного почищенный проект с протеусом

И у меня не компилируется...
Есть ошибки! Жаль, ведь проект интересный и был бы полезен для анализа начинающим.
Нужно их устранить.
Пытался вчера вечером сам найти их, но сходу не удалось.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Ср, 03.03.2010, 08:51
ivan_fd Дата: Ср, 03.03.2010, 10:19  |                                                                                                                Сообщение # 29
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

В процедуре инициализации заменить на это:

Code
Asm
      mvi    ADDRESS,Cifra6   ;Заносимо в ADDRESS адресу комірки з першою виводимою цифрою
      mvi    Cifra6, 0x40           ;Показуємо "-OFF-"
      mvi    Cifra5, 0x71
      mvi    Cifra4, 0x71
      mvi    Cifra3, 0x3f
      mvi    Cifra2, 0x40
      mvi    Cifra1, 0x00
EndAsm    

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

Сообщение отредактировал ivan_fd - Ср, 03.03.2010, 15:10
vovan16384 Дата: Ср, 03.03.2010, 17:30  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 30.12.2008

Статус: Offline

Quote (ivan_fd)
Поетому я прерывания переписал полностью на АСМе, что и здесь не мешало бы сделать.

если не секрет хотелось бы посмотреть на такой вариант
Форум Picbasic.ru » Программирование МК » Proton PicBasic » 7 Segment Display и 18B20 (Подмигивает)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: