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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Powersave - энерго сбережение


Powersave - энерго сбережение

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

1

Доброе время суток всем! Форумы просмотрел что попалось попробовал и все же не могу сделать. А нужно для максимального сбережения засыпать на 30сек - 5мин. Готовый код отлично работает на "собаке" .

Код:
$regfile = "m88def.dat"             ' Нужно для  48\88\328
$crystal = 8000000
$baud = 19200
$hwstack = 40
$swstack = 20
$framesize = 40



$prog &HFF , &H62 , &HDF , &HFF                             ' generated. Take care that the chip supports all fuse bytes.
  Prr = &B11101010
 Acsr = &B10010001


Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte)
Declare Sub W_register(byval C_bytes As Byte)

'=== Constante ===
'Define nRF24L01 interrupt flag's
Const Idle_int = &H00                                       'Idle, no interrupt pending
Const Max_rt = &H10                                         'Max #of Tx Retrans Interrupt
Const Tx_ds = &H20                                          'Tx Data Sent Interrupt
Const Rx_dr = &H40                                          'Rx Data Received

'SPI(nRF24L01) commands

Const Read_reg = &H00                                       'Define Read Command To Register
Const Write_reg = &H20                                      'Define Write Command To Register
Const Rd_rx_pload = &H61                                    'Define Rx Payload Register Address
Const Wr_tx_pload = &HA0                                    'Define Tx Payload Register Address
Const Flush_tx = &HE1                                       'Define Flush Tx Register Command
Const Flush_rx = &HE2                                       'Define Flush Rx Register Command
Const Reuse_tx_pl = &HE3                                    'Define Reuse Tx Payload Register Command
Const Nop_comm = &HFF                                       'Define No Operation , Might Be Used To Read Status Register
'SPI(nRF24L01) registers(addresses)
Const Config_nrf = &H00                                     'Config' register address
Const En_aa = &H01                                          'Enable Auto Acknowledgment' register address
Const En_rxaddr = &H02                                      'Enabled RX addresses' register address
Const Setup_aw = &H03                                       'Setup address width' register address
Const Setup_retr = &H04                                     'Setup Auto. Retrans' register address
Const Rf_ch = &H05                                          'RF channel' register address
Const Rf_setup = &H06                                       'RF setup' register address
Const Status = &H07                                         'Status' register address
Const Observe_tx = &H08                                     'Observe TX' register address
Const Cd = &H09                                             'Carrier Detect' register address
Const Rx_addr_p0 = &H0A                                     'RX address pipe0' register address
Const Rx_addr_p1 = &H0B                                     'RX address pipe1' register address
Const Rx_addr_p2 = &H0C                                     'RX address pipe2' register address
Const Rx_addr_p3 = &H0D                                     'RX address pipe3' register address
Const Rx_addr_p4 = &H0E                                     'RX address pipe4' register address
Const Rx_addr_p5 = &H0F                                     'RX address pipe5' register address
Const Tx_addr = &H10                                        'TX address' register address
Const Rx_pw_p0 = &H11                                       'RX payload width, pipe0' register address
Const Rx_pw_p1 = &H12                                       'RX payload width, pipe1' register address
Const Rx_pw_p2 = &H13                                       'RX payload width, pipe2' register address
Const Rx_pw_p3 = &H14                                       'RX payload width, pipe3' register address
Const Rx_pw_p4 = &H15                                       'RX payload width, pipe4' register address
Const Rx_pw_p5 = &H16                                       'RX payload width, pipe5' register address
Const Fifo_status = &H17                                    'FIFO Status Register' register address


Dim D_bytes(33) As Byte , B_bytes(33) As Byte               'Dim the bytes use for SPI, D_bytes = outgoing B_bytes = Incoming
Dim Temp As Byte , W As Word
Dim Packet_count As Byte
Dim Term As Word , Term_t As Word , T As Byte , Tt As Dword
Dim Ubat As Word
Dim Ux As Dword
Dim Ubat_(2) As Byte At Ubat Overlay
Dim Ter As Integer
Dim Term_(2) As Byte At Ter Overlay
Config Portd.5 = Output : U_24l01 Alias Portd.5 : Set U_24l01


'=== Config hardware ===
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 1

'Software SPI is NOT working with the nRF24L01, use hardware SPI only, but the SS pin must be controlled by our self

