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

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

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

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



I2C CLOCK+ALARM

Сообщений 301 страница 326 из 326

301

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

Пора переходить на TQFP и SMD.

Я имел ввиду ATTINY88. Там добавлен ПОРТА 4 вывода. И цена существенно дешевле Меги8.

0

302

да, дейситтна, есть такое. спасибо

0

303

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

ATTINY88. Там добавлен ПОРТА 4 вывода. И цена существенно дешевле Меги8.

На Али они дороже меги 8, особенно в DIP корпусе. И есть только у нескольких продавцов. :dontknow:

0

304

Пётр
в DIP чуть дороже меги, а в QFP в чипе&дипе чуть не вдвое дешевле

0

305

Не знаю, как в России, а в Украине Mega8 - 25 грн, а Attiny88 -17 грн. По крайней мере по такой цене я брал последний раз. Имеется ввиду корпус TQFP 32. А дип корпус минимум в полтора раза дороже.

0

306

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

Не знаю, как в России, а в Украине Mega8 - 25 грн, а Attiny88 -17 грн. По крайней мере по такой цене я брал последний раз. Имеется ввиду корпус TQFP 32. А дип корпус минимум в полтора раза дороже.

Практически так же и в РФ.
Зависит от места, где брать.

Последний раз (в сентябре) ATMega16 в TQFP-44 брались за 82р...

0

307

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

Пётрв DIP чуть дороже меги, а в QFP в чипе&дипе чуть не вдвое дешевле

ЧИП и ДИП последнее время стараюсь не пользовать...
Разве только если нигде нужного не найду...
Дороговат продаванчик, однако... ;)

0

308

ну раз уж вы решили устроить из темы одесский Привоз, то хоть расскажите, где нонеча комплектуху брать модно. я беру в ЧипДип или Вольтмастере (у меня там карточка на 10%) или еще в одном сикретном магазине (там ГРИ можно рублей по 50-80 брать! обалдеть Советский Союз!)
на Али.... это если только конкретную марку знать, иначе утонешь в "трудностях перевода"...

0

309

