Код: Выделить всё
B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)Наблюдая, пришёл к выводу, что она показывает состояние портов pinb.0 , Pinb.1.
Т.Е. 0,1,2,3. Если не сложно, проверьте соответсвует ли работа Вашего энкодера, той что в хелпе?
Код: Выделить всё
B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)Я выше и написал как он работает в железе с примером из хелпа. Никакой самодеятельности.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
Код: Выделить всё
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 писал(а):Я выше и написал как он работает в железе с примером из хелпа. Никакой самодеятельности.
kip96 писал(а):Если не сложно, проверьте соответсвует ли работа Вашего энкодера, той что в хелпе?
Можно предположить, что Баском использует токо аппаратныйNot all AVR chips have TWI (hardware I2C)
На 8-й меге вроде так и есть.edm2007 писал(а): переназначение Config Sda = Portc.4 : Config Scl = Portc.5
Вот так и знал что будет подмечено !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.
Сорри, разобрался...Gordon Shumway писал(а):Доброго времени суток !
Подскажите, пожалуйста, как работать с eeprom ?
Вот так форумы и помогают. Пока ждешь, сам разбираешься.Gordon Shumway писал(а):Сорри, разобрался...
Ну да ! Как оказалось, все просто.edm2007 писал(а):Вот так форумы и помогают. Пока ждешь, сам разбираешься.Gordon Shumway писал(а):Сорри, разобрался...
А как записывали ? Просто переменные по eeprom распихивали?
Код: Выделить всё
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Выходит что так. У товарища +3 а у меня +2 четко. И так же в терминале если повернуть наполовину, то +1. Только калибровать под свой энкодер... И еще что интересно, если в настройках команды стоит 1 (да и вообще все, отличное от 0), то он будет стоять на команде и ждать срабатывания. А как Вы соскакивали с проверки? По прерыванию внешнему? А если 0 поставить то он дальше сам уходит по коду, но гонит сильно.kip96 писал(а):Ну вообщем усё понятно, вообщем всё зависит от шестерёнки
1 means wait for change which blocks programflow
Я смотрю, на это так и не ответили – а оставить пин в покое проще всего с использованием масок. Например:edm2007 писал(а):Вопрос заключается в следующем, как оставить пин порта в том состоянии, в котором он есть (зуммер включен, например)?
Код: Выделить всё
'x - выводимая переменная
y = PINB.0 'текущее состояние пина 0
x = x AND 254 'маска
x = x OR y
PORTB = x 'при этом PINB.0 останется неизменнымПроблем не будет, но при этом будет использоваться софтовый I2C (даже несмотря на наличие аппаратного). В принципе это ничего страшного, особенно если некуда девать ресурсыedm2007 писал(а):вопрос небольшой, переназначение Config Sda = Portc.4 : Config Scl = Portc.5 для DS1307 никаких проблем в дальнейшем не доставляет? Или все же лучше к одноименным ногам МК подключить?
Как раз по дефолту Баском всегда использует программныйkip96 писал(а):Если прочитать в хелпе:Можно предположить, что Баском использует токо аппаратныйNot all AVR chips have TWI (hardware I2C)
Вот ресурсы-то как раз девать есть куда.Секретный кот писал(а):Проблем не будет, но при этом будет использоваться софтовый I2C (даже несмотря на наличие аппаратного). В принципе это ничего страшного, особенно если некуда девать ресурсы
Код: Выделить всё
$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
'*******************************************************************************Код: Выделить всё
Stop Timer0
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Start Timer0
Waitms 750 ' Ждем окончания преобразования
Stop Timer0
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread() ' Читаем первый байт
Start Timer0