Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Динамическая индикация по прерываниям от таймена


Динамическая индикация по прерываниям от таймена

Сообщений 1 страница 6 из 6

1

Набросал программку термометра на DS1820 с динамической индикацией на 7-ми сегментных LED-индикаторах. Температура отображается, однако есть небольшой баг. При отображении температуры периодически в хаотичном порядке подсвечиваются разные сегменты. Есть подозрение, что библиотека BASCOM'а 1-wire при своей работе запрещает прерывания, поэтому возникают хаотичные подсветки. Или я не прав или подскажите как это вылечить? Вот код программки:

Код:
$regfile = "m8adef.dat"
$crystal = 8000000

Config Portd = Input
Config Portb = Output
Config Portc.0 = Output                                     ' LED
Config Portc.1 = Input                                      ' 1-Wire
Config Portc.2 = Input                                      ' Button1
Config Portc.3 = Input                                      ' Button2
Config Portc.4 = Output                                     ' LED Segment1
Config Portc.5 = Output                                     ' LED Segment2

Portd = &HFF
Portb = &H00
Portc = &B11001111

Config Timer0 = Timer , Prescale = 256 , Clear Timer = 0

Config 1wire = Portc.1

Dim Sign As Bit
Dim Seg As Bit
Dim Seg1 As Byte
Dim Seg2 As Byte

Dim C As Word
Dim Lowbyte As Byte
Dim Highbyte As Byte
Dim S0 As Byte
Dim S1 As Byte
Dim S2 As Byte

Led Alias Portc.0
Digit Alias Portb
Segment1 Alias Portc.4
Segment2 Alias Portc.5

Declare Sub Int_timer()

On Timer0 Int_timer
Enable Timer0
Enable Interrupts

Do

   1wreset                                                  'reset the device
   1wwrite &HCC                                             'Skip ROM
   1wwrite &HBE                                             'Read Scratchpad
   Lowbyte = 1wread()
   Highbyte = 1wread()
   1wreset                                                  'reset the device
   1wwrite &HCC                                             'Skip ROM
   1wwrite &H44                                             'Convert T

   C = Makeint(lowbyte , Highbyte)
   Shift C , Right , 1
   Set Led
   If Highbyte > 0 Then
      Toggle Led
      C = Not C
      Incr C
   End If
   S0 = Low(c)
   S2 = S0 \ 10
   S1 = S0 Mod 10
   Seg1 = Lookup(s1 , Digits)
   Seg2 = Lookup(s2 , Digits)
   Waitms 750

Loop

Int_timer:
If Seg = 0 Then
   Segment2 = 0
   Digit = Seg1
   Segment1 = 1
   Seg = 1
Else
   Segment1 = 0
   Digit = Seg2
   Segment2 = 1
   Seg = 0
End If
Return

'******** Data **********************************
Digits:
Data &B01011111                                             ' Öèôåðêà 0
Data &B01000001                                             ' Öèôåðêà 1
Data &B01110110                                             ' Öèôåðêà 2
Data &B01110011                                             ' Öèôåðêà 3
Data &B01101001                                             ' Öèôåðêà 4
Data &B00111011                                             ' Öèôåðêà 5
Data &B00111111                                             ' Öèôåðêà 6
Data &B01010001                                             ' Öèôåðêà 7
Data &B01111111                                             ' Öèôåðêà 8
Data &B01111011                                             ' Öèôåðêà 9
Data &B01111101                                             ' Áóêîâêà A
Data &B00101111                                             ' Áóêîâêà b
Data &B00011110                                             ' Áóêîâêà C
Data &B01100111                                             ' Áóêîâêà d
Data &B00111110                                             ' Áóêîâêà E
Data &B00111100                                             ' Áóêîâêà F
'************************************************

Отредактировано 3o3o (2014-08-04 15:54:58)

0

2

делаете счетчик
сперва запускаете процесс измерения, через Х времени - опрашиваете датчик

0

3

Mrshilov написал(а):

Попробуйте на время обмена с датчиком отключить прерывание:

Дык, как раз и есть подозрение, что библиотека 1-wire их отключает и из-за этого появляются хаотичные подсветки.

sasha_1973 написал(а):

Будет моргать, лучше так:

Спасибо, ДРУГ! Твоя мысль гениальна, надо просто успевать до прерывания опрашивать DS1820 (почему я сам до этого не додумался).
Вот так заработало (сделал по твоему примеру, только несколько проверок убрал, оставил только перед 1wreset и перед последующими командами командами):

Код:
$regfile = "m8adef.dat"
$crystal = 8000000

Config Portd = Input
Config Portb = Output
Config Portc.0 = Output                                     ' LED
Config Portc.1 = Input                                      ' 1-Wire
Config Portc.2 = Input                                      ' Button1
Config Portc.3 = Input                                      ' Button2
Config Portc.4 = Output                                     ' LED Segment1
Config Portc.5 = Output                                     ' LED Segment2