и тишинаа.... рыбных мест никто не сдаст... :(

0

310

Да, вообще то форум по другому называется. Могу дать адреса украинских магазинов. А оно вам надо?

0

311

да нет наверное, не надо. закроем тему.

0

312

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

рыбных мест никто не сдаст...

https://ru.aliexpress.com/

0

313

Поздравляю всех участников и гостей форума с наступившим 2018 НОВЫМ ГОДОМ.
Здоровья Вам, счастья, мирного неба. Чтобы все Ваши проекты были успешными. Представляю новый upgrade этих часов.
Наконец-то мне удалось подружить эти часы с радиомодулем RDA5807.
Теперь при срабатывании будильника включается радио, а не противная пищалка. И будет играть, пока не выключите кнопкой ALARM. Так же радио можно включить в любое время, просто послушать. Работает приемник чисто, намного лучше того, что стоял у меня до этого на CD2003.
Подробное описание модуля и команд можно найти здесь:
Ссылка
Управление часами осталось без изменения.
PORTB.5 = SET
PORTB.4 = MODE
PORTB.3 = ALARM
Управление приемника:
PORTC.2 = ON / OF
PORTC.3 = SCAN +
PORTC.0 = VOL -
PORTC.1 = VOL +
Кнопок можно сделать больше, но я исходил из возможностей своего корпуса. А там их всего три. ON / OFF пришлось ставить отдельно.
При нажатии соответствующей кнопки на 1 сек загорается частота или уровень громкости, а потом часы возвращаются к индикации времени. Приемник продолжает работать. При выключении приемника последние частота и громкость записываются в EEPROM.
Питание RDA5807 3,3в, поэтому нужно ставить стабилизатор 1117-3,3В, или питать всю схему от этого напряжения. При питании от 5В нужно делать согласование уровней SDA и SCL. Я делал на двух транзисторах. Базы через 1кОм на +3,3В, коллекторы к выводам SDA и SCL контроллера. PULLUP по 10кОм. Эмиттеры к соответствующим выводам модуля.
PULLUP тоже по 10кОм.

Код ОА

$regfile = "m8def.dat"                                      '  Atmega 8
$crystal = 8000000                                          '  8, 000 000 мегагерц
$lib "mcsbyte.lbx"                                          '       библиотеки
$lib "ds1307clock.lib"
Config Sda = Portc.4 : Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' пины для подключения Ds1307
Const Ds1307r = &HD1
Config Clock = User
Config Portb = Output : Config Portd = Output              ' конфигурируем порты на выход к которым подключен семисегментник
Config Pinc.2 = Input : Portc.2 = 1                         ' Fm_on / Fm_off
Config Pinb.4 = Input : Portb.4 = 1                         'MODE
Config Pinb.5 = Input : Portb.5 = 1                         'SET
Config Pinb.3 = Input : Portb.3 = 1                         'ALARM
Config Pinc.0 = Input : Portc.0 = 1                         'VOL-
Config Pinc.1 = Input : Portc.1 = 1                         'VOL+
Config Pinc.3 = Input : Portc.3 = 1                         'SCAN+
Mute Alias Portb.2
Mute = 0
Config Debounce = 250
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(4) As Integer , Viv_peremennaya As Integer , Chasi As Byte
Dim Minuti As Byte , Secundi As Byte , Chasi_alarm As Byte , Minuti_alarm As Byte , Weekday As Byte , Clock_flag As Byte , Dp_flag1 As Bit
Dim Dp_flag2 As Bit , Dp_flag3 As Bit , Dp_flag4 As Bit , Migalka As Integer , Den As Byte , Mesjac As Byte , God As Byte , Set_flag As Byte
Dim Alarm_flag As Byte , Stop_alarm As Byte , Nosave_time As Byte , Flag_fm As Bit       ' задаем переменные
Dim T As Integer , T_t As Integer , N As Bit , Minus As Bit , P As Byte , _print As Word
'RDA5807
Const Fmin = 880
Const Fmax = 1080
Const Adress = &H20
Const Adressread = &H21
Dim Byte0 As Word
Dim Datalo0 As Byte
Dim Datahi0 As Byte
Dim Datalo1 As Byte
Dim Datahi1 As Byte
Dim Freq_1 As Word
Dim Volume As Byte
Dim Volume_ee As Eram Byte
Dim Freq_ee As Eram Word
Readeeprom Chasi_alarm , 10                                 'читаем  из еепрома во сколько часов должен сработать будильник
Readeeprom Minuti_alarm , 20                                'читаем  из еепрома во сколько минут должен сработать будильник
Readeeprom Alarm_flag , 30                                  'читаем  из еепрома должен ли вообще сработать будильник
Freq_1 = Freq_ee
If Freq_1 > Fmax Then Freq_1 = 1022                         ' при первом включении частота 102,2 МГц
Volume = Volume_ee
If Volume > 15 Then Volume = 12                             ' при первом включении звук = 12
A Alias Portd.5 : B Alias Portd.2 : C Alias Portd.4 : D Alias Portb.6 : E Alias Portd.0 : F Alias Portd.1 : G Alias Portd.3 : Dp Alias Portb.7
Dig4 Alias Portd.6 : Dig3 Alias Portd.7 : Dig2 Alias Portb.0 : Dig1 Alias Portb.1       ' тут вписываем порты к которым подключены общие провода каждой цифр

For X = 1 To 4                                              ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались ноли
Chislo(x) = 11
Next
Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse :   ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer1 = Timer , Prescale = 8 : On Timer1 Bootons :  ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0 : Enable Timer1           ' разрешаем прерывания и таймер 0
Start Timer0 : Start Timer1
Do                                                          'Основной режим работы. Отображение времени

Times:
'*******************************************************************************
' Запрос по i2c времени и пересчет его в четырех значное число а также мигалка двух средних точек (22:03)

For X = 1 To 40
Clock_flag = 1
Gosub Getdatetime

Migalka = Secundi Mod 2
'Migalka = Secundi And 1                                                                    можно так
If Migalka <> 0 Then
Dp_flag2 = 1
Dp_flag3 = 1
Dp_flag4 = 0
Else
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
If Alarm_flag = 1 Then Dp_flag3 = 1
Dp_flag1 = 0
Waitms 80
Next
'*******************************************************************************
Loop
'*******************************************************************************
Termometr:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Bitwait Pinb.4 , Set
Config 1wire = Portc.1
' Запрос с DS18b20 Температуры
Clock_flag = 0
Disable Interrupts
1wreset
If Err = 1 Then
N = 1
Else
N = 0
End If
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Enable Interrupts
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
Disable Interrupts
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
T = 1wread(2)                                               ' Читаем два байта
Minus = T.15
Enable Interrupts
T = Abs(t)
T = T * 10
T = T / 16
If T = 0 Then Minus = 0
If N = 0 Then
T_t = T
Chislo(1) = 12
Dp_flag1 = 1
For P = 2 To 4
If Minus = 1 And T >= 100 Then                             ' если температура меньше - 10, то без десятых
T_t = T_t / 10
Chislo(p) = T_t Mod 10
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Else
Chislo(p) = T_t Mod 10
T_t = T_t / 10
Dp_flag2 = 0
Dp_flag3 = 1
Dp_flag4 = 0
End If
If T < 100 Then Chislo(4) = 11
If Minus = 1 Then Chislo(4) = 10

Next P

Else
Chislo(1) = 13 : Chislo(2) = 13 : Chislo(3) = 14 : Chislo(4) = 10
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
Waitms 1800
Set Clock_flag
Config Pinc.1 = Input : Portc.1 = 1
Return

'*******************************************************************************
' Запрос текущего числа и месяца и установка точки посредине между числом и месяцем. Пересчет даты в четырех значное число (28.12)
Clock_flag = 1
Stop Timer0
Viv_peremennaya = Den * 100
Viv_peremennaya = Viv_peremennaya + Mesjac
Start Timer0
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 1
Dp_flag4 = 0
Waitms 700

'*******************************************************************************
'работа с  ds1307
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
Secundi = Makedec(_sec) : Minuti = Makedec(_min) : Chasi = Makedec(_hour)

   Den = Makedec(_day) : Mesjac = Makedec(_month) : God = 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
'*******************************************************************************

'*************************Вывод на индикатор************************************
Pulse:
Stop Timer0                                                 ' останавливаем таймер 0

If Clock_flag = 1 Then                                     ' индикатор показывает время
Chislo(4) = Chasi / 10
Chislo(3) = Chasi Mod 10
Chislo(2) = Minuti / 10
Chislo(1) = Minuti Mod 10
If Chasi < 10 Then Chislo(4) = 11
End If
If Clock_flag = 2 Then                                      ' индикатор показывает частоту
T_t = Freq_1
   For P = 1 To 4
Chislo(p) = T_t Mod 10
T_t = T_t / 10
If Freq_1 < 1000 Then Chislo(4) = 11
Next P
Set Dp_flag1 : Reset Dp_flag2 : Reset Dp_flag3 : Reset Dp_flag4
End If
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr W : If W > 4 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
Case 3 :
If Dp_flag3 = 1 Then Reset Dp Else Set Dp
Set Dig3
Case 4 :
If Dp_flag4 = 1 Then Reset Dp Else Set Dp
Set Dig4
End Select

If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then
  If Stop_alarm = 1 Then Stop_alarm = 0
Elseif Stop_alarm = 2 Then
  Stop_alarm = 1
End If
If Stop_alarm = 0 And Pinb.3 = 0 Then Stop_alarm = 2
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...)

