Страница 98 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 02:54:32
Magicanin
Код: Выделить всё
...
U = 0.00488755
...
Button:
Incr U
Waitms Debouncetime
Gifr = 64
Return 'подпрограмма 1 установка 50в
Sub Limit1
If U > 0.00488755 Then
Portd.0 = 0 'выключаем реле 1 делителя
Portd.1 = 1 'включаем реле 2 делителя
U = 0.04887585 'устанавливаем коэф.для измерения
A = 50 'устанавливаем предел на индикацию
C = 49.95 'устанавливаем предел для защиты
End If
...
Вы же, уважаемый, свой расчетный коэффициент U увеличиваете на 1(целочисленная единица) функцией Incr, чтож вы еще ожидали...
Выбор пределов измерения можно делать по принципу выбора пункта меню (функция Case).
Подумайте над этим...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 07:30:24
Aleks8383
Да я сначало так и пробовал,чегото тоже не пошло.Пишет ошибку 3 parameters expected и ещё IF THEN expected , end select expected.И ссылается на строки Case 0 и 1 ,а если после If D > 2 Then D = 0 закрыть иф тоже даёт ошибку IF THEN expected.Вроде всё закрываю и IF THEN и end select
всёравно ошибка и что это за ошибка 3 parameters expected чего там 3 параметра ожидают в строке case.
Код: Выделить всё
$regfile = "m8def.dat" ' atmega8
$crystal = 4000000 ' частота установленного кварца 4 mHz
'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portd.6
Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'конфигурация АЦП
Config Portd = &B1101111
Config Pind.2 = Input
Config Pinc.0 = Input
'объявляем переменные
Dim W As Word
Dim U As Single
Dim Ulcd As Single
Dim A As Word
Dim B As Word
Dim C As Single
Dim D As Word
Declare Sub Alarm
On Int0 Button 'обзываем прерывание button
Config Int0 = Rising 'конфигурируем прерывание по фронту сигнала
Config Debounce = 50
Const Debouncetime = 75
Enable Interrupts 'разрешаем прерывание и в частности INT0
Enable Int0
'-------------------------------------------------------------
'главный цикл программы
Portd.0 = 1
U = 0.00488755 'устанавливаем коэф.для 5 в
A = 5
C = 4.95
D = 0
Start Adc
'запускаем аналого-цифровое преобразование
Do
If D > 2 Then D = 0
Select Case D
Case 0 : U = 0.00488755 : A = 5 : C = 4.95 : Portd.0 = 1 : Portd.3 = 0
Case 1 : U = 0.04887585 : A = 50 : C = 49.95 : Portd.1 = 1 : Portd.0 = 0
Case 2 : U = 0.09775171 : A = 100 : C = 99.95 : Portd.3 = 1 : Portd.1 = 0
End Select
W = Getadc(0) ' измеряем напряжение по входу 0 (РС.0)
Ulcd = U * W ' умножаем что получилось на коэфициент
If Ulcd > C Then
Goto Alarm
Else
End If
M4:
Locate 1 , 1 'выводим на экран
Lcd "Voltage"
Locate 2 , 1
Lcd "U=" ; Fusing(ulcd , "##.#") ; " B "
Locate 1 , 12
Lcd "limit"
Locate 2 , 12
Lcd A
Locate 2 , 15
Lcd "B"
Waitms 100
Loop
Button: 'обработка прерывания
Incr D
Waitms Debouncetime
Gifr = 64
Return
'подпрограмма предела измерений
Sub Alarm
Portd.5 = 1
Cls
Cursor Off
Sound , Portd.4 , 200 , 300
Locate 1 , 5
Lcd "LIMIT"
Wait 2
Portd.5 = 0
Goto M4
End Sub
End
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 11:13:20
Magicanin
Ну для начала многим твоим переменным можно присвоить и байтовое значение, чтобы не перегружать программу, особенно в случе D больше двух он не примет.
А что касается выбора пункта, его надо декларировать:
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 11:52:46
Aleks8383
Подправил но всё равно выдаёт ошибку 3 parameters expected настроки Case.Чего не так я с этими строками делаю,раньше с ними не работал срисовал с примера.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 13:40:11
selco
Доброго всем ЗДОРОВИЯ.Кто нибуть может состряпать програмку для нокиа 3310 чтоб можно было нарисовать большие цифры ну хотябы 16x8.
Писали по поваду LCD A55,A52-Siemens,Я взял библиотеку от 3410 изменил контрастность на
максимум FF и он заработал только шрифт мелкий я не спец в этом, а вы доведёте может до ума мне он нравится стоит копейки и паять можно.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 15:06:21
Aleks8383
Разобрался почему ошибка в Select Case нельзя перечислять несколько значений переменной только одно ,за исклячением chr.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 20:40:08
max50
Aleks8383 писал(а):нельзя перечислять несколько значений переменной только одно
Ну почему же? У меня работает так:
И вот так:
Код: Выделить всё
Case 1 : Reset Portd.6
Set Portb.1 : Reset Portb.0 : Reset Portb.2 : Reset Portb.3 : Reset Portb.4
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт авг 23, 2011 21:22:01
Aleks8383
Ну что то у меня зато перичесление переменных через тоже : не пошло,хотя в примере с какого и спасывал так и было сделано.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт авг 26, 2011 16:11:53
Igor_67
Aleks8383 писал(а):Ну что то у меня зато перичесление переменных через тоже : не пошло,хотя в примере с какого и спасывал так и было сделано.
А вы не обратили внимания, что в показанном вам примере :
Код: Выделить всё
Case 1 : Reset Portd.6
Set Portb.1 : Reset Portb.0 : Reset Portb.2 : Reset Portb.3 : Reset Portb.4
код написан в две строки, а у вас - :
Код: Выделить всё
Case 0 : U = 0.00488755 : A = 5 : C = 4.95 : Portd.0 = 1 : Portd.3 = 0
, к сожалению, в одну. Вот интерпретатор и ругается.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс авг 28, 2011 16:19:20
Igor_67
Всем привет!
Ребята, имеется код собственной разработки. Нужна помощь, чтобы довести до ума. В частности - температура почему-то показывает по нулям

