BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Код: Выделить всё

B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
как-то я спрашивал на форумах, что есть переменная В, но ни кто не ответил.
Наблюдая, пришёл к выводу, что она показывает состояние портов pinb.0 , Pinb.1.
Т.Е. 0,1,2,3. Если не сложно, проверьте соответсвует ли работа Вашего энкодера, той что в хелпе?
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

kip96 писал(а):Если не сложно, проверьте соответсвует ли работа Вашего энкодера, той что в хелпе?
Я выше и написал как он работает в железе с примером из хелпа. Никакой самодеятельности. :)

Код: Выделить всё

Do

B = Encoder(pind.3 , Pind.1 , Links , Rechts , 1)
Waitms 10

Loop

End

'**********[Процедуры обработки прерываний]**********

Refresh:                                         ' прерывание индикации

' тут просто вывод на семисегментный индикатор

Return

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

Links:
If I(1) > 1 Then Decr I(1)
Return

Rechts:
If I(1) < 9 Then Incr I(1)
Return
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

Сообщение Gordon Shumway »

Доброго времени суток !

Подскажите, пожалуйста, как работать с eeprom ? В обучалке с декады описано как записать и считать одно число с помощью команд Readeeprom и Writeeeprom. Мне нужно записать в eeprom набор из 10 цифр , каждая от 0 до 9 - они будут константами, которые будет использовать программа, причем в разных местах программы нужно считать определенную цифру. Например: тут прочитать пятую цифру, а тут восьмую, а тут вторую.
А в определенной подпрограмме записать туда эти цифры.

Спасибо !
С уважением,
Алексей.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Код: Выделить всё

Do

  B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)

  '                                               ^--- 1 means wait for change which blocks programflow

  '                               ^--------^---------- labels which are called

  '              ^-------^---------------------------- port PINs

  Print B

Waitms 10

Loop

End

edm2007 писал(а):Я выше и написал как он работает в железе с примером из хелпа. Никакой самодеятельности.
Пример из хелпа.
На терминал постоянно выводится переменная В, которая, по идее, показывает состояние портов енкодера. тоесть должно быть так:
3,2,0,1,3,2,0 и т.д.
kip96 писал(а):Если не сложно, проверьте соответсвует ли работа Вашего энкодера, той что в хелпе?
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Хорошо, сейчас заведу вывод переменной в железе в терминал. Посмотрим что там. А пока вопрос небольшой, переназначение Config Sda = Portc.4 : Config Scl = Portc.5 для DS1307 никаких проблем в дальнейшем не доставляет? Или все же лучше к одноименным ногам МК подключить?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

:dont_know:
Не задовался таким вопросом, пользовался токо аппаратным TWI.
Если прочитать в хелпе:
Not all AVR chips have TWI (hardware I2C)
Можно предположить, что Баском использует токо аппаратный :)) . Хотя как то встречал схемки , где делали програмно на другие ноги.
edm2007 писал(а): переназначение Config Sda = Portc.4 : Config Scl = Portc.5
На 8-й меге вроде так и есть. :hunger:
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

kip96 писал(а):На 8-й меге вроде так и есть.
Вот так и знал что будет подмечено ! :)) Да просто из кода взял где так подключено. Вроде хелп не против:
When you use different pins in different projects, you can use this statement to override the Options Compiler setting for the SDA pin. This way you will remember which pin you used because it is in your code and you do not have to change the settings from the options. In BASCOM-AVR the settings are also stored in the project.CFG file.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

kip96, вот лог: http://www.edm2007.narod.ru/other/terminal_encoder.log
Код полностью из хелпа.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

Сообщение Gordon Shumway »

Gordon Shumway писал(а):Доброго времени суток !

Подскажите, пожалуйста, как работать с eeprom ?
Сорри, разобрался... :)
С уважением,
Алексей.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Gordon Shumway писал(а):Сорри, разобрался...
Вот так форумы и помогают. Пока ждешь, сам разбираешься. :))
А как записывали ? Просто переменные по eeprom распихивали?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

