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

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

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

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


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


Help мега 8 ацп

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

1

На меге 8 внутренний част. 8мег
Измеряю обороты + температура
Нажимаю кнопку, мерею напряжение в 3 точках.

Обороты все гуд, температура всегда +0.
Напруга на одном входе, белиберду показывают все.
Где моя ошибка?
Сразу говорю не программист, если можно с объяснениями.
Фузи не трогал.

$regfile = "m8def.dat"                                      ' используем ATmega8
$crystal = 4000000                                          ' частота установленного кварца 4 mHz
'$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

'объявляем переменные

Dim Frequency As Long
Dim Flag As Bit
Dim Overflow As Byte
Dim Cnt As Long

Dim W As Word
Dim S As Word
Dim D As Word
Dim U As Word

Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Byte
Dim T2 As Byte
Dim I As Integer

'**********Конфигурация портов********************
Config Portd = Input
Config Timer0 = Timer , Prescale = 1                        ' CK=8MHz - тактирование Таймер0
Config Timer1 = Counter , Edge = Rising , Noise Cancel = 1  ' включена фильтрация шумов
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'конфигурация АЦП
Config Pind.6 = Input                                       ' конфигурируем вывод 6 порта D на ВХОД - подключаем к нему кнопку
Config 1wire = Portc.4                                      'на эту ножку подключим Ds18b20 и подтягивающий резистор на 4 , 7 ком к + питания

Config Lcd = 12 * 2                                         ' экран 12*2 (любой с контроллером HD44780)
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Start Adc                                                   'запускаем аналого-цифровое преобразование
Button Alias Pind.6                                         ' присваиваем имя Button выводу 6 порта D

'****Reset for Start***********
Stop Timer0
Stop Counter1

'******Interrupt routline setting****
On Timer0 Tm0_intsub
On Timer1 Tm1_intsub

'******Enable Interrupts, timer 0, counter1*****
Enable Interrupts
Enable Timer0
Counter1 = 0
Overflow = 0
Cnt = 31250
Flag = 0

'******Initial******
Cls                                                         ' очистка дисплея
Lcd "   Привет   "
Waitms 100

Locate 2 , 12                                               ' позиция курсора
Lcd " OOOOOOOOOO "                                          'выводим надпись
Cursor Off
Waitms 100
Locate 2 , 12                                               ' позиция курсора
For U = 1 To 12
  Shiftlcd Right                                            'надпись right
  Waitms 100                                                    'wait a moment
Next

For U = 1 To 12

  Shiftlcd Left                                             'надпись left
  Waitms 100                                                    'wait a moment

Next

Start Timer0
Start Counter1

'*******Main Loop*****
Main:
Do
    If Flag = 1 Then
            Frequency = Overflow * 65536
            Frequency = Frequency + Counter1
            Frequency = Frequency / 4
            Frequency = Frequency * 60
            Cls
            Cursor Off
            Lcd Frequency
            Lcd " Rot/MIN"
            Locate 1 , 1

Temperatura:
Config 1wire = Portc.4
            1wreset
            1wwrite &HCC                                    ' Выдаем команду чтения ПЗУ
            1wwrite &H44                                    'Запуск измерения

            Waitms 750                                      'Ждем окончания преобразования

            1wreset
            1wwrite &HCC
            1wwrite &HBE                                    'Команда чтения ОЗУ датчика

            Byte0 = 1wread()                                'Читаем нулевой байт

            Byte1 = 1wread()                                'Читаем первый байт

            If Byte1 >= 248 Then                            ' Проверяем на отрицательную температуру.248 в десятичном – 11111000 в двоичном. Если температура отрицательная – вычитаем из &HFF

         Byte0 = &HFF - Byte0
         Byte1 = &HFF - Byte1
         Signtemperatura = "-"

        Else
        Signtemperatura = "+"
        End If

           T1 = Byte0 / 16                                  ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
           T2 = Byte1 * 16                                  ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

           T1 = T1 + T2                                     'Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
           Locate 2 , 1
           Lcd Signtemperatura ; T1 ; "C"

           Wait 2

            Gosub Key
