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

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

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

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


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


Помогите разобраться с атмегой8 и часовым кварцем

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

1

Здравствуйте!!! недавно начал осваивать программирование, перечитал все ветки на этом сайте, но не нашел пути решения проблемы. Делаю счетчик времени, вернее пытаюсь. Весь мозг  ночью вынес.  Суть такова:
при нажатой клавише счетчик считает секунды и выводит на семисегментный дисплей на 6 цифр (работает). При отпускании клавиши счет останавливается, на  дисплее светится текущее показание в секундах (от 0 до 999999) (не работает).  После долгих и мучительных чтений форумов и попыток родилось это: и еще много чего....но оно не работало.
Схема в протеусе код 32768:  http://www.fayloobmennik.net/2765734.  Сильно не ругайте я только учусь.

Помогите кто чем может.

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

'$lib "mcsbyte.lbx"
'$sim
'Dim Default As Eram Byte At &H14

Config Pind.0 = Output : Portd.0 = 1                        'Dp - зажег отдельно
Config Pind.1 = Output : Portd.1 = 1                        'H
Config Pind.2 = Input : Portd.2 = 1                         ' кнопка Portd.2 = 1
Config Pind.4 = Output : Portd.4 = 1                        ' светодиод

Config Portb = Output , Portc = Output                      ' конфигурируем порты на выход к которым подключен семисегментник
A Alias Portc.0 : B Alias Portc.1 : C Alias Portc.2 : D Alias Portc.3 : E Alias Portc.4 : F Alias Portc.5 :       '''''' G Alias Pind.1 -????         'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portb.0 : Dig2 Alias Portb.1 : Dig3 Alias Portb.2 : Dig4 Alias Portb.3 : Dig5 Alias Portb.4 : Dig6 Alias Portb.5       ': Vv Alias Pind.2       '      ': Dig7 Alias Portd = &B01000000       ': Dig8 Alias Portb.2 : Dig9 Alias Portc.2       ' тут вписываем порт к которым подключены общие провода каждой цифры

Dim W As Byte , Z As Byte , Y As Byte , I As Byte , Chislo(8) As Long , Viv_peremennaya1 As Long , Temp_print As Long , Chet2 As Long       ', T As Word       ', Chet1 As Bit , Chet2 As Long , Chet3 As Long       '
 'Debounce Vv , 0 , Bootons
  'Chet = 0                                                  'начальные уставки
 'Chet1 = 0
 Chet2 = 0                                                  ' пробные наброски
 'T = 0
 Viv_peremennaya1 = 0

 'If Default = 255 Then
    'Chet3 = 0
 'Writeeeprom Chet3 , 0                                        ' пробные наброски
    'Default = 150
 'End If

'Config Clock = Soft , Gosub = Sectic                        'запускаем софтовые часы и подпрограмму подсчета секунд
' _sec = 0 : _min = 0 : _hour = 0
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse      ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer1 = Counter , Edge = Falling , Prescale = 1
Enable Interrupts : Enable Timer0 :                         'Enable Timer1
'Start Counter1
Counter1 = 0                                                ' разрешаем прерывания: таймер1 таймер2
'********************************************************************




Do

If Portd.2 = 0 Then Start Counter1
If Counter1 = 10 Then Gosub Pulse1                          'примерное число для проверки

If Portd.2 = 1 Then
 Stop Counter1
 'Counter1 = 0
End If

'
Viv_peremennaya1 = Chet2                                    ' начало бесконечного цикла, в котором работаем с переменным
If Viv_peremennaya1 > 999999 Then Viv_peremennaya1 = 0
                                                             ' переменная, которая будет отображатся на семисегментнике. Тут мы ее увеличиваем на единичку
  Waitms 5
                                                ' небольшая задержка
    Loop
'********************************************************************
'Sectic:
ээээincr Chet2 Пробовал через сектик , но не могу остановить сами часы
''If Portd.4 = 0 Then Portd.4 = 1 Else Portd.4 = 0
'Return

Pulse1:
Incr Chet2
If Portd.4 = 0 Then Portd.4 = 1 Else Portd.4 = 0 ' мигаем светодиодом
Counter1 = 0
Return

Pulse:
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = Viv_peremennaya1
For I = 1 To 6                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next

Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6       ' гасим индикаторы
Incr W : If W > 7 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Select Case W                                               ' включаем цифру которую выбрали (w). Подаем минус на общий провод конкретной цифры
 Case 1 : Set Dig1