Portd = &HFF
Portb = &H00
Portc = &B11001111

Config Timer0 = Timer , Prescale = 256 , Clear Timer = 0

Config 1wire = Portc.1

Dim Sign As Bit
Dim Seg As Bit
Dim Seg1 As Byte
Dim Seg2 As Byte

Dim C As Word
Dim Lowbyte As Byte
Dim Highbyte As Byte
Dim S0 As Byte
Dim S1 As Byte
Dim S2 As Byte

Const Ds1820 = 100

Led Alias Portc.0
Digit Alias Portb
Segment1 Alias Portc.4
Segment2 Alias Portc.5

Declare Sub Int_timer()
Declare Sub Look_timer()

On Timer0 Int_timer
Enable Timer0
Enable Interrupts

'===============================================================================

Do

   Gosub Look_timer
   1wreset                                                  'reset the device
   Gosub Look_timer
   1wwrite &HCC                                             'Skip ROM
   1wwrite &HBE                                             'Read Scratchpad
   Lowbyte = 1wread()
   Highbyte = 1wread()
   Gosub Look_timer
   1wreset                                                  'reset the device
   Gosub Look_timer
   1wwrite &HCC                                             'Skip ROM
   1wwrite &H44                                             'Convert T

   C = Makeint(lowbyte , Highbyte)
   Shift C , Right , 1
   Set Led
   If Highbyte > 0 Then
      Toggle Led
      C = Not C
      Incr C
   End If
   S0 = Low(c)
   S2 = S0 \ 10
   S1 = S0 Mod 10
   Seg1 = Lookup(s1 , Digits)
   Seg2 = Lookup(s2 , Digits)
   Waitms 700

Loop

'===============================================================================

Look_timer:
'-------------------------------------------------------------------------------
    Do
      nop
    Loop Until Tcnt0 < Ds1820
'-------------------------------------------------------------------------------
  Return

'===============================================================================

Int_timer:
'-------------------------------------------------------------------------------
If Seg = 0 Then
   Segment2 = 0
   Digit = Seg1
   Segment1 = 1
   Seg = 1
Else
   Segment1 = 0
   Digit = Seg2
   Segment2 = 1
   Seg = 0
End If
'-------------------------------------------------------------------------------
Return

'===============================================================================

'******** Data **********************************
Digits:
Data &B01011111                                             ' Öèôåðêà 0
Data &B01000001                                             ' Öèôåðêà 1
Data &B01110110                                             ' Öèôåðêà 2
Data &B01110011                                             ' Öèôåðêà 3
Data &B01101001                                             ' Öèôåðêà 4
Data &B00111011                                             ' Öèôåðêà 5
Data &B00111111                                             ' Öèôåðêà 6
Data &B01010001                                             ' Öèôåðêà 7
Data &B01111111                                             ' Öèôåðêà 8
Data &B01111011                                             ' Öèôåðêà 9
Data &B01111101                                             ' Áóêîâêà A
Data &B00101111                                             ' Áóêîâêà b
Data &B00011110                                             ' Áóêîâêà C
Data &B01100111                                             ' Áóêîâêà d
Data &B00111110                                             ' Áóêîâêà E
Data &B00111100                                             ' Áóêîâêà F
'************************************************

Отредактировано 3o3o (2014-08-05 10:29:08)

0

4

Mrshilov написал(а):

Не отключает.

Возможно, спорить не буду. Но...

Mrshilov написал(а):

Disable Timer0
   1wreset                                                  'reset the device
   1wwrite &HCC                                             'Skip ROM
   1wwrite &HBE                                             'Read Scratchpad
   Lowbyte = 1wread()
   Highbyte = 1wread()
   1wreset                                                  'reset the device
   1wwrite &HCC                                             'Skip ROM
   1wwrite &H44                                             'Convert T
Enable Timer0

...тогда хаотично будет меняться яркость между двумя индикаторами из-за запрета прерываний. Ради эксперимента попробую и твою версию ;)

0

5

Докладываю:
1. Яркость не меняется, но...
2. ...подмыргивания остались
3. Хаотичного засвета сегментов нет.
Вообщем вариант с проверкой таймера и успеванием опроса датчика до срабатывания прерывания самое то, что нужно! Еще раз спасибо sasha_1973  :cool:

0

6

OFF TOP
Только меня одного "бесят" ответы в форуме sasha_1973 типа:

sasha_1973 написал(а):

Рабочий проект скинул Вам на mail.

Давайте закроем форум, оставим одну тему, в которой sasha_1973 будет отсылать все ответы на почту.

+1


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Динамическая индикация по прерываниям от таймена