Continue:

            Reset Flag
            Counter1 = 0
            Overflow = 0
            Cnt = 31250                                     ' значение подобрано для захвата за 1 секунду
            Start Timer0
            Start Counter1
     End If
Loop

'************************************************
'*******Counter1 Overflow Interrupt**************
Tm1_intsub:                                                'переполнение counter1 - счетчик прешедших импульсов
Incr Overflow
Return
'***********Timer0 Zero Interrupt****************
Tm0_intsub:
         If Cnt <> 0 Then                                   ' отсчет одной секунды
                Decr Cnt
         Else
                Stop Counter1
                Stop Timer0
                Set Flag
         End If
Return
'************End of interrupt*********************

Key:

    If Button = 0 Then                                      ' УСЛОВИЕ - если на 6-й ножке порта D низкий логический уровень то...
    Goto Led                                                ' запускаем аналого-цифровое преобразование
    Else                                                    ' в противном случае...
    Goto Continue                                           ' обороты+температура
    End If                                                  'конец условия

Led:
        Start Adc                                           'запускаем аналого-цифровое преобразование
            Cls
            W = Getadc(0)                                   'считываем результат с пина 0 порта C.
            W = W / 58.2
            Locate 1 , 1                                    ' позиция курсора
            Lcd "БАТТАРЕЯ" ; W ; "v"                        'выводим результат преобразования на ЖК
            S = Getadc(1)
            S = S / 50                                      'считываем результат с пина  порта C.
            Locate 2 , 1                                    ' позиция курсора
            Lcd "B=" ; S ; "L"
            D = Getadc(2)
            D = D / 50                                      'считываем результат с пина 2 порта C.
            Locate 2 , 7                                    ' позиция курсора
            Lcd "G=" ; D ; "v"
            Waitms 100                                      ' зедержка 0,1 секунды

Return

Отредактировано Aleks (2009-05-13 18:43:29)

0

2

Фьюзы не трогал, вот и не работает

0

3

Ведущийспециалист написал(а):

Фьюзы не трогал, вот и не работает

Весь ответ?
Обороты точно считает, таймы при температуре влияют?

0

4

Ошибки в коде есть?
С таймами  ненапутал?
Может кто даст профессианально ответ?

0

5

чет мне подсказывает что нужно jtag отключить..

посмотри сюда
http://robozone.su/

Отредактировано Pasha (2009-05-14 19:05:44)

0

6

Делитель и jtag отключен, внутрен. частота 8 Мн.

0

7

Попробуй так:

Код:
$regfile = "m8def.dat"                                      ' используем ATmega8
$crystal = 8000000                                          ' частота установленного кварца 8 mHz

'объявляем переменные
Dim Frequency As Long
Dim Flag As Bit
Dim Overflow As Byte
Dim Cnt As Long

Dim W As Word
Dim S As Word
Dim D As Word
Dim U As Word

Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Byte
Dim T2 As Byte

'**********Конфигурация портов********************
Config Portd = Input
Config Timer0 = Timer , Prescale = 1                        ' CK=8MHz - тактирование Таймер0
Config Timer1 = Counter , Edge = Rising , Noise Cancel = 1  ' включена фильтрация шумов
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'конфигурация АЦП
Config Pind.6 = Input                                       ' конфигурируем вывод 6 порта D на ВХОД - подключаем к нему кнопку
Config 1wire = Portc.4                                      'на эту ножку подключим Ds18b20 и подтягивающий резистор на 4 , 7 ком к + питания

Config Lcd = 16 * 2                                         ' экран 12*2 (любой с контроллером HD44780)
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Start Adc                                                   'запускаем аналого-цифровое преобразование
Button Alias Pind.6                                         ' присваиваем имя Button выводу 6 порта D

'****Reset for Start***********
Stop Timer0
Stop Counter1

'******Interrupt routline setting****
On Timer0 Tm0_intsub
On Timer1 Tm1_intsub

'******Enable Interrupts, timer 0, counter1*****
Enable Interrupts
Enable Timer0
Counter1 = 0
Overflow = 0
Cnt = 31250
Flag = 0