'If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then Alarm_flag = 0

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
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '10           "-"
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '11           ""
Data 0 , 1 , 1 , 0 , 0 , 0 , 1                              '12           "C"
Data 1 , 1 , 1 , 1 , 0 , 1 , 0                              '13           "r"
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '14           "E"
Data 0 , 1 , 1 , 1 , 0 , 0 , 1                              '15           "Г"
Data 0 , 0 , 1 , 1 , 0 , 0 , 0                              '16           "P"
'( ' для индикатора с общим минусом
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                              '10           "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '11           "" пусто
Data 1 , 0 , 0 , 1 , 1 , 1 , 0                              '12           "C"
Data 1 , 1 , 0 , 0 , 1 , 1 , 1                              '13           "P"
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '14           "t"
')

'*****************************Работа с кнопками и будильником*******************
Bootons:
Stop Timer1
If Pinc.2 = 0 And Flag_fm = 0 Then Gosub Rda5807_init       ' если приемник выключен, то он включается
If Pinc.2 = 0 And Flag_fm = 1 Then Gosub Rda5807_stby       ' если приемник включен, то он выключается
If Pinb.3 = 0 Then Gosub Alarm
If Pinb.5 = 0 Then Gosub Set_booton
If Pinb.4 = 0 Then Gosub Termometr
' кнопки управления приемника работают только после включения приемника
If Pinc.0 = 0 Or Pinc.1 = 0 And Flag_fm = 1 Then Gosub Set_volume       ' регулировка громкости
If Pinc.3 = 0 And Flag_fm = 1 Then Gosub Scan               ' настройка приемника