Portd.0 = 1
 Case 2 : Set Dig2
Portd.0 = 0
 Case 3 : Set Dig3
Portd.0 = 1
 Case 4 : Set Dig4
Portd.0 = 1
 Case 5 : Set Dig5
Portd.0 = 1
 Case 6 : Set Dig6
Portd.0 = 1

End Select
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)
Return                                                      'возвращаемся на место откуда сюда прислали

' таблица сегментов для семисегментников с общим минусом
Cifri:
'Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
'Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
'Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
'Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
'Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
'Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
'Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
'Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
'Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
'Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9
' таблица сегментов для семисегментников с общим плюсом
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

Отредактировано dimka (2013-04-06 10:32:35)

0

2

Config PortD.2 = Output
Set PortD.2
Counter1=0
Do
...............
..............
if PortD.2 =0 Then
Start  Counter1 и т.д

0

3

Большое спасибо за помощь. Сейчас буду пробовать.
Заливал вчера код 2 раза, все равно получается с кракозябрами - научите как правильно. то что не будет компилится If Set Portd.2 Then Stop Timer1 Else Start Timer1 я знаю, в коментяриях было написано: для примера, чтобы понятно было что я хочу сделать.
попробую залить без кракозябр.

Отредактировано dimka (2013-04-06 05:47:26)

0

4

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

Заливал вчера код 2 раза, все равно получается с кракозябрами - научите как правильно.

Копируем код при русской раскладке и вставляем.

0

5

Чтобы время не прерывалось на момент нажатия кнопок и точно отсчитывалось, нужно его реализовывать на прерывании таймера (если таковой имеется в свободном использовании).

Метку "Sectic" лучше вообще не использовать, т.к. для ХМег - это константа, возможно компилятор неправильно её обрабатывает..

Отредактировано RDW (2013-04-06 10:24:06)

0

6

Доброе утро, если оно доброе -  надо на работу, не выспался. Перезалил код уже с изменениями. Не получается повешать на ногу мк сегмент G.  PB6, PB7, PD5(T1) заняты (кварц 32768), PC6 - reset. Неужели придется применить другой мк или сдвиговый регистр.

0

7

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

Код:
'**** счетчик отработанного времени, далее будет счетчик моточасов. С секундами проще проверять.******

 $regfile = "m8def.dat"
 $crystal = 8000000
 $lib "mcsbyte.lbx"

 Config Portc = Output
 Config Portb = Output
 Config Pind.2 = Input : Pind.2 = 1                         ' кнопка
 Config Pind.4 = Output : Portd.4 = 0                       'светодиод
 Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse0    'конфигурируем таймеры
 Config Timer1 = Counter , Edge = Falling , Prescale = 1
 Config Clock = Soft , Gosub = Sectic                       'запускаем софтовые часы и подпрограмму подсчета секунд
 _sec = 0 : _min = 0 : _hour = 0
   ' * * * заводим переменные * * *

   'Dim Chislo1 As Long                                      '
   Dim A As Long
   Dim Chislo As Long
   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 M1 As Long
   Dim M2 As Long
   Dim M3 As Long
   Dim M4 As Long
   Dim M5 As Long
   Dim M6 As Long
   Dim R As Byte
   Dim Default As Eram Byte At &H14
 '***************************************
   If Default = 255 Then                                    'при первом запуске, когда Default=255
   Chislo = 0
   'Chislo1 = 10                                             'присваиваем начальные значения
   Writeeeprom Chislo , 0
   'Writeeeprom Chislo1 , 10                                 ' Записываем в EEPROM значение chislo
   Default = 100                                            ' присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будет
End If
   Readeeprom Chislo , 0                                    ' Считываем из EEPROM значение chislo
   'Readeeprom Chislo1 , 10


   '***********настраиваем порты к которым цепляется индикатор***********


   Ddrb = &B11111111
   Ddrc = &B11111111
   A = 0

    Enable Interrupts : Enable Timer0 : Enable Timer1       ': Enable Timer1        ' разрешаем прерывания, таймер 0,   таймер 1
   Start Timer0 : Start Timer1
  '***********************Основной цикл ****************************************************


  Do

          If Chislo > 999999 Then Chislo = 0
          'If Chislo >= Chislo1 Then
                  'Chislo1 = Chislo
                  'Else
                  'Chislo = Chislo1
          'End If                                            ' вот это число будем отображать
          A = Chislo
  If Pind.2 = 1 Then
              Waitms 10
     If Pind.2 = 1 Then Gosub Zapice                        'Задержка отключения кнопки
  End If
  Loop
  End