Сообщение Gordon Shumway »

edm2007 писал(а):
Gordon Shumway писал(а):Сорри, разобрался...
Вот так форумы и помогают. Пока ждешь, сам разбираешься. :))
А как записывали ? Просто переменные по eeprom распихивали?
Ну да ! Как оказалось, все просто. :) сначала никак въехать не мог.
С уважением,
Алексей.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Ну вообщем усё понятно, вообщем всё зависит от шестерёнки :))
Сделал себе таймер с энкодером и пользуюсь уже с пол-года, скинул его одному форумчанину, и унего возникла проблема с энкодером. Хотя у меня работает окей, он не мог точно таймер выставить. Мы уже и щелчки считали у кого сколько :)) . Я ни как врубиться не мог, в чём проблема!
и для него сделал так:

Код: Выделить всё

Links:
Incr x
if x=102 then
x=100
Print "left rotation"
end if
Return

Rechts:
decr x
if x=98 then
Print "right rotation"
end if
Return
Передаю смысл, т.к. исходника под рукой нет. Потом и 102 и 98 заменил переменной и сделал возможность настройки энкодера в реальном времени с анимацией процесса, при включенни устройства в первый раз. Вообщем по его словам остался довольный. :beer:
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

kip96 писал(а):Ну вообщем усё понятно, вообщем всё зависит от шестерёнки
Выходит что так. У товарища +3 а у меня +2 четко. И так же в терминале если повернуть наполовину, то +1. Только калибровать под свой энкодер... И еще что интересно, если в настройках команды стоит 1 (да и вообще все, отличное от 0), то он будет стоять на команде и ждать срабатывания. А как Вы соскакивали с проверки? По прерыванию внешнему? А если 0 поставить то он дальше сам уходит по коду, но гонит сильно.

P.S. А, ну все правильно:
1 means wait for change which blocks programflow
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Не, у меня 0 стоит, а энкодер стоит в цикле(do-loop)
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

edm2007 писал(а):Вопрос заключается в следующем, как оставить пин порта в том состоянии, в котором он есть (зуммер включен, например)?
Я смотрю, на это так и не ответили – а оставить пин в покое проще всего с использованием масок. Например:

Код: Выделить всё

'x - выводимая переменная
y = PINB.0 'текущее состояние пина 0
x = x AND 254  'маска
x = x OR y
PORTB = x 'при этом PINB.0 останется неизменным
edm2007 писал(а):вопрос небольшой, переназначение Config Sda = Portc.4 : Config Scl = Portc.5 для DS1307 никаких проблем в дальнейшем не доставляет? Или все же лучше к одноименным ногам МК подключить?
Проблем не будет, но при этом будет использоваться софтовый I2C (даже несмотря на наличие аппаратного). В принципе это ничего страшного, особенно если некуда девать ресурсы :))
kip96 писал(а):Если прочитать в хелпе:
Not all AVR chips have TWI (hardware I2C)
Можно предположить, что Баском использует токо аппаратный :))
Как раз по дефолту Баском всегда использует программный :wink:
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Секретный кот, спасибо. То что по маске нужно это давно понял. Но в голове как-то не вырисовывалось. :)

Теперь еще небольшой вопрос, касаемый динамической индикации с помощью сдвиговых регистров. Если гнать в сдвиговый регистр код цифр а разрядами управлять при помощи ног МК - проблем нет. Зашли в прерывание - погасили индикатор - закинули цифру в регистр - защелкнули и нужный разряд включили. Все работает замечательно.

А если использовать два регистра, один на разряды, второй на сегменты? Нет, если разнести ноги данных и защелки по разным ногам то тоже все работает. Так же грузим гашение, щелкаем именно разрядами, далее грузим цифру, защелкиваем ее и включаем разряд.