, потом надо расставить по индикатору точки (не соображу как). Когда-то делал, а теперь что-то подзабыл... (только не надо шуток по поводу того, что "не знал, да еще забыл") - знал, просто старые проекты все потерялись и все наработки тоже. Данное и так по памяти написано!
И еще правильно организовать цикл в прерывании TIMER1 (обработчик называется Vr), чтобы 10 секунд показывало время, 3 секунды-первый датчик, 3 секунды-второй датчик.
Вот собственно код:
Код: Выделить всё
$regfile = "m48def.dat"
$crystal = 8000000
$lib "ds1307clock.lib"
'-------------------------------------
Config 1wire = Portd.4
Config Sda = Portc.4
Config Scl = Portc.5
Config Clock = User
Config Portc.0 = Output , Portc.1 = Output , Portc.2 = Output , Portc.3 = Output
Config Portd.0 = Output , Portd.1 = Output
Config Portb = Output
Config Timer0 = Timer , Prescale = 8 'таймер индикации
Config Timer1 = Timer , Prescale = 1024
Config Watchdog = 2048
'-------------------------------------
Declare Sub Ds18b20()
Const Ds1307w = &HD0
Const Ds1307r = &HD1
'**************************************
Time$ = "12:00:00"
Date$ = "01/01/11" 'метка подпрограммы индикации
Razr1 Alias Portc.0 : Razr2 Alias Portc.1 : Razr3 Alias Portc.2
Razr4 Alias Portc.3 : Razr5 Alias Portd.0 : Razr6 Alias Portd.1
'**************************************
Dim Chas As Byte , Minut As Byte , Sekund As Byte
Dim I1 As Integer
Dim I2 As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim B As Byte
Dim Weekday As Byte
Dim Flag As Bit
Dim X As Byte , Count As Byte , I As Byte
Dim Number(6) As Byte
Dim Ttt As Byte
'**************************************
For X = 1 To 2
Portb = &HFF
Reset Razr1 : Reset Razr2
Reset Razr3 : Reset Razr4
Reset Razr5 : Reset Razr6
Waitms 500
Set Razr1 : Set Razr2
Set Razr3 : Set Razr4
Set Razr5 : Set Razr6
Waitms 500
Next X
Portb = &B01000000
Reset Razr1 : Reset Razr3 : Reset Razr5
Reset Razr2 : Reset Razr4 : Reset Razr6
Wait 1
Set Razr2 : Set Razr4 : Set Razr6
Set Razr1 : Set Razr3 : Set Razr5
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
'**************************************
On Ovf0 Refresh
On Ovf1 Vr
On Int0 But1 Nosave
On Int1 But2 Nosave
Enable Interrupts
Enable Int0
Enable Int1
Enable Ovf0
Enable Ovf1
'**************************************
Main:
Do
Gosub Getdatetime
Number(1) = _hour / 10
Number(2) = _hour Mod 10
Number(3) = _min / 10
Number(4) = _min Mod 10
Number(5) = _sec / 10
Number(6) = _sec Mod 10
Wait 1
Loop Until Ttt >= 10
Do
For I = 1 To 6
Number(i) = 10
Next I
Call Ds18b20()
Reset Watchdog
Number(2) = I1 / 10 : Number(3) = I1 Mod 10 : Number(4) = I1 Mod 100
Number(1) = 11 : Number(5) = 12 : Number(6) = 13
Reset Watchdog
Wait 3
For I = 1 To 6
Number(i) = 10
Next I
Number(2) = I2 / 10 : Number(3) = I2 Mod 10 : Number(4) = I2 Mod 100
Number(1) = 11 : Number(5) = 12 : Number(6) = 13
Reset Watchdog
Wait 3
For I = 1 To 6
Number(i) = 10
Next I
Loop Until Ttt >= 6
Goto Main
End
'************************[Процедуры обработки подпрограмм и прерываний]************************
Refresh: ' прерывание таймера Т0 (индикация)
Set Razr1 : Set Razr2 : Set Razr3 ' гасим индикатор
Set Razr4 : Set Razr5 : Set Razr6
Incr Count : If Count > 6 Then Count = 1 ' выбираем разряд для загрузки
Portb = Lookup(number(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' и включаем соответствующий разряд индикатора
Case 1 : Reset Razr1
Case 2 : Reset Razr2
Case 3 : Reset Razr3
Case 4 : Reset Razr4
Case 5 : Reset Razr5
Case 6 : Reset Razr6
End Select
Return ' выход из обработчика прерывания
Vr:
Incr Ttt
Return
But1:
Waitms 100
Gosub Getdatetime
Sekund = _sec
Minut = _min
Chas = _hour
Incr Chas
If Chas > 23 Then Chas = 0
_hour = Chas
_min = Minut
_sec = Sekund
Gosub Settime
Return
But2:
Waitms 100
Gosub Getdatetime
Sekund = _sec
Minut = _min
Chas = _hour
Incr Minut
If Minut > 59 Then Minut = 0
_hour = Chas
_min = Minut
_sec = Sekund
Gosub Settime
Return
Sub Ds18b20()
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1 = 1wread(2)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2 = 1wread(2)
'---------------------------------
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
I1 = I1 * 10
I1 = I1 / 16
I2 = I2 * 10
I2 = I2 / 16
End Sub
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return
'********************************************************[DATA]*************************
Digits: ' цифры
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 ' 0 1 2 3 4
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111 ' 5 6 7 8 9
Data &B00000000 , &B01111000 , &B01100011 , &B00111001 ' space , t, grad ,C
'***************************************************************************************
Гляньте, пожалуйста, кому не лень. Может еще чего по оптимизации подскажете!?
Проект в Протеусе прилепил.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс авг 28, 2011 16:35:14
edm2007
Привет. Ну правильно, и не будет работать... Проект жеж на LCD и PCF8583...

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс авг 28, 2011 16:56:18
Igor_67
Ой, извиняюсь!

Не тот архив прицепил. Исправил. Смотреть тот же пост.

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс авг 28, 2011 20:09:17
edm2007
Во-первых, логичнее все же сначала запускать измерение для обоих датчиков, и лишь потом забирать результаты измерения. А не наоборот.
Во-вторых, разнос по разрядам неправильный. Допустим, температура 25,6 C. В переменную I1 после всех преобразований запишется 256. А в разносе:
Код: Выделить всё
Number(2) = I1 / 10 : Number(3) = I1 Mod 10 : Number(4) = I1 Mod 100
Number(1) = 11 : Number(5) = 12 : Number(6) = 13
Number(2) = 256/10 = 25 целых. И что он должен закинуть в порт, по указателю 25 ? Ну и дальше все пошагало не туда, естественно.
Но даже если исправить то все равно работать не будет. Ведь переменные Number и I1 должны быть одного типа ! Только тогда будут работать все эти деления и остатки...
И самое главное, на время отправки команд сброса линии / запуска измерения / чтения все прерывания должны быть запрещены. Иначе начитаемся мусора...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс авг 28, 2011 20:28:51
Igor_67
Михаил, спасибо! Ты, как всегда, выручаешь!

Буду исправлять...

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс авг 28, 2011 20:40:05
edm2007
Да не за что.

Если исправить то все работает. Правда без точек.

Но и это не проблема. Но пилить до ума еще много...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 05, 2011 18:15:45
Alex_Megavolt_79
Кто подскажет как реализован расчёт дня недели в софтовых часах. Не хочу завязываться на софтовые. А если не запускать софтовые, то команда Target = DayOfWeek() не работает.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн сен 05, 2011 20:16:00
max50
Alex_Megavolt_79 писал(а):Не хочу завязываться на софтовые.
Код из хелпа:
Код: Выделить всё
DAYOFWEEK
Top Previous Next
Action
Returns the Day of the Week of a Date.
Syntax
Target = DayOfWeek()
Target = DayOfWeek(bDayMonthYear)
Target = DayOfWeek(strDate)
Target = DayOfWeek(wSysDay)
Target = DayOfWeek(lSysSec)
Remarks
Target
A Byte – variable, that is assigned with the day of the week
BDayMonthYear
A Byte – variable, which holds the Day-value followed by Month(Byte) and Year (Byte)
StrDate
A String, which holds a Date-String in the format specified in the
CONFIG DATE statement
WSysDay
A Word – variable, which holds the System Day (SysDay)
LSysSec
A Long – variable, which holds the System Second (SysSec)
The Function can be used with five different kind of Input:
1. Without any parameter. The internal Date-values of SOFTCLOCK (_day, _month, _year) are used.
2. With a user defined date array. It must be arranged in same way (Day, Month, Year) as the internal SOFTCLOCK date. The first Byte (Day) is the input by this kind of usage. So the Day of the Week can be calculated of every date.
3. With a Date-String. The date-string must be in the Format specified in the Config Date Statement
4. With a System Day – Number.
5. With a System Second - Number
The Return-Value is in the range of 0 to 6, Monday starts with 0.
The Function is valid in the 21th century (from 2000-01-01 to 2099-12-31).
See Also
Date and Time routines , CONFIG DATE , CONFIG CLOCK, SYSDAY, SYSSEC
Example
'-----------------------------------------------------------------------------------------
'name : datetime_test1,bas
'copyright : (c) 1995-2005, MCS Electronics
'purpose : show how to use the Date-Time routines from the DateTime.Lib
'micro : Mega103
'suited for demo : no
'commercial addon needed : no
'-----------------------------------------------------------------------------------------
$regfile = "m103def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Const Clockmode = 1
'use i2c for the clock
#if Clockmode = 1
Config Clock = Soft ' we use build in clock
Disable Interrupts
#else
Config Clock = User ' we use I2C for the clock
'configure the scl and sda pins
Config Sda = Portd.6
Config Scl = Portd.5
'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
#endif
'configure the date format
Config Date = Ymd , Separator = - ' ANSI-Format
'This sample does not have the clock started so interrupts are not enabled
' Enable Interrupts
'dim the used variables
Dim Lvar1 As Long
Dim Mday As Byte
Dim Bweekday As Byte , Strweekday As String * 10
Dim Strdate As String * 8
Dim Strtime As String * 8
Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
Dim Bday As Byte , Bmonth As Byte , Byear As Byte
Dim Lsecofday As Long
Dim Wsysday As Word
Dim Lsyssec As Long
Dim Wdayofyear As Word
' =================== DayOfWeek =========
' Example 1 with internal RTC-Clock
_day = 4 : _month = 11 : _year = 2 ' Load RTC-Clock for example - testing
Bweekday = Dayofweek()
Strweekday = Lookupstr(bweekday , Weekdays)
Print "Weekday-Number of " ; Date$ ; " is " ; Bweekday ; " = " ; Strweekday
' Example 2 with defined Clock - Bytes (Day / Month / Year)
Bday = 26 : Bmonth = 11 : Byear = 2
Bweekday = Dayofweek(bday)
Strweekday = Lookupstr(bweekday , Weekdays)
Strdate = Date(bday)
Print "Weekday-Number of Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear ; " is " ; Bweekday ; " (" ; Date(bday) ; ") = " ; Strweekday
' Example 3 with System Day
Wsysday = 2000 ' that is 2005-06-23
Bweekday = Dayofweek(wsysday)
Strweekday = Lookupstr(bweekday , Weekdays)
Print "Weekday-Number of System Day " ; Wsysday ; " (" ; Date(wsysday) ; ") is " ; Bweekday ; " = " ; Strweekday
' Example 4 with System Second
Lsyssec = 123456789 ' that is 2003-11-29 at 21:33:09
Bweekday = Dayofweek(lsyssec)
Strweekday = Lookupstr(bweekday , Weekdays)
Print "Weekday-Number of System Second " ; Lsyssec ; " (" ; Date(lsyssec) ; ") is " ; Bweekday ; " = " ; Strweekday
' Example 5 with Date-String
Strdate = "04-11-02" ' we have configured Date in ANSI
Bweekday = Dayofweek(strdate)
Strweekday = Lookupstr(bweekday , Weekdays)
Print "Weekday-Number of " ; Strdate ; " is " ; Bweekday ; " = " ; Strweekday
' ================= Second of Day =========
' Example 1 with internal RTC-Clock
_sec = 12 : _min = 30 : _hour = 18 ' Load RTC-Clock for example - testing
Lsecofday = Secofday()
Print "Second of Day of " ; Time$ ; " is " ; Lsecofday
' Example 2 with defined Clock - Bytes (Second / Minute / Hour)
Bsec = 20 : Bmin = 1 : Bhour = 7
Lsecofday = Secofday(bsec)
Print "Second of Day of Sec=" ; Bsec ; " Min=" ; Bmin ; " Hour=" ; Bhour ; " (" ; Time(bsec) ; ") is " ; Lsecofday
' Example 3 with System Second
Lsyssec = 1234456789
Lsecofday = Secofday(lsyssec)
Print "Second of Day of System Second " ; Lsyssec ; "(" ; Time(lsyssec) ; ") is " ; Lsecofday
' Example 4 with Time - String
Strtime = "04:58:37"
Lsecofday = Secofday(strtime)
Print "Second of Day of " ; Strtime ; " is " ; Lsecofday
' ================== System Second ========
' Example 1 with internal RTC-Clock
' Load RTC-Clock for example - testing
_sec = 17 : _min = 35 : _hour = 8 : _day = 16 : _month = 4 : _year = 3
Lsyssec = Syssec()
Print "System Second of " ; Time$ ; " at " ; Date$ ; " is " ; Lsyssec
' Example 2 with with defined Clock - Bytes (Second, Minute, Hour, Day / Month / Year)
Bsec = 20 : Bmin = 1 : Bhour = 7 : Bday = 22 : Bmonth = 12 : Byear = 1
Lsyssec = Syssec(bsec)
Strtime = Time(bsec)
Strdate = Date(bday)
Print "System Second of " ; Strtime ; " at " ; Strdate ; " is " ; Lsyssec
' Example 3 with System Day
Wsysday = 2000
Lsyssec = Syssec(wsysday)
Print "System Second of System Day " ; Wsysday ; " (" ; Date(wsysday) ; " 00:00:00) is " ; Lsyssec
' Example 4 with Time and Date String
Strtime = "10:23:50"
Strdate = "02-11-29" ' ANSI-Date
Lsyssec = Syssec(strtime , Strdate)
Print "System Second of " ; Strtime ; " at " ; Strdate ; " is " ; Lsyssec ' 91880630
' == Day Of Year =====
' Example 1 with internal RTC-Clock
_day = 20 : _month = 11 : _year = 2 ' Load RTC-Clock for example - testing
Wdayofyear = Dayofyear()
Print "Day Of Year of " ; Date$ ; " is " ; Wdayofyear
' Example 2 with defined Clock - Bytes (Day / Month / Year)
Bday = 24 : Bmonth = 5 : Byear = 8
Wdayofyear = Dayofyear(bday)
Print "Day Of Year of Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear ; " (" ; Date(bday) ; ") is " ; Wdayofyear
' Example 3 with Date - String
Strdate = "04-10-29" ' we have configured ANSI Format
Wdayofyear = Dayofyear(strdate)
Print "Day Of Year of " ; Strdate ; " is " ; Wdayofyear
' Example 4 with System Second
Lsyssec = 123456789
Wdayofyear = Dayofyear(lsyssec)
Print "Day Of Year of System Second " ; Lsyssec ; " (" ; Date(lsyssec) ; ") is " ; Wdayofyear
' Example 5 with System Day
Wsysday = 3000
Wdayofyear = Dayofyear(wsysday)
Print "Day Of Year of System Day " ; Wsysday ; " (" ; Date(wsysday) ; ") is " ; Wdayofyear
' =================== System Day ====================
' Example 1 with internal RTC-Clock
_day = 20 : _month = 11 : _year = 2 ' Load RTC-Clock for example - testing
Wsysday = Sysday()
Print "System Day of " ; Date$ ; " is " ; Wsysday
' Example 2 with defined Clock - Bytes (Day / Month / Year)
Bday = 24 : Bmonth = 5 : Byear = 8
Wsysday = Sysday(bday)
Print "System Day of Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear ; " (" ; Date(bday) ; ") is " ; Wsysday
' Example 3 with Date - String
Strdate = "04-10-29"
Wsysday = Sysday(strdate)
Print "System Day of " ; Strdate ; " is " ; Wsysday
' Example 4 with System Second
Lsyssec = 123456789
Wsysday = Sysday(lsyssec)
Print "System Day of System Second " ; Lsyssec ; " (" ; Date(lsyssec) ; ") is " ; Wsysday
' =================== Time ============
' Example 1: Converting defined Clock - Bytes (Second / Minute / Hour) to Time - String
Bsec = 20 : Bmin = 1 : Bhour = 7
Strtime = Time(bsec)
Print "Time values: Sec=" ; Bsec ; " Min=" ; Bmin ; " Hour=" ; Bhour ; " converted to string " ; Strtime
' Example 2: Converting System Second to Time - String
Lsyssec = 123456789
Strtime = Time(lsyssec)
Print "Time of Systemsecond " ; Lsyssec ; " is " ; Strtime
' Example 3: Converting Second of Day to Time - String
Lsecofday = 12345
Strtime = Time(lsecofday)
Print "Time of Second of Day " ; Lsecofday ; " is " ; Strtime
' Example 4: Converting System Second to defined Clock - Bytes (Second / Minute / Hour)
Lsyssec = 123456789
Bsec = Time(lsyssec)
Print "System Second " ; Lsyssec ; " converted to Sec=" ; Bsec ; " Min=" ; Bmin ; " Hour=" ; Bhour ; " (" ; Time(lsyssec) ; ")"
' Example 5: Converting Second of Day to defined Clock - Bytes (Second / Minute / Hour)
Lsecofday = 12345
Bsec = Time(lsecofday)
Print "Second of Day " ; Lsecofday ; " converted to Sec=" ; Bsec ; " Min=" ; Bmin ; " Hour=" ; Bhour ; " (" ; Time(lsecofday) ; ")"
' Example 6: Converting Time-string to defined Clock - Bytes (Second / Minute / Hour)
Strtime = "07:33:12"
Bsec = Time(strtime)
Print "Time " ; Strtime ; " converted to Sec=" ; Bsec ; " Min=" ; Bmin ; " Hour=" ; Bhour
' =========== Date ======
' Example 1: Converting defined Clock - Bytes (Day / Month / Year) to Date - String
Bday = 29 : Bmonth = 4 : Byear = 12
Strdate = Date(bday)
Print "Dat values: Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear ; " converted to string " ; Strdate
' Example 2: Converting from System Day to Date - String
Wsysday = 1234
Strdate = Date(wsysday)
Print "System Day " ; Wsysday ; " is " ; Strdate
' Example 3: Converting from System Second to Date String
Lsyssec = 123456789
Strdate = Date(lsyssec)
Print "System Second " ; Lsyssec ; " is " ; Strdate
' Example 4: Converting SystemDay to defined Clock - Bytes (Day / Month / Year)
Wsysday = 2000
Bday = Date(wsysday)
Print "System Day " ; Wsysday ; " converted to Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear ; " (" ; Date(wsysday) ; ")"
' Example 5: Converting Date - String to defined Clock - Bytes (Day / Month / Year)
Strdate = "04-08-31"
Bday = Date(strdate)
Print "Date " ; Strdate ; " converted to Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear
' Example 6: Converting System Second to defined Clock - Bytes (Day / Month / Year)
Lsyssec = 123456789
Bday = Date(lsyssec)
Print "System Second " ; Lsyssec ; " converted to Day=" ; Bday ; " Month=" ; Bmonth ; " Year=" ; Byear ; " (" ; Date(lsyssec) ; ")"
' ================ Second of Day elapsed
Lsecofday = Secofday()
_hour = _hour + 1
Lvar1 = Secelapsed(lsecofday)
Print Lvar1
Lsyssec = Syssec()
_day = _day + 1
Lvar1 = Syssecelapsed(lsyssec)
Print Lvar1
Looptest:
' Initialising for testing
_day = 1
_month = 1
_year = 1
_sec = 12
_min = 13
_hour = 14
Do
If _year > 50 Then
Exit Do
End If
_sec = _sec + 7
If _sec > 59 Then
Incr _min
_sec = _sec - 60
End If
_min = _min + 2
If _min > 59 Then
Incr _hour
_min = _min - 60
End If
_hour = _hour + 1
If _hour > 23 Then
Incr _day
_hour = _hour - 24
End If
_day = _day + 1
If _day > 28 Then
Select Case _month
Case 1
Mday = 31
Case 2
Mday = _year And &H03
If Mday = 0 Then
Mday = 29
Else
Mday = 28
End If
Case 3
Mday = 31
Case 4
Mday = 30
Case 5
Mday = 31
Case 6
Mday = 30
Case 7
Mday = 31
Case 8
Mday = 31
Case 9
Mday = 30
Case 10
Mday = 31
Case 11
Mday = 30
Case 12
Mday = 31
End Select
If _day > Mday Then
_day = _day - Mday
Incr _month
If _month > 12 Then
_month = 1
Incr _year
End If
End If
End If
If _year > 99 Then
Exit Do
End If
Lsecofday = Secofday()
Lsyssec = Syssec()
Bweekday = Dayofweek()
Wdayofyear = Dayofyear()
Wsysday = Sysday()
Print Time$ ; " " ; Date$ ; " " ; Lsecofday ; " " ; Lsyssec ; " " ; Bweekday ; " " ; Wdayofyear ; " " ; Wsysday
Loop
End
'only when we use I2C for the clock we need to set the clock date time
#if Clockmode = 0
'called from datetime.lib
Dim Weekday As Byte
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return
#endif
Weekdays:
Data "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" , "Sunday"
Но я на DS1307 сделал так:
Код: Выделить всё
Declare Sub Month_disp 'подпрограмма перевода цифровых значений месяца в названия месяца
Dim Daysmonth As Byte 'переменная дней в месяце
Dim Month_disp As String * 8 'переменная месяца, выводимая на дисплей
Dim Weekday_disp As String * 7 'переменная дня недели, выводимая на дисплей
Dim Weekday_read As Byte 'переменная номера дня недели, считываемая из DS1307
Dim Weekday As Byte 'переменная номера дня недели
Do 'начало основного цикла
Call Month_disp 'вызываем подпрограмму перевода цифровых значений месяца в названия месяца
Locate 1 , 1 'задаем позицию курсора
Lcd Time$ 'выводим на ЖКИ время, вызывая подпрограмму чтения времени из DS1307
Locate 2 , 1 'задаем позицию курсора
Lcd _day ; " " ; Month_disp 'выводим на ЖКИ значение переменной _day, пробел, значение переменной Month_disp
If _year < 10 Then 'если значение переменной _year < 10 то,
Lcd " 200" ; _year ; " " 'выводим на ЖКИ, пробел, 200, значение переменной _year, 4 пробела
Else 'иначе
Lcd " 20" ; _year ; " " 'выводим на ЖКИ, пробел, 20, значение переменной _year, 4 пробела
End If 'конец если
Weekday_read = Dayofweek() 'считываем номер дня недели из DS1307
Weekday_disp = Lookupstr(weekday_read , Weekdays) 'преобразовываем номер дня недели в название дня недели
Locate 1 , 10 'задаем позицию курсора
Lcd Weekday_disp 'выводим на ЖКИ значение переменной Weekday_disp
Loop 'конец основного цикла
End
Sub Month_disp 'подпрограмма перевода цифровых значений месяца в названия месяца
'*******************************************************************************
Select Case _month
Case 1 : Month_disp = "ЗЅіapЗ" 'января
Daysmonth = 31
Case 2 : Month_disp = "дeіpa»З" 'февраля
Daysmonth = _year And &H03 'проверяем на високосный год
If Daysmonth = 0 Then 'если год високосный (переменная Daysmonth = 0)
Daysmonth = 29 'то переменная Daysmonth = 29
Else 'иначе
Daysmonth = 28 'переменная Daysmonth = 28
End If
Case 3 : Month_disp = "јapїa" 'марта
Daysmonth = 31
Case 4 : Month_disp = "aѕpe»З" 'апреля
Daysmonth = 30
Case 5 : Month_disp = "јaЗ" 'мая
Daysmonth = 31
Case 6 : Month_disp = "ёЖЅЗ" 'июня
Daysmonth = 30
Case 7 : Month_disp = "ёЖ»З" 'июля
Daysmonth = 31
Case 8 : Month_disp = "aіґycїa" 'августа
Daysmonth = 31
Case 9 : Month_disp = "ceЅїЗІpЗ" 'сентября
Daysmonth = 30
Case 10 : Month_disp = "oєїЗІpЗ" 'октября
Daysmonth = 31
Case 11 : Month_disp = "ЅoЗІpЗ" 'ноября
Daysmonth = 30
Case 12 : Month_disp = "гeєaІpЗ" 'декабря
Daysmonth = 31
End Select
End Sub
Getdatetime: 'подпрограмма чтения данных из DS1307
'*******************************************************************************
I2cstart ' I2C START
I2cwbyte Ds1307w ' константа адрес записи DS1307
I2cwbyte 0 ' начальный адрес в DS1307
I2cstart ' I2C START
I2cwbyte Ds1307r ' константа адрес чтения DS1307
I2crbyte _sec , Ack ' чтение значения СЕКУНД
I2crbyte _min , Ack ' чтение значения МИНУТ
I2crbyte _hour , Ack ' чтение значения ЧАСА
I2crbyte Weekday , Ack ' чтение значения НЕДЕЛИ
I2crbyte _day , Ack ' чтение значения ДНЯ
I2crbyte _month , Ack ' чтение значения МЕСЯЦА
I2crbyte _year , Nack ' чтение значения ГОДА
I2cstop 'I2C STOP
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) 'преобразуем все переменные в десятичный вид
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year) 'преобразуем все переменные в десятичный вид
Return 'возврат из подпрогрммы
Setdate: 'подпрограмма записи даты в DS1307
'*******************************************************************************
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year) 'преобразуем все переменные в двоичный вид
I2cstart ' I2C START
I2cwbyte Ds1307w ' константа адрес записи DS1307
I2cwbyte 4 ' начальный адрес в DS1307
I2cwbyte _day ' запись ДЕНЬ
I2cwbyte _month ' запись МЕСЯЦ
I2cwbyte _year ' запись ГОД
I2cstop 'I2C STOP
Return 'возврат из подпрогрммы
Settime: 'подпрограмма записи времени в DS1307
'*******************************************************************************
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour) 'преобразуем все переменные в двоичный вид
I2cstart ' I2C START
I2cwbyte Ds1307w ' константа адрес записи DS1307
I2cwbyte 0 ' начальный адрес в DS1307
I2cwbyte _sec ' запись СЕКУНД
I2cwbyte _min ' запись МИНУТ
I2cwbyte _hour ' запись ЧАСА
I2cstop 'I2C STOP
Return 'возврат из подпрогрммы
Weekdays:
'*******************************************************************************
Data "ЁoЅeг. " 'Понед.
Data "BїopЅёє" 'Вторник
Data "Cpeгa " 'Среда
Data "«eїіepґ" 'Четверг
Data "ЁЗїЅёеa" 'Пятница
Data "CyІІoїa" 'Суббота
Data "Bocєp. " 'Воскр.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт сен 06, 2011 00:07:51
Alex_Megavolt_79
max50 так мы запускаем софтовые, либо внутренние на основе таймера 2 либо внешние на ds при этом мы используем стандартные команды по работе с часами, в том числе и вычисление дня недели. Я смотрел код из хелпа и пробовал если не конфигурировать часы как софтовые, то и на командах по работе с часами баском выдаёт ошибки. Вот и заинтересовался как делает баском при вычислении дня недели, чтоб написать свой кусок кода по аналогии.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт сен 06, 2011 18:16:41
max50
Alex_Megavolt_79 писал(а):пробовал если не конфигурировать часы как софтовые, то и на командах по работе с часами баском выдаёт ошибки
Странно! Как же работает у меня?
Код: Выделить всё
Config Sda = Portb.1 'на пин b1 подключена линия Sda
Config Scl = Portb.2 'на пин b2 подключена линия Scl
Config Clock = User 'работа с DS1307
Const Ds1307w = &HD0 'константа адреса записи DS1307
Const Ds1307r = &HD1 'константа адреса чтения DS1307
Config Date = Dmy , Separator = . 'настраиваем способ отображения даты ДДММГГ, разделитель точка
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт сен 06, 2011 20:37:59
Alex_Megavolt_79
Хех, а Config Clock = User вот этой командой запускаете софтовые часы. Уберите эту строчку и пойдут ошибки.