'******Initial******
Cls                                                         ' очистка дисплея
Lcd "   Ёpёіeї   "                                          ' Привет
Waitms 100

Locate 2 , 12                                               ' позиция курсора
Lcd " OOOOOOOOOO "                                          'выводим надпись
Cursor Off
Waitms 100
Locate 2 , 12                                               ' позиция курсора
For U = 1 To 12
  Shiftlcd Right                                            'надпись right
  Waitms 100                                                'wait a moment
Next

For U = 1 To 12

  Shiftlcd Left                                             'надпись left
  Waitms 100                                                'wait a moment

Next

Start Timer0
Start Counter1

'*******Main Loop*****
Main:
Do
    If Flag = 1 Then
            Frequency = Overflow * 65536
            Frequency = Frequency + Counter1
            Frequency = Frequency / 4
            Frequency = Frequency * 60
            Cls
            Cursor Off
            Lcd Frequency
            Lcd " Rot/MIN"
            Locate 1 , 1
            End If
Loop

Temperatura:
            1wreset
            1wwrite &HCC                                    ' Выдаем команду чтения ПЗУ
            1wwrite &H44                                    'Запуск измерения

            Waitms 750                                      'Ждем окончания преобразования

            1wreset
            1wwrite &HCC
            1wwrite &HBE                                    'Команда чтения ОЗУ датчика

            Byte0 = 1wread()                                'Читаем нулевой байт

            Byte1 = 1wread()                                'Читаем первый байт

            If Byte1 >= 248 Then                            ' Проверяем на отрицательную температуру.248 в десятичном – 11111000 в двоичном. Если температура отрицательная – вычитаем из &HFF

         Byte0 = &HFF - Byte0
         Byte1 = &HFF - Byte1
         Signtemperatura = "-"

        Else
        Signtemperatura = "+"
        End If

           T1 = Byte0 / 16                                  ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
           T2 = Byte1 * 16                                  ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

           T1 = T1 + T2                                     'Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
           Locate 2 , 1
           Lcd Signtemperatura ; T1 ; "C"

Continue:

            Reset Flag
            Counter1 = 0
            Overflow = 0
            Cnt = 31250                                     ' значение подобрано для захвата за 1 секунду
            Start Timer0
            Start Counter1
Gosub Temperatura
Gosub Key

'************************************************
'*******Counter1 Overflow Interrupt**************
Tm1_intsub:                                                'переполнение counter1 - счетчик прешедших импульсов
Incr Overflow
Return
'***********Timer0 Zero Interrupt****************
Tm0_intsub:
         If Cnt <> 0 Then                                   ' отсчет одной секунды
                Decr Cnt
         Else
                Stop Counter1
                Stop Timer0
                Set Flag
         End If
Return
'************End of interrupt*********************

Key:

    If Button = 0 Then                                      ' УСЛОВИЕ - если на 6-й ножке порта D низкий логический уровень то...
    Goto Led                                                ' запускаем аналого-цифровое преобразование
    Else                                                    ' в противном случае...
    Goto Continue                                           ' обороты+температура
    End If                                                  'конец условия

Led:
        Start Adc                                           'запускаем аналого-цифровое преобразование
            Cls
            W = Getadc(0)                                   'считываем результат с пина 0 порта C.
            W = W / 58.2
            Locate 1 , 1                                    ' позиция курсора
            Lcd " ATTAPE±" ; W ; "v"                        'выводим результат преобразования на ЖК
            S = Getadc(1)
            S = S / 50                                      'считываем результат с пина  порта C.
            Locate 2 , 1                                    ' позиция курсора
            Lcd "B=" ; S ; "L"
            D = Getadc(2)
            D = D / 50                                      'считываем результат с пина 2 порта C.
            Locate 2 , 7                                    ' позиция курсора
            Lcd "G=" ; D ; "v"
            Waitms 100                                      ' зедержка 0,1 секунды

Return

Отредактировано max (2009-05-14 21:29:31)

0

8

max
Спасибо, больш.
Пробую.

0


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