Config Pind.7 = Output                                      'CE pin is output
Config Pinb.2 = Output                                      'SS pin is output
Config Pind.6 = Input                                       'IRQ pin is input

 Ce Alias Portd.7
 Ss Alias Portb.2
 Irq Alias Pind.6


Config Portc.3 = Output : U_term Alias Portc.3



Spiinit                                                     'init the spi pins

Set Ce
Waitms 10                                                   'Wait a moment until all hardware is stable
Reset Ce                                                    'Set CE pin low
Reset Ss                                                    'Set SS pin low (CSN pin)


 D_bytes(1) = Flush_tx                                      'Flush the TX_fifo buffer
Call W_register(1)
 D_bytes(1) = Write_reg + Status                            'Reset the IRQ bits
 D_bytes(2) = &B00110000
Call W_register(2)


Do


Set U_term                                                  'включаем  датчик температуры

Config Adc = Single , Prescaler = 128 , Reference = Internal

 Start Adc
Term = Getadc(2)
For T = 1 To 30                                             'Цикл измерения температуры
Term = Getadc(2)
Term_t = Term_t + Term
Next
Reset U_term
Term = Term_t / 30

   Ux = Term * 1059
   Tt = Ux / 1000
   Term = Tt
   Ter = Term - 500


Config Adc = Single , Prescaler = 128 , Reference = Avcc    'конфигурация АЦП
   Ubat = Getadc(14)
  'Ux = 112640 / Ubat
   Ux = 117000 / Ubat
   'Ux = 1126.4 / Ubat
   Ubat = Ux
Config Adc = Single , Prescaler = 128 , Reference = Internal       'переключаем опорку, что бы конденсатор на Aref успел разрядиться
Stop Adc



Gosub Setup_tx                                              'Setup the nrf24l01 for TX
D_bytes(1) = Wr_tx_pload                                    'Put 5 bytes in the TX pload buffer
D_bytes(2) = Ter                                           'Байт 2
D_bytes(3) = Term_(1)                                       'Байт 3
D_bytes(4) = Term_(2)                                       'Байт 4
D_bytes(5) = Ubat
D_bytes(6) = 1'Packet_count                                   'Byte 5
Call W_register(6)                                          'Write 6 bytes to register


Waitms 2

Set Ce                                                      'Set CE for a short moment to transmit the fifo buffer
Waitms 1                                                    '
Reset Ce                                                    '
Waitms 100                                                  'Some delay to read the output on the terminal, line can be removed for max. speed

 W = 0                                                      'Counter for time out


Config Watchdog =8192
Start Watchdog
Reset U_24l01
Reset U_term
Portd = 0 : Portc = 0 : Portb = 0
Adcsr = &B00010000


Powerdown                                          'Спящий режим   8сек.


Loop


'=== Sub routines ===
Sub W_register(byval C_bytes As Byte)                       'Write register with SPI
Reset Ss                                                    'Manual control SS pin, set SS low before shifting out the bytes
 Spiout D_bytes(1) , C_bytes                                'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written
Set Ss                                                      'Set SS high
End Sub

Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte       'C_bytes = Count_bytes, number off bytes to be read
Reset Ss                                                    'Manual controle SS pin, set low before shifting in/out the bytes
 Spiout Command , 1                                         'First shiftout the register to be read
 Spiin B_bytes(1) , C_bytes                                 'Read back the bytes from SPI sended by nRF20L01
Set Ss                                                      'Set SS back to high level
End Sub




Setup_tx:                                                   'Setup for TX

 D_bytes(1) = Write_reg + Tx_addr                           'TX adress
 D_bytes(2) = &H34
 D_bytes(3) = &H43
 D_bytes(4) = &H10
 D_bytes(5) = &H10
 D_bytes(6) = &H01
Call W_register(6)
 D_bytes(1) = Write_reg + Rx_addr_p0                        'RX adress for pipe0
 D_bytes(2) = &H34
 D_bytes(3) = &H43
 D_bytes(4) = &H10
 D_bytes(5) = &H10
 D_bytes(6) = &H01
Call W_register(6)
 D_bytes(1) = Write_reg + En_aa                             'Enable auto ACK for pipe0
 D_bytes(2) = &H01
Call W_register(2)
 D_bytes(1) = Write_reg + En_rxaddr                         'Enable RX adress for pipe0
 D_bytes(2) = &H01
Call W_register(2)
 D_bytes(1) = Write_reg + Rf_ch                             'Set RF channel
 D_bytes(2) = 40