'*****************************************************************************************
Sectic:
If Pind.2 = 0 Then

  Incr Chislo                                               'увеличиваем на 1
  If Portd.4 = 1 Then Portd.4 = 0 Else Portd.4 = 1          'мигаем светодиодом при счете
  End If
If Pind.2 = 1 Then Portd.4 = 1                              'при остановке счета просто горит СИД
Return

Zapice:
Stop Timer1 : Stop Timer0                                   ' Записываем данные при отпускании клавиши
If Pind.2 = 1 Then
        Waitms 5
       Writeeeprom Chislo , 0                               'Записываем в Eeprom значение Chislo
       'Writeeeprom Chislo1 , 10                               'Для дублирования записи
        Waitms 5
       Readeeprom Chislo , 0                                ' Считываем из EEPROM значение chislo
       'Readeeprom Chislo1 , 10                              ' Считываем из EEPROM значение chislo1
       Waitms 5
 End If
Start Timer1 : Start Timer0

'*************************Индикация****************************************
 Pulse0:
 Stop Timer0

         M1 = A
         M2 = M1
         M3 = M1
         M4 = M1
         M5 = M1
         M6 = M1

         M1 = M1 / 100000                                   'обработка первого числа
         N1 = Abs(m1)



         M2 = M2 Mod 100000                                 'обработка второго числа
         M2 = M2 / 10000
         N2 = Abs(m2)

         M3 = M3 Mod 10000                                  ' обработка третьего числа
         M3 = M3 / 1000
         N3 = Abs(m3)

         M4 = M4 Mod 1000                                   ' обработка четвертого числа
         M4 = M4 / 100
         N4 = Abs(m4)

         M5 = M5 Mod 100                                    ' обработка пятого числа
         M5 = M5 / 10
         N5 = Abs(m5)

         M6 = M6 Mod 10                                     ' обработка шестого числа
         N6 = Abs(m6)




Portb = &B0000001                                           'зажигаем первое число
 R = Lookup(n6 , Numbers)
 Gosub Registr

Portb = &B00000010                                          'зажигаем второе число
 R = Lookup(n5 , Numbers1)
 Gosub Registr

Portb = &B00000100                                          'зажигаем третье число
 R = Lookup(n4 , Numbers)
 Gosub Registr

Portb = &B00001000                                          'зажигаем четвертое число
 R = Lookup(n3 , Numbers)
 Gosub Registr

Portb = &B00010000                                          'зажигаем пятое число
 R = Lookup(n2 , Numbers)
 Gosub Registr

Portb = &B00100000                                          'зажигаем шестое число
 R = Lookup(n1 , Numbers)
 Gosub Registr

 Start Timer0

 Return


'******************Коды для индикатора **********************************************
Numbers:
 Data &B11000000                                            '0     для чисел 6,5,4,3,1
 Data &B11111001                                            '1
 Data &B10100100                                            '2
 Data &B10110000                                            '3
 Data &B10011001                                            '4
 Data &B10010010                                            '5
 Data &B10000010                                            '6
 Data &B11111000                                            '7
 Data &B10000000                                            '8
 Data &B10010000

Numbers1:
 Data &B01000000                                            '0   для 2 числа выводим число и зажигаем точку
 Data &B01111001                                            '1
 Data &B00100100                                            '2
 Data &B00110000                                            '3
 Data &B00011001                                            '4
 Data &B00010010                                            '5
 Data &B00000010                                            '6
 Data &B01111000                                            '7
 Data &B00000000                                            '8
 Data &B00010000                                            '9
      'End Select


'*************подпрограмма отправки данных в регистр*********************
Registr:
Shiftout Portc.0 , Portc.2 , R , 1                          'задвигаем данные
Pulseout Portc , 1 , 10                                     'защелкиваем регистр
Waitms 5
Return

Отредактировано dimka (2013-04-07 18:26:44)

0

8

http://s3.uploads.ru/t/jiJ6g.png
Вот схема в протеусе. После точки будут отсчитываться десятки часа. кнопку на reset добавил для проверки записи переменных.

0


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