А если как полагается соединить регистры последовательно, и загонять сразу и сегменты и разряды? Зашли в прерывание - протолкнули цифру - протолкнули разряд - защелкнули и ушли. При следующем заходе то же самое. Меня немного смущает тот факт, что гашения как такового не будет. Не возникнет ли засветка соседних цифр?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Секретный кот писал(а):Проблем не будет, но при этом будет использоваться софтовый I2C (даже несмотря на наличие аппаратного). В принципе это ничего страшного, особенно если некуда девать ресурсы
Вот ресурсы-то как раз девать есть куда. :( Можно немного подробнее про это? Аппаратный на определенных ногах сидит. А если я меняю на другие ноги то разницы абсолютно никакой не вижу. :dont_know:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Электрический кот
Аватара пользователя
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Привет,котятки!
Такой вопрос: при динамической индикации температуры(индикатор с ОА), получаемой из DS18B20 на самом деле высвечиваются только нули и точка. Гляньте-ка код. Где что не так? :shock: Схему даже рисовать не стал - все банально: PORTB - на сегменты, PORTD.6 - 1разряд, PORTD.5 - 2разряд, PORTD.4 - 1WIRE (DS18B20), PORTD.3 - LED для индикации минуса.

Код: Выделить всё

$regfile = "attiny2313.dat"
$crystal = 8000000
Config Watchdog = 2048
$lib "mcsbyte.lbx"

Config Portb = Output
Config Portd.5 = Output , Portd.6 = Output , Portd.3 = Output
Config 1wire = Portd.4
Config Timer0 = Timer , Prescale = 8
On Timer0 Pulse

Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte
Dim Chislo(8) As Integer , Viv_peremennaya As Integer , Temp_print As Integer
Dim Dp_flag1 As Bit , Dp_flag2 As Bit
Dim Set_flag As Byte
Dim Mode_flag As Byte , View_menu As Byte
Dim Nosave_time As Byte
Dim T1 As Integer , T2 As Integer , Byte0 As Byte , Byte1 As Byte

Dig1 Alias Portd.6 : Dig2 Alias Portd.5 : Minus Alias Portd.3
A Alias Portb.0 : B Alias Portb.1 : C Alias Portb.2 : D Alias Portb.3
E Alias Portb.4 : F Alias Portb.5 : G Alias Portb.6 : Dp Alias Portb.7

For X = 1 To 2                                              ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались ноли
Chislo(x) = 11
Next
Viv_peremennaya = 100
Enable Timer0 : Enable Interrupts

Do
'*******************************************************************************
' Запрос с DS18b20 Температуры, погашение первого числа если температура положительная и зажигания там минуса если отритцательная, либо единици если температура > 99. Зажигание последнего символа в виде буквы С и установка перед ней в верху точки (-22'C)(108'C)(05'C)
1wreset
Stop Timer0
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Start Timer0
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
Stop Timer0
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
Start Timer0
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Set Minus
Else
Reset Minus
End If
T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2                                                ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
Chislo(1) = T1 Mod 10
Chislo(2) = T1 / 10

Dp_flag1 = 1
Dp_flag2 = 0
Waitms 1800
'*******************************************************************************

Loop

Pulse:
Reset Watchdog
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = T1
For I = 1 To 2                                              ' цикл в котором разбивается переменная на отдельные числа от 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
Incr W : If W > 2 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 :
  If Dp_flag1 = 1 Then Reset Dp Else Set Dp
 Set Dig1
 Case 2 :
 If Dp_flag2 = 1 Then Reset Dp Else Set Dp
 Set Dig2
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...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)

Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
'       |Chislo(i)                   |                     Символ |
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

'*******************************************************************************
Цапу крутить надо!!! Ку или не ку?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Для начала тормозите таймер ДО команды 1wreset, не надо шине мешать.

Код: Выделить всё

Stop Timer0
1wreset
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Start Timer0
Waitms 750                                                  ' Ждем окончания преобразования
Stop Timer0
1wreset
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
Start Timer0
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Электрический кот
Аватара пользователя
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Сделал. Результат тот-же(нулевой) :shock:
Цапу крутить надо!!! Ку или не ку?
Ответить

Вернуться в «AVR»