Call W_register(2)
 D_bytes(1) = Write_reg + Rf_setup                          'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on
 D_bytes(2) = &H06
Call W_register(2)
 D_bytes(1) = Write_reg + Config_nrf                        'Setup CONFIG-> PRX=0(TX_device), PWR_UP=1, CRC 2bytes, Enable CRC
 D_bytes(2) = &H0E
Call W_register(2)

Return

Отредактировано qewin (2019-04-24 18:00:56)

0

2

Здесь или здесь или здесь

0

3

sasha_1973 Спасибо . Работаю по первой ссылке , Nord подсказал на днях. Все работает хорошо и время можно задавать. Сбережение , кое что добавил что-то убрал сооставляет пока на 88 меге в спячке 10-20 мка, но , у меня затык может не туда  (    'Делаете то, что Вам надо ) запускаю , зажимает или обрубает регистры не правильно считывает температуру .! А, еще хотел спросить по даташиту 48 - 88/168/328 схожи на ней "сбер" получается  ~ 1 мка , но из сна не выходит  :no:

Отредактировано qewin (2019-04-23 17:56:21)

0

4

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

сооставляет пока на 88 меге в спячке 10-20 мка


Должно быть ~ 1 микро A !

Исходник для nrf24l01

0

5

sasha_1973 Спасибо !  Посмотрел, но, как бы для моего случая не увидел ничего, разве еще посмотреть софтовые часы . Исходник что ты дал работает, термодатчик на  TC1047A  сидит на " Portc ". Ерунда заключается в том что цикл измерение - передача - засыпание, крутится не соответствующая температура а одно и тоже  16;-20;-5.5;24;39;2.7;10  и по кругу   :mybb: . Хотя  волтаж батарейки все правильно.

0

6

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

Ерунда заключается в том что цикл измерение - передача - засыпание, крутится не соответствующая температура а одно и тоже  16;-20;-5.5;24;39;2.7;10  и по кругу

А если сделать цикл "просыпание - пауза - измерение - передача - засыпание" ?
Датчику ведь тоже очухаться ото сна надо... ;)

0

7

Nord, Доброе время суток! Пробовал  выставлять, куда могла моя не образованность позволяла  :shine: , получается эффект заторможенности но глюк не пропадает .

Отредактировано qewin (2019-04-24 18:10:08)

0

8

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

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

Смотря насколько "затормаживать"... ;)
Я бы сразу перед измерением поставил.

Надо еще учесть, что АЦП тоже не "всегда готов", ему тоже нужно время, для него же после просыпания это - первое преобразование...
Думаю, Waitus 3...5 будет "за глаза", да даже и 10 мксек будет малозаметно.

Отредактировано Nord (2019-04-24 18:21:18)

0

9

Есть еще вариант - сделать несколько "замеров" подряд и использовать максимальное значение из полученных.
Это будет быстрее, чем с задержками.

0

10

Я до секунды ставил, но делает измерения отправляет и должен уснуть , но  нет, каждая дополнительная задержка увеличивает время перед сном  :no: !

Отредактировано qewin (2019-04-24 18:44:44)

0

11

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

Я до секунды ставил, но делает измерения отправляет и должен уснуть , но  нет, каждая дополнительная задержка увеличивает время перед сном

Перед Getadc ?

Никак не должна влиять на работу после отправки...

0

12

Думаю, цикл "проснулись - несколько замеров - выделение макс. значения - отправка - засыпание" будет более практичен в вашем случае, чем игры с задержками. ;)

0

13

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

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

    Я до секунды ставил, но делает измерения отправляет и должен уснуть , но  нет, каждая дополнительная задержка увеличивает время перед сном

Перед Getadc ?

Никак не должна влиять на работу после отправки...

И перед конфигурации adc и после и перед  Getadc и перед отправкой  :dontknow:

0

14

Я не пойму, почему одно и тоже 16; -20 .... будто читает регистры   :no:

Отредактировано qewin (2019-04-24 19:04:01)

0

15

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

И перед конфигурации adc и после и перед  Getadc и перед отправкой

Конфигурация делается один раз и не теряется "во сне". Пауза здесь не нужна.
После Getadc - лишена смысла.
Перед отправкой - тем более. Чего ждать, если все готово ? ;)

Перед Getadc, чтоб датчик "очнуться" успел... ;)

0

16

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

Я не пойму, почему одно и тоже 16; -20 .... будто читает регистры R16 R30