If Stop_alarm = 0 Then
If Alarm_flag = 1 Then                                      ' проверяем включен ли будильник
If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Flag_fm = 0 Then       ' проверяем надо ли играть мелодию будильника

Gosub Rda5807_init                                         'пищим
End If
End If
End If
Start Timer1

Return

Alarm:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Bitwait Pinb.3 , Set
If Stop_alarm = 0 Then : Stop_alarm = 2
Elseif Alarm_flag = 1 And Mute = 0 Then : Alarm_flag = 0 : Else : Alarm_flag = 1 : End If       ' включаем / отключаем будильник (можно только во время когда будильник не должен звонить)
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Writeeeprom Alarm_flag , 30                                 ' записываем в eeprom вкл/откл будильник
Goto Rda5807_stby
Return

'*****************************вывод меню настройки******************************
Set_booton:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Bitwait Pinb.5 , Set
Set_flag = 1
Clock_flag = 0
                                        ' ждем пока не отпустим кнопку настроек
  Do                                                        ' цикл настройки часов
    Chislo(1) = 11                                          ' включаем первые две цифры на которых показаны текущие часы суток, второй кнопкой их можно прибавлять
    Chislo(2) = 11
    Chislo(3) = Chasi Mod 10
    Chislo(4) = Chasi / 10
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Chasi : Set Nosave_time : End If
    If Chasi >= 24 Then Chasi = 0
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set                                        ' ждем пока не отпустят кнопку настроек

  Do                                                        ' цикл настройки минут
                                         ' включаем вторые две цифры с минутами -||-
    Chislo(1) = Minuti Mod 10
    Chislo(2) = Minuti / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Minuti : _sec = 0 : Set Nosave_time : End If
    If Minuti >= 60 Then Minuti = 0
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  If Nosave_time = 1 Then                                   ' смотрим было ли изменение времени, если да то записываем установленное время по i2c
  _hour = Chasi
  _min = Minuti
  Gosub Settime                                             ' устанавливаем по i2c текущее время
  Else
  Reset Nosave_time
  End If

  Do                                                        ' цикл настройки номера месяца
                                          ' включаем первые две цифры с днем месяца -||-
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Den Mod 10
    Chislo(4) = Den / 10
    Reset Dp_flag1
    Reset Dp_flag3
    Set Dp_flag2
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Den : Set Nosave_time : End If
    If Den >= 32 Then Den = 1
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do                                                        ' цикл настройки дня месяца  ' включаем вторые две цифры с номером месяца -||-

    Chislo(1) = Mesjac Mod 10
    Chislo(2) = Mesjac / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Reset Dp_flag1
    Reset Dp_flag3
    Set Dp_flag2
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Mesjac : Set Nosave_time : End If
    If Mesjac >= 13 Then Mesjac = 1
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do                                                        ' включаем первые две цифры с номером года 20 и вторые две, которые можно изменять 10. все изменяется от 2010 до 2099

    Chislo(1) = God Mod 10
    Chislo(2) = God / 10
    Chislo(3) = 0
    Chislo(4) = 2
    Reset Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr God : Set Nosave_time : End If
    If God >= 100 Then God = 10
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

If Nosave_time = 1 Then
_day = Den
_month = Mesjac
_year = God
Gosub Setdate                                               ' устанавливаем по i2c текущую дату не зависимо меняли ее или нет
Else
  Reset Nosave_time
