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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Таймер(отсчет времени)


Таймер(отсчет времени)

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

1

Привет, коллеги!
Изобретаю одно устройство, с несколькими функциями. Одна из этих функций - таймер(отсчет времени до нуля). Написал код только для таймера(остальные функции удалены чтоб не мешались), информация выводится на семисегментный индикатор с 7 разрядами, но для вывода отсчета времени используются только 4. Таймер привязан к асинхронному режиму. повешен кварц 32768 на ноги (XTAL1/TOSC1) PB6 и (XTAL2/TOSC2) PB7,микроконтроллера Атмега8А. Индикация выводит при включении заданные цифры (12.59) и все, отсчет не идет((( Хотя теоритически все правильно. Вот код:

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

'----------------------------Псевдонимы---------------------------------------

'---------------Объявление подпрограмм и функций--------------------------------

'-------------------Конфигурирование портов-------------------------------------

'Config 1wire = Portd.0                            'Однопроводная Шина

Config Portc = Output                             'Индикаторы

'----------------------Разрешаем прерывания-------------------------------------
Enable Interrupts
Enable Timer0

Enable Timer2

'---------------------Конфигурирование таймеров---------------------------------
Config Timer0 = Timer , Prescale = 256
On Timer0 Din_indik

Config Timer2 = Timer , Async = On , Prescale = 128
On Timer2 Pulse0

Start Timer0
Start Timer2                                      '

'------------------Переменные для термометра и термостата-----------------------
Dim Tdes As Byte                                  'для десятичной части
Dim Tcel As Byte                                  'для целой части

'------------------Переменные для таймера---------------------------------------
Dim M As Integer                                  'Переменная для минут
Dim S As Integer                                  'Переменная для секунд

'-------------переменные для преобразования исходного числа---------------------
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim N5 As Byte
Dim N6 As Byte
Dim N7 As Byte

Dim M1 As Long
Dim M2 As Long
Dim M3 As Long
Dim M4 As Long
Dim M5 As Long
Dim M6 As Long
Dim M7 As Long

'-------------------------------------------------------------------------------

Dim R As Byte                                     'для значений отправляемых в регистр

'----------Переменные разные----------------------------------------------------

'-----------------Начало основного цикла----------------------------------------
S = 59
M = 12
Tcel = 24
Tdes = 7

Do

If S = 0 Then
   Decr M
   S = 59

End If



'раскладываем число на составляющие
M1 = Tcel
M2 = M1

M4 = M
M5 = M4
M6 = S
M7 = M6



M1 = M1 Mod 100
M1 = M1 / 10
N1 = Abs(m1)

M2 = M2 Mod 10
N2 = Abs(m2)


N3 = Tdes                                       


M4 = M4 Mod 100
M4 = M4 / 10
N4 = Abs(m4)

M5 = M5 Mod 10
N5 = Abs(m5)

M6 = M6 Mod 100
M6 = M6 / 10
N6 = Abs(m6)

M7 = M7 Mod 10
N7 = Abs(m7)


Loop

End                                               'конец программы

'массив с кодами для семисегментника
'--------------Определения 7-ми сегментника (общ. аннод)----------------------
'
Numbers:
        ' FBGCdpDEA (в цифры после сегмента это разряд порта)
   Data &B00101000                                '0   ***A0***
   Data &B10101111                                '1   *      *
   Data &B10011000                                '2   F7     B6
   Data &B10001010                                '3   *      *
   Data &B00001111                                '4   ***G5***
   Data &B01001010                                '5   *      *
   Data &B01001000                                '6   E1     C4
   Data &B10101110                                '7   *      *
   Data &B00001000                                '8   ***D2***
   Data &B00001010                                '9             dp3
   Data &B11110111                                'точка
   Data &B01011000                                'E
   Data &B11011101                                'r
   Data &B00011100                                'P
   Data &B00001101                                'H
   Data &B01111101                                'I

'подпрограмма отправки данных в регистр
Registr:
Shiftout Portc.0 , Portc.2 , R , 1                'задвигаем данные
Pulseout Portc , 1 , 5                            'защелкиваем регистр
Waitus 800                                        'задержка переключений разрядов
Return

'подпрограмма работы с регистром переключающим аноды
Anod:
Shiftout Portc.3 , Portc.5 , R , 1
Pulseout Portc , 4 , 5
'Waitms 5
Return

Din_indik:
R = &B00000001                                    ' первая цифра термометра
Gosub Anod
R = Lookup(n1 , Numbers)
Gosub Registr

R = &B00000010                                    ' вторая цифра термометра
Gosub Anod
R = Lookup(n2 , Numbers)
Gosub Registr

R = Lookup(10 , Numbers)
Gosub Registr

R = &B00000100                                    ' третья цифра термометра
Gosub Anod
R = Lookup(n3 , Numbers)
Gosub Registr



R = &B00001000                                    ' первая цифра таймера
Gosub Anod
R = Lookup(n4 , Numbers)
Gosub Registr

R = &B00010000                                    ' вторая цифра таймера
Gosub Anod
R = Lookup(n5 , Numbers)
Gosub Registr

R = &B00100000                                    ' третья цифра таймера
Gosub Anod
R = Lookup(n6 , Numbers)
Gosub Registr

R = &B01000000                                    ' четвертая цифра таймера
Gosub Anod
R = Lookup(n7 , Numbers)
Gosub Registr

Return



Pulse0:                                           'прерывание по таймеру
Decr S
Return

0

2

на кварце генерация есть?, скорее всего её там нет , потому как таймер надо кофигурить на низкочастотный кварц а не на внутреннее тактирование...в хелпике помоему есть примерчик..

0

3

Config Clock = Soft ' конфигурируем совтовые часы
Здесь статья как раз по этому совтовые часы сбрасываются на ноль. Почему?

Отредактировано amv2000 (2012-02-03 14:53:17)

0

4

а разве строка "Config Timer2 = Timer , Async = On , Prescale = 128" не включает асинхронный режим, вот тут http://www.avrprojects.info/avr-project … ith-clock/ так сделано и, я так понимаю, все норм.

dimon-790 написал(а):

потому как таймер надо кофигурить на низкочастотный кварц а не на внутреннее тактирование

У Атмеги8 ноги под ВЧ кварц и "часовой" совмещены, поэтому либо внешний кварц и "без часов" либо внутренний RC генератор и "часовой кварц".

0

5

Алексей bird написал(а):

У Атмеги8 ноги под ВЧ кварц и "часовой" совмещены, поэтому либо внешний кварц и "без часов" либо внутренний RC генератор и "часовой кварц".

это всё понятно но помоему без этого : Config Osc = Enabled , 32mhzosc = Enabled , 32khzosc = Enabled   не олучится. Хотя может я и ошибаюсь...

0

6

dimon-790 написал(а):

Config Osc = Enabled , 32mhzosc = Enabled , 32khzosc = Enabled

Это конфигурирование для Хмег, а у меня Атмега

0

7

все оказалось проще -  был непропай ноги МК, на которой висит кварц

0

8

Алексей bird написал(а):

все оказалось проще -  был непропай ноги МК, на которой висит кварц

Нас всегда учили так. Не начинай разборку устройства, пока не проверишь предохранители. :crazyfun:

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Таймер(отсчет времени)