Как осуществляется чтение АПЦ на самом деле ?

0

17

Код:
Config Adc = Single , Prescaler = 128 , Reference = Internal

 Start Adc

Term = Getadc(2)
For T = 1 To 30                                             'Цикл измерения температуры
Term = Getadc(2)
Term_t = Term_t + Term
Next
Reset U_term
Term = Term_t / 30

   Ux = Term * 1059
   Tt = Ux / 1000
   Term = Tt
   Ter = Term - 500


Config Adc = Single , Prescaler = 128 , Reference = Avcc    
   Ubat = Getadc(14)                                                                   ' Замер питания
   Ux = 117000 / Ubat
   Ubat = Ux
Config Adc = Single , Prescaler = 128 , Reference = Internal      
Stop Adc

0

18

Это я все видел в листинге в самом начале... ;)

Ну, это как бы понятно...

Term = Getadc(2)

А это откуда ?
В ATMega88 нет столько каналов АЦП... ;)

Ubat = Getadc(14)

Далее...

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

Я не пойму, почему одно и тоже 16; -20 .... будто читает регистры

Ну, были здесь "упоминания" про регистры R16 и R30 (см. #13), потому и появились вопросы... ;)
Опустим этот момент... ;)

Не сочтите за придирки, просто предъявленный изначально листинг не соответствует (пока) поставленным вопросам... ;)
Создалось впечатление, что есть ассемблерные вставки, про которые не упоминалось изначально.

Отредактировано Nord (2019-04-24 22:49:52)

0

19

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

В ATMega88 нет столько каналов АЦП

На 14 канале можно измерить напряжение питания.

0

20

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

qewin


Скиньте весь исходник (прям, как есть и не работает) мне на mail.

0

21

На 14 канале можно измерить напряжение питания.

Можно поподробенее об этом?

0

22

-NMi- написал(а):

Можно поподробенее об этом?


Документацию на МК, религия не позволяет почитать !?

0

23

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

qewin


Где исходник, воюем с ветряными мельницами !

0

24

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

Где исходник, воюем с ветряными мельницами !


Целый день там где даже нельзя пользоваться телефоном  :flag: . Александр  отправил в личку.

0

25

-NMi- написал(а):

Можно поподробенее об этом?

Ёё 

Bits 3:0 – MUXn: Analog Channel Selection [n = 3:0]
Table 28-4. Input Channel Selection

наш всёзнайка, как же так?

0

26

Какой конденсатор стоит на Aref ?  При замере батарейки, и температуры используются разные опорки. Опорка напрямую выведена на Aref. Если стоит кондюк на 0.1u, то при переключении опорки с Avcc на 1,1 вольт, она долго будет выставляться  к 1,1 вольт. Будут погрешности естественно.

0

27

-NMi- написал(а):

Можно поподробенее об этом?

Если немного подумать, то ножку Aref можно использовать как дополнительный вход, разгрузив мк. К примеру повесить на неё кучу кнопок работающих от АЦП.

0

28

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

Какой конденсатор стоит на Aref ?

kip , Доброе время суток!  Кондер  0.1u , но, на "собаке" ведь работает без проблем! Получается на "собаке" измерила сбросила регистры и уснула , а на Timer2 задействованы регистры  :dontknow:  :no: !

И еще отмечу , не имеет значения на сколько делаем замеров и  засыпает  8 сек или на 1мин все такие же  результаты.

Отредактировано qewin (2019-04-27 10:02:35)

0

29

В общем  я мучаю 88 атмегу  на 48 не работает ( стоит пока в работе за окном на "собаке") сделаю еще платку для 328 и протестирую так как 88 умудрился залочить ( доктором излечил ) может глюки какие нибудь.
Я тут пишу и может кого ввожу в заблуждение так как пока не выкладываю " исходник" наработок  которые sasha_1973 выше ссылки делал , для работы в Powersave.

А пока, С наступаюшем праздником, Светлое Христово Воскресенье!

Отредактировано qewin (2019-04-27 10:19:11)

0

30

Странно. Разрядность переменных не нарушена? Там и ворд и интегер есть. Протеусом пользуетесь? Попробуйте пошагово пройти процесс замера и вычисления и посмотрите в протеусе, что происходит. Попробуйте в конце просто присвоить к переменной Ter какое нибудь значение.
Регистры то причём? Проснулись, сделали вычисления,отправили. Регистры все наново переписались.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Powersave - энерго сбережение