End If

  Do                                                        ' часы будильника
    If Chasi_alarm > 23 Then Chasi_alarm = 0
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Chasi_alarm Mod 10
    Chislo(4) = Chasi_alarm / 10
    Set Dp_flag3
    Reset Dp_flag2
    Reset Dp_flag1
    Reset Dp_flag4
    If Pinb.4 = 0 Then : Incr Chasi_alarm : Set Nosave_time : End If
     If Chasi_alarm > 23 Then Chasi_alarm = 0
    Waitms 100
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do
                                              ' минуты будильника
    If Minuti_alarm > 59 Then Minuti_alarm = 0
    Chislo(1) = Minuti_alarm Mod 10
    Chislo(2) = Minuti_alarm / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Set Dp_flag3
    Reset Dp_flag2
    Reset Dp_flag1
    Reset Dp_flag4
    If Pinb.4 = 0 Then : Incr Minuti_alarm : Set Nosave_time : End If       ' записываем в eeprom вкл/откл будильник : End If
     If Minuti_alarm > 59 Then Minuti_alarm = 0
    Waitms 100
  Loop Until Pinb.5 = 0

If Nosave_time = 1 Then : Writeeeprom Chasi_alarm , 10 : Writeeeprom Minuti_alarm , 20 : Reset Nosave_time : End If       ' сохраняем в eeprom часы и минуты будильника
Set_flag = 0                                                ' флаг окончания настройки
Bitwait Pinb.5 , Set
Start Timer1
Goto Times:                                                 ' переход к отображению времени

Return

'ИНИЦИАЛИЗАЦИЯ RDA5807
Rda5807_init:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Bitwait Pinc.2 , Set
Set Flag_fm
Clock_flag = 2
Set_flag = 0
  I2cinit
  I2cstart
  I2cwbyte Adress
  '02
  I2cwbyte &B11110010                                       ' вых.вкл;нор.гр;моно;бас;RCLK раб.всегда;поиск вниз;поиск стоп
  I2cwbyte &B00000101                                       ' ост.поиск конец;кварц32768;RDSвыкл;улуч.чуств.;нет сброс настр.;приемник вкл
  '03
Byte0 = Freq_1 - 870
  Byte0 = Byte0 / 4
  I2cwbyte Byte0                                            ' запись сохр. частоты в RDA  (старшие биты)
Byte0 = Freq_1 - 870
Byte0 = Byte0 Mod 4
Byte0 = Byte0 * 64
Set Byte0.4                                                 ' запись сохр. частоты в RDA (младшие биты)
  I2cwbyte Byte0
  '04
  I2cwbyte &B00000000
  I2cwbyte &B01000000
  '05
  I2cwbyte &B10001000
  Byte0 = &B10000000 + Volume
  I2cwbyte Byte0
  I2cstop
   Set Mute
  Wait 1

Readword:                                                  ' чтение данных из RDA
    I2cinit
    I2cstart
    I2cwbyte Adress                                         'read
    I2cwbyte &H0A                                           ' b  Regno = &B00001010
    Waitms 50
    I2cstart
    I2cwbyte Adressread
    I2crbyte Datahi0 , Ack                                  ' RDSR STC  SF RDSS  BLK_E  ST  READCHAN[9:8]
    I2crbyte Datalo0 , Ack                                  'READCHAN[7:0]
    I2crbyte Datahi1 , Ack                                  ' 7...1=RSSI[6:0]   0=FM TRUE
    I2crbyte Datalo1 , Nack
    I2cstop
  Return

      Scan:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Bitwait Pinc.3 , Set
     I2cinit
  I2cstart
  I2cwbyte Adress
  '02
  I2cwbyte &B11010011                                       'направление поиска вверх ; 11000001 - вниз
  I2cwbyte &B00000101
  I2cstop
Gosub Readword
    While Datahi0.6 = 0
      Waitms 100
      Gosub Readword
    Wend
    Freq_1 = Datalo0 + 870
    Clock_flag = 2
    Wait 1
     Return

Rda5807_stby:                                               ' выключение приемника
    Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
    Bitwait Pinc.2 , Set
   Reset Flag_fm
   If Freq_1 <> Freq_ee Then Freq_ee = Freq_1               ' запись новой частоты в EEPROM
    If Volume <> Volume_ee Then Volume_ee = Volume          ' запись новой громкости в EEPROM
   I2cinit
  I2cstart
  I2cwbyte Adress
  '02
  I2cwbyte &B00100000                                       'HD2
  I2cwbyte &B00000000                                       'H8D
  I2cstop
  Reset Mute
Return

   Set_volume:                                              ' регулировка громкости
   Clock_flag = 3
        While Pinc.0 = 0 Or Pinc.1 = 0
            If Pinc.0 = 0 Then Decr Volume
           If Pinc.1 = 0 Then Incr Volume
           If Volume > 200 Then Volume = 0
           If Volume > 15 Then Volume = 15
                   Disable Interrupts
                   I2cstart
                   I2cwbyte &H22
                   Enable Interrupts
                   I2cwbyte &B00000101                      'H02
                   I2cwbyte &B10001000                      'H08
                   Byte0 = &B10000000 + Volume
                   I2cwbyte Byte0
                   I2cstop
      Chislo(4) = 15 : Chislo(3) = 16 : Chislo(2) = Volume / 10 : Chislo(1) = Volume Mod 10
     If Volume < 10 Then Chislo(2) = 11
      Reset Dp_flag1 : Reset Dp_flag2 : Set Dp_flag3 : Reset Dp_flag4
       Waitms 200
      Wend
    Wait 1
    Return

'*******************************************************************************

И несколько фоток.
фото1
фото2
фото3
фото4

Блин, расскажите, пожалуйста, почему у меня картинки не загружаются, а только ссылки.

Отредактировано Andrusha (2018-01-07 16:01:04)

+3

314

Andrusha
ссупер! давно глаз на этот радиомодуль положил, а все готовое  :cool:
схему или симуляцию не скинете? при питании всей схемы от 3.3В что творится с индикацией? там вроде ток порта до 10мА ограничивается?

0

315

Схемы нет, все расписано в коде. Симуляции нет, потому что я не нашел модель модуля для протеуса. Я просто загружаю прошивку в проект часов, предварительно дорисовав недостающие кнопки. Все работает, только при сканировании сразу высвечивается частота 112,5. Часы от 3,3 не питал, делал согласование уровней до 5 вольт. Но я думаю, если питать контроллер от 3х вольт, а ключи индикаторов запитать от 5 вольт изменений не будет. Максимальный ток порта, по моему 40 или 20 не помню. Вы как то писали, что не хватает вам ножек контроллера. В п\п Termometr посмотрите использование PORTC.1. Перед измерением

Код:
 Config 1wire = Portc.1

после измерения

Код:
Config Pinc.1 = Input : Portc.1 = 1

Так порт может быть и входом и выходом одновременно. Поэволяет сэкономить кучу ног.

0

316

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

0

317

Нет, не планировал. Для меня это в первую очередь будильник. Последняя прослушанная станция сохраняется.

0

318

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

запись найденных станций в память не планировали?

Кому интересно, вот ТУТ все есть. Даже исходники.

0

319

Andrusha
спасибо, добрый человек!
ЗЫ а подпись неплохо было бы как-то выделять или отделять. а то читается зачастую вместе с текстом  :D

0

320

коллеги, а подскажите плиз вот что: можно ли как-то приколхозить мощные индикаторы (6-7В) на МАХ7219? в даташите показан способ, но он больно дорогой и многокорпусной выходит. есть ли способ попроще или надо другой драйвер искать?

0

321

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

коллеги, а подскажите плиз вот что: можно ли как-то приколхозить мощные индикаторы (6-7В) на МАХ7219?

ULN2003 или 2803 не годятся ?

0

322

Nord
а я знаю? я поэтому и спрашиваю! ну и как их поженить с 7219 - не представляю... там же и катоды и сегменты на драйвер подключаются. опять же ULN-ка по-моему инвертирует сигнал

0

323

UDN2981

0

324

Каримов
отлично, супер, неинвертирующие ключи. в связке с МАХ7219 их ставить и на сегменты и на катоды?

0

325

Ставь на сегменты. А на знакоместа-посмотри по току. Может и не надо будет.

0

326

да ток-то почти стандартный, 20мА. напряжение от 6.6 до 7.5 В... но спасибо, буду попробовать

0