BASCOM AVR в вопросах и ответах
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
спасибо!....там модуляция ам,с модулями как там это сделать просто-проверено!
мне же нужен был пример модуляции FSK-тоже что и FM только импульсная,в принципе нашел но не могу осилить даташит приемопередатчика на MRF49-разбираюсь...
мне же нужен был пример модуляции FSK-тоже что и FM только импульсная,в принципе нашел но не могу осилить даташит приемопередатчика на MRF49-разбираюсь...
- Реклама
- Tankor
- Встал на лапы
- Сообщения: 139
- Зарегистрирован: Вт май 03, 2011 10:13:12
- Откуда: Россия, Татарстан
Re: BASCOM AVR в вопросах и ответах
Конфликт прерываний- извечная проблема начинающих, коим и являюсь.
Какие основные моменты необходимо соблюдать, используя множество прерываний? Может обобщить Ваши знания, а то я голову сломал с данной проблемой.
Использую все INT на кнопках, TIMER1, TIMER2 в асинхронном режиме от часового кварца. Без таймера 2, вроде система живёт, но как только подключаю- непроизвольное зависание, перезагрузка и т.д.
Пробовал в обработчиках запрещать прерывания- не помогает. Чую, что дело в таймере 2, но как победить?
Какие основные моменты необходимо соблюдать, используя множество прерываний? Может обобщить Ваши знания, а то я голову сломал с данной проблемой.
Использую все INT на кнопках, TIMER1, TIMER2 в асинхронном режиме от часового кварца. Без таймера 2, вроде система живёт, но как только подключаю- непроизвольное зависание, перезагрузка и т.д.
Пробовал в обработчиках запрещать прерывания- не помогает. Чую, что дело в таймере 2, но как победить?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Здравствуйте.
Так что все решения исключительно в Вашей голове, ибо только Вы знаете, как оно работает (ну или хотя бы, как должно работать).
P.S. В остальном же, рекомендация, касаемая прерываний, всегда одна: прерывание, что бы оно ни делало, не должно выполняться долго. Потому как все остальное, выполняемое программно, в это время стоит. Нужно стараться делать флаговые автоматы. Завели кучу флагов, и выставляете их в прерываниях. А в основном цикле проверяете, не случилось ли чего... Это удобно, на самом деле, и контроллер крутится без остановок. Нет, никто не мешает сделать все наоборот на обработчиках (как в примере с термометром), но нужно отдавать себе отчет в том, что происходит...
Сие не имеет смысла, в обработчике все прерывания и так запрещены глобально.Tankor писал(а):Пробовал в обработчиках запрещать прерывания- не помогает.
Тут вариант один - думать как контроллер. Это Вы пишете код, и только Вы знаете, когда, что и где происходит. Допустим, Вы пишете код такого простого, казалось бы, изделия как термометр. На таймере у Вас индикация, а по шине 1WIRE датчик. Вроде вся просто и понятно, но есть нюансы: при работе с шиной 1WIRE нельзя что бы кто-то вмешивался еще, ибо вся работа построена на таймингах. Уйдет контроллер индикацию обслуживать, и все полетит к чертям. Значит что? Нужно на время работы с датчиком запретить индикацию. Делов-то. Это если забыть, что индикацию нужно обновлять стабильно. И как результат - постоянное "промаргивание" индикатора при опросе датчика. Ерунда, конечно, нужно что-то другое. А можно в таймере индикации еще и запросы по шине делать. Первую цифру зажгли, команду на измерение датчику отправили, ушли... Очередную цифру зажгли, проверили, прошло достаточно времени на измерение температуры, и если прошло, то забираем результат. В следующий заход разбиваем результат по разрядам, и всякое такое. Все работает, ничего не моргает, да еще и время в основном цикле остается. Который пуст и ничем не занят, кстати. НО! Стоит ошибиться и настроить таймер на 2 мс, не учтя что в некоторые моменты код может обрабатываться 3 мс, мы получим кучу неприятностей в виде нервного срыва стека, и прочих зависаний. Потому как МК не в состоянии будет выйти из прерывания. А все почему? Да потому что программист не все учел. И это грустно, конечно. Вся подлость в том, что такие глюки могут никак себя не проявлять месяцами, а потом температура стала отрицательной, конвертация и разнос по разрядам стал дольше и хоп, не влезли в прерывание. И получили баг. Лови его потом...Tankor писал(а):Чую, что дело в таймере 2, но как победить?
Так что все решения исключительно в Вашей голове, ибо только Вы знаете, как оно работает (ну или хотя бы, как должно работать).
P.S. В остальном же, рекомендация, касаемая прерываний, всегда одна: прерывание, что бы оно ни делало, не должно выполняться долго. Потому как все остальное, выполняемое программно, в это время стоит. Нужно стараться делать флаговые автоматы. Завели кучу флагов, и выставляете их в прерываниях. А в основном цикле проверяете, не случилось ли чего... Это удобно, на самом деле, и контроллер крутится без остановок. Нет, никто не мешает сделать все наоборот на обработчиках (как в примере с термометром), но нужно отдавать себе отчет в том, что происходит...
Последний раз редактировалось edm2007 Пт июл 31, 2015 15:46:58, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Все правильно с одним уточнением: все остальное, что должно выполняться программно, в это время стоит. А "железячно" - таймеры продолжают ти'кать, UART принимает биты и пр. Не очень опытные могут превратно понять.edm2007 писал(а):прерывание, что бы оно ни делало, не должно выполняться долго. Потому как все остальное в это время стоит.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Это да, спасибо Jack_A.
Действительно, могут понять не так. Разумеется, "хардварная" часть продолжит работу, а вот "софтварная" встанет.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Реклама
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
пытаюсь прикошачить пульт от донгла http://vrtp.ru/index.php?act=Attach&type=post&id=640012 к мега16+нокиа5110+rda5807,после включения пульт работает норм но через 10-15 мин мега16 неправильно считывает команды пульта через фотоприемник(адрес всегда считывается норм,а команда то ноль,то черти что),передергиваю питание и все работает норм,что может быть?листинг программы
$crystal = 8000000 ' 2000000 ' 4000000 ' 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
'---------------- Используемые библиотеки ----------------------------------------
$lib "mcsbyte.lbx"
$lib "glcd-Nokia5110.lib"
'$lib "lcd4.lbx"
'---------------- Настраиваем порты -------------------
Config Scl = Portc.0
Config Sda = Portc.1
Config I2cdelay = 10
Config Portc.2 = Output 'светодиод
Config Pind.2 = Input 'int0 сюда вешаем фотоприемник вывод d.2
'---------------- Настраиваем таймера -------------------
Config Timer0 = Timer , Prescale = 256 '8000000/256=31250 Hz
Config Int0 = Falling 'Interruption on Falling
Stop Timer0
Enable Timer0
Enable Int0
Enable Interrupts
On Timer0 Tikers 'work on timer
On Int0 Infrared 'work on interruption
'---------------- Переменные -------------------
Dim Byte0 As Integer
Dim Byte1 As Byte
Dim Bass As Bit
Dim Vol As Byte
Dim Fset As Word
Dim Dane As Byte
Dim Freg As Single
Dim Pll As Single
Dim Z1 As String * 5
Dim Pstring1 As String * 3
Dim Pstring2 As String * 1
Dim Aaa As Byte
Dim Tik As Word 'counter of teaks of timer
Dim Byt As Byte 'counter accepted bit
Dim Repeat_flag As Bit 'flag of repetition
Dim Start_flag As Bit 'flag of start condition
Dim Address As Byte 'byte of address
Dim Command As Byte 'byte of command
Dim Address_1 As Byte 'direct byte of address
Dim Command_1 As Byte 'direct byte of command
Dim Address_0 As Byte 'indirect byte of address
Dim Command_0 As Byte 'indirect byte of command
Dim Summa As Word
'---------------- Настраиваем LCD Nokia3310 или Nokia5110 -------------------
Config Graphlcd = 128 * 64eadogm , Cs1 = Portb.2 , A0 = Portb.1 , Si = Portb.4 , Sclk = Portb.3 , Rst = Portb.0
Const Negative_lcd = 0 ' Для негативного вывода информации, установить "Negative_lcd = 1"
Initlcd ' Инициализируем LCD
Cls
Vol = 9
Bass = 1
Setfont Font12x16dig
Freg = 983
Declare Sub 123
Call 123
Do
' Incr Aaa
If Command = 2 Then Toggle Bass
Lcdat 1 , 1 , Address ; " " ; Command ; " "
'Lcdat 1 , 1 , Aaa
If Command = 160 Then
Freg = Freg + 1
Call 123
End If
If Command = 64 Then ' And Pll < 107.9
Freg = Freg - 1
Call 123
End If
If Command = 144 Then
Freg = 954
Call 123
End If
If Command = 184 Then
Freg = 983
Call 123
End If
If Command = 248 Then
Freg = 996
Call 123
End If
If Command = 176 Then
Freg = 1011
Call 123
End If
Z1 = Str(freg)
If Freg < 1000 Then Z1 = " " + Z1
Pstring1 = Left(z1 , 3)
Pstring2 = Mid(z1 , 4 , 1)
Setfont Font12x16dig
Lcdat 3 , 1 , Pstring1 ; "," ; Pstring2 ; " "
'Aaa = Freg Mod 100
'Lcdat 3 , 25 , Aaa ;
If Command = 80 And Vol > 0 Then
Decr Vol
Call 123
End If
If Command = 120 And Vol < 15 Then
Incr Vol
Call 123
End If
For Dane = 0 To 14
Byte0 = Dane * 6
Byte0 = Byte0 + 1
If Vol > Dane Then
Lcdat 5 , Byte0 , "!"
Else
Lcdat 5 , Byte0 , " "
end IF
Next Dane
Waitms 200
Loop
End 'End of main cycle
'################################################################################################################
Tikers: '?????? ?? ???????
Timer0 = 253 '31250/(256-253)=10416,66 Hz (96 ???)
'254 - TV SAMSUNG, 253 - DVD SAMSUNG ? ?????? NEC
Incr Tik
If Tik >= 1200 Then '???? ????????? 1200 ?????, ???????? ??? ? ???????? ?????????
Tik = 0
Repeat_flag = 0
Start_flag = 0
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
Command = 0
Address = 0
Stop Timer0 '????????????? ??????
End If
Return
'*******************************************************************************
Infrared: '?????? ?? ??????????
Start Timer0 '????????? ??????
If Tik >= 139 And Tik < 150 Then '???? ????????? ?? 139 ?? 150 ????? - "?????"
Address = 1
Repeat_flag = 0
Start_flag = 1
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
End If
If Tik >= 116 And Tik < 139 Then '???? ????????? ?? 116 ?? 138 ????? - "??????"
Address = 2
Repeat_flag = 1
Start_flag = 0
End If
If Tik >= 22 And Tik < 116 And Start_flag = 1 Then '???? ????????? ?? 22 ?? 115 ????? - ??????? "1"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
Address_1 = Address_1 + 1
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
Address_0 = Address_0 + 1
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
Command_1 = Command_1 + 1
End If
If Byt >= 25 Then
Shift Command_0 , Left
Command_0 = Command_0 + 1
End If
End If
If Tik >= 10 And Tik < 22 And Start_flag = 1 Then '???? ????????? ?? 10 ?? 21 ???? - ??????? "0"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
End If
If Byt >= 25 Then
Shift Command_0 , Left
End If
End If
Tik = 0
If Byt = 32 Then '???? ??????? 4 ?????, ????????? ???????????? ?????? ???????
'???? ????? ??? ??????? 16-??????, ???????? ?? ????????, ??????? ????????????????
'Summa = Address_0 + Address_1
'If Summa = 255 Then
Address = Address_1
'Else
'Address = 0
'End If
'Summa = Command_0 + Command_1
'If Summa = 255 Then
Command = Command_1
'Else
'Command = 0
'End If
Byt = 0
Repeat_flag = 0
Start_flag = 0
Stop Timer0 '????????????? ??????
End If
'Waitms 100
Return
Sub 123:
I2cinit
I2cstart
I2cwbyte &B00100000
'02
Dane = &B11000010
Dane.4 = Bass
I2cwbyte Dane 'HD2
I2cwbyte &B00000101 'H8D
'03
Pll = Freg - 870
Byte0 = Pll / 4
Portb.4 = 0
Waitms 2
I2cwbyte Byte0
Byte1 = Byte0 * 4 '03H байт
Byte1 = Pll - Byte1
Byte1 = Byte1 * 64
Byte1.4 = 1
I2cwbyte Byte1 '03L байт
'04
I2cwbyte &B00000010 'H02
I2cwbyte &B00000000 'H00
'05
I2cwbyte &B10001000 'H08
Dane = &H80 + Vol
I2cwbyte Dane
'06
I2cwbyte &B00000000
I2cwbyte &B00001000
'07
I2cwbyte &B01000010
I2cwbyte &B00000010
'08
I2cwbyte &B00000000
I2cwbyte &B00000000
End Sub
'---------- Используемые шрифты --------------
' $include "font6x8.font"
$include "font12x16dig.font"
Спойлер
$regfile = "m16adef.dat" ' Используемый контроллер$crystal = 8000000 ' 2000000 ' 4000000 ' 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
'---------------- Используемые библиотеки ----------------------------------------
$lib "mcsbyte.lbx"
$lib "glcd-Nokia5110.lib"
'$lib "lcd4.lbx"
'---------------- Настраиваем порты -------------------
Config Scl = Portc.0
Config Sda = Portc.1
Config I2cdelay = 10
Config Portc.2 = Output 'светодиод
Config Pind.2 = Input 'int0 сюда вешаем фотоприемник вывод d.2
'---------------- Настраиваем таймера -------------------
Config Timer0 = Timer , Prescale = 256 '8000000/256=31250 Hz
Config Int0 = Falling 'Interruption on Falling
Stop Timer0
Enable Timer0
Enable Int0
Enable Interrupts
On Timer0 Tikers 'work on timer
On Int0 Infrared 'work on interruption
'---------------- Переменные -------------------
Dim Byte0 As Integer
Dim Byte1 As Byte
Dim Bass As Bit
Dim Vol As Byte
Dim Fset As Word
Dim Dane As Byte
Dim Freg As Single
Dim Pll As Single
Dim Z1 As String * 5
Dim Pstring1 As String * 3
Dim Pstring2 As String * 1
Dim Aaa As Byte
Dim Tik As Word 'counter of teaks of timer
Dim Byt As Byte 'counter accepted bit
Dim Repeat_flag As Bit 'flag of repetition
Dim Start_flag As Bit 'flag of start condition
Dim Address As Byte 'byte of address
Dim Command As Byte 'byte of command
Dim Address_1 As Byte 'direct byte of address
Dim Command_1 As Byte 'direct byte of command
Dim Address_0 As Byte 'indirect byte of address
Dim Command_0 As Byte 'indirect byte of command
Dim Summa As Word
'---------------- Настраиваем LCD Nokia3310 или Nokia5110 -------------------
Config Graphlcd = 128 * 64eadogm , Cs1 = Portb.2 , A0 = Portb.1 , Si = Portb.4 , Sclk = Portb.3 , Rst = Portb.0
Const Negative_lcd = 0 ' Для негативного вывода информации, установить "Negative_lcd = 1"
Initlcd ' Инициализируем LCD
Cls
Vol = 9
Bass = 1
Setfont Font12x16dig
Freg = 983
Declare Sub 123
Call 123
Do
' Incr Aaa
If Command = 2 Then Toggle Bass
Lcdat 1 , 1 , Address ; " " ; Command ; " "
'Lcdat 1 , 1 , Aaa
If Command = 160 Then
Freg = Freg + 1
Call 123
End If
If Command = 64 Then ' And Pll < 107.9
Freg = Freg - 1
Call 123
End If
If Command = 144 Then
Freg = 954
Call 123
End If
If Command = 184 Then
Freg = 983
Call 123
End If
If Command = 248 Then
Freg = 996
Call 123
End If
If Command = 176 Then
Freg = 1011
Call 123
End If
Z1 = Str(freg)
If Freg < 1000 Then Z1 = " " + Z1
Pstring1 = Left(z1 , 3)
Pstring2 = Mid(z1 , 4 , 1)
Setfont Font12x16dig
Lcdat 3 , 1 , Pstring1 ; "," ; Pstring2 ; " "
'Aaa = Freg Mod 100
'Lcdat 3 , 25 , Aaa ;
If Command = 80 And Vol > 0 Then
Decr Vol
Call 123
End If
If Command = 120 And Vol < 15 Then
Incr Vol
Call 123
End If
For Dane = 0 To 14
Byte0 = Dane * 6
Byte0 = Byte0 + 1
If Vol > Dane Then
Lcdat 5 , Byte0 , "!"
Else
Lcdat 5 , Byte0 , " "
end IF
Next Dane
Waitms 200
Loop
End 'End of main cycle
'################################################################################################################
Tikers: '?????? ?? ???????
Timer0 = 253 '31250/(256-253)=10416,66 Hz (96 ???)
'254 - TV SAMSUNG, 253 - DVD SAMSUNG ? ?????? NEC
Incr Tik
If Tik >= 1200 Then '???? ????????? 1200 ?????, ???????? ??? ? ???????? ?????????
Tik = 0
Repeat_flag = 0
Start_flag = 0
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
Command = 0
Address = 0
Stop Timer0 '????????????? ??????
End If
Return
'*******************************************************************************
Infrared: '?????? ?? ??????????
Start Timer0 '????????? ??????
If Tik >= 139 And Tik < 150 Then '???? ????????? ?? 139 ?? 150 ????? - "?????"
Address = 1
Repeat_flag = 0
Start_flag = 1
Address_1 = 0
Command_1 = 0
Address_0 = 0
Command_0 = 0
End If
If Tik >= 116 And Tik < 139 Then '???? ????????? ?? 116 ?? 138 ????? - "??????"
Address = 2
Repeat_flag = 1
Start_flag = 0
End If
If Tik >= 22 And Tik < 116 And Start_flag = 1 Then '???? ????????? ?? 22 ?? 115 ????? - ??????? "1"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
Address_1 = Address_1 + 1
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
Address_0 = Address_0 + 1
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
Command_1 = Command_1 + 1
End If
If Byt >= 25 Then
Shift Command_0 , Left
Command_0 = Command_0 + 1
End If
End If
If Tik >= 10 And Tik < 22 And Start_flag = 1 Then '???? ????????? ?? 10 ?? 21 ???? - ??????? "0"
Incr Byt
If Byt < 9 Then
Shift Address_1 , Left
End If
If Byt >= 9 And Byt < 17 Then
Shift Address_0 , Left
End If
If Byt >= 17 And Byt < 25 Then
Shift Command_1 , Left
End If
If Byt >= 25 Then
Shift Command_0 , Left
End If
End If
Tik = 0
If Byt = 32 Then '???? ??????? 4 ?????, ????????? ???????????? ?????? ???????
'???? ????? ??? ??????? 16-??????, ???????? ?? ????????, ??????? ????????????????
'Summa = Address_0 + Address_1
'If Summa = 255 Then
Address = Address_1
'Else
'Address = 0
'End If
'Summa = Command_0 + Command_1
'If Summa = 255 Then
Command = Command_1
'Else
'Command = 0
'End If
Byt = 0
Repeat_flag = 0
Start_flag = 0
Stop Timer0 '????????????? ??????
End If
'Waitms 100
Return
Sub 123:
I2cinit
I2cstart
I2cwbyte &B00100000
'02
Dane = &B11000010
Dane.4 = Bass
I2cwbyte Dane 'HD2
I2cwbyte &B00000101 'H8D
'03
Pll = Freg - 870
Byte0 = Pll / 4
Portb.4 = 0
Waitms 2
I2cwbyte Byte0
Byte1 = Byte0 * 4 '03H байт
Byte1 = Pll - Byte1
Byte1 = Byte1 * 64
Byte1.4 = 1
I2cwbyte Byte1 '03L байт
'04
I2cwbyte &B00000010 'H02
I2cwbyte &B00000000 'H00
'05
I2cwbyte &B10001000 'H08
Dane = &H80 + Vol
I2cwbyte Dane
'06
I2cwbyte &B00000000
I2cwbyte &B00001000
'07
I2cwbyte &B01000010
I2cwbyte &B00000010
'08
I2cwbyte &B00000000
I2cwbyte &B00000000
End Sub
'---------- Используемые шрифты --------------
' $include "font6x8.font"
$include "font12x16dig.font"
- fedyasolder
- Поставщик валерьянки для Кота
- Сообщения: 2168
- Зарегистрирован: Ср май 01, 2013 13:53:56
- Откуда: с пальмы в Рио-Инженейро
Re: BASCOM AVR в вопросах и ответах
Если код для ик не трогали, то вероятно где-то что-то портит переменную с командой.
электропримат паяю даже лёжа...
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
код не трогал,сейчас фотоприемник запитал от 4-х аккумуляторов ааа-общее напряжение 5 в,все равно иногда адрес доходит верно,а вот команды неправильно либо вообще 0,пока так и оставил....
- fedyasolder
- Поставщик валерьянки для Кота
- Сообщения: 2168
- Зарегистрирован: Ср май 01, 2013 13:53:56
- Откуда: с пальмы в Рио-Инженейро
Re: BASCOM AVR в вопросах и ответах
От разных пультов пробовали? Короткое нажатие, длинное нажатие на кнопку пульта...
электропримат паяю даже лёжа...
-
pavel1979
- Мучитель микросхем
- Сообщения: 494
- Зарегистрирован: Пн авг 12, 2013 19:07:47
- Откуда: башкирия мелеуз
Re: BASCOM AVR в вопросах и ответах
вы навели на мысль-попробовал пульты от двд-плеера ВВК и телевизора голстар принимает без нареканий с трех метров,а вот пульт от донгла всего с полутора метров и то такие перебои...наверно виноват пульт...спасибо за подсказку!
- fedyasolder
- Поставщик валерьянки для Кота
- Сообщения: 2168
- Зарегистрирован: Ср май 01, 2013 13:53:56
- Откуда: с пальмы в Рио-Инженейро
Re: BASCOM AVR в вопросах и ответах
Щас глянул. У меня для опытов от dvd bbk пульт 404E. C ним полный порядочек.
Если с меньшего расстояния, то скорее всего частота модуляции отличается.
Если с меньшего расстояния, то скорее всего частота модуляции отличается.
электропримат паяю даже лёжа...
Re: BASCOM AVR в вопросах и ответах
организую цикл
For Takt = начало To конец Step шаг
когда:
начало = 0
конец = 15
шаг = 1
то все в порядке
'===================
когда:
начало = 15
конец = 0
шаг= -1
то непорядок.
но если это же пробую так :
For Takt = начало To конец Step -1
то обратный цикл работает
переменную Шаг назначаю как Integer
Почему?
For Takt = начало To конец Step шаг
когда:
начало = 0
конец = 15
шаг = 1
то все в порядке
'===================
когда:
начало = 15
конец = 0
шаг= -1
то непорядок.
но если это же пробую так :
For Takt = начало To конец Step -1
то обратный цикл работает
переменную Шаг назначаю как Integer
Почему?
Re: BASCOM AVR в вопросах и ответах
Потому что судя по всему, в качестве параметра Step может быть только константа.bumbum писал(а):Почему?
- Gordon Shumway
- Мучитель микросхем
- Сообщения: 485
- Зарегистрирован: Пн авг 20, 2007 21:35:45
- Откуда: Мытищи, Московская область
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Доброго дня, уважаемые знатоки !
Нужно было придумать генератор 36кгц, сначала просто дрыгал ногой по таймеру, потом наткнулся на такой код:
Работает, но нифига (простите) не понятно... Хочется понять как это сделали. Даташит на мегу покурил, но мало прояснилось.
Нужно еще как-то добавить перерыв в импульсах примерно после 80 штук на пол-секунды (это чтобы TSOP не перегрузился).
Это пока додумываю.
Нужно было придумать генератор 36кгц, сначала просто дрыгал ногой по таймеру, потом наткнулся на такой код:
Спойлер
Код: Выделить всё
$regfile = "m8def.dat"
$crystal = 8000000
$framesize = 32
$hwstack = 40
$swstack = 16
Config Portb.1 = Output
Config Timer1 = Counter , Compare A = Toggle , Prescale = 1
Tccr1b.wgm12 = 1
Tccr1b.wgm13 = 1
Icr1 = 110
EndНужно еще как-то добавить перерыв в импульсах примерно после 80 штук на пол-секунды (это чтобы TSOP не перегрузился).
Это пока додумываю.
С уважением,
Алексей.
Алексей.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Здравствуйте.
Да собственно, ничего сложного здесь нет, настроен режим работы таймера CTC (сброс при совпадении), с ограничением счета до значения в регистре ICR. В даташите это все есть:
=

Таймер будет считать от 0 до ICR1 = 110, а затем сбросится, и начнет все снова. При совпадении счетного регистра таймера с регистром ICR на выводе OC1A уровень сменится на противоположный:
Теперь простая математика: МК работает на частоте 8 МГц, значит период равен 1 / 8 000 000 = 0.000125 мс. Прескаллер таймера равен 1, значит таймер досчитает до конца за 110 * 0,000125 = 0,01375 мс. Значит за секунду уровень на выводе OC1A сменится 1000 / 0,01375 = 72727 раз / 2 = 36363 Гц.
Таким нехитрым способом Вы можете пересчитать таймер под любую частоту, всего лишь меняя значение в регистре ICR. И при этом МК будет работать сам по себе, не занимая время всякими обработчиками таймеров и проч. Это полностью хардварная вещь.
Да собственно, ничего сложного здесь нет, настроен режим работы таймера CTC (сброс при совпадении), с ограничением счета до значения в регистре ICR. В даташите это все есть:
Код: Выделить всё
Tccr1b.wgm12 = 1
Tccr1b.wgm13 = 1

Таймер будет считать от 0 до ICR1 = 110, а затем сбросится, и начнет все снова. При совпадении счетного регистра таймера с регистром ICR на выводе OC1A уровень сменится на противоположный:
Код: Выделить всё
Compare A = Toggle
Таким нехитрым способом Вы можете пересчитать таймер под любую частоту, всего лишь меняя значение в регистре ICR. И при этом МК будет работать сам по себе, не занимая время всякими обработчиками таймеров и проч. Это полностью хардварная вещь.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Gordon Shumway
- Мучитель микросхем
- Сообщения: 485
- Зарегистрирован: Пн авг 20, 2007 21:35:45
- Откуда: Мытищи, Московская область
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
То есть это именно тот режим, который вы мне советовали использовать в моей задумке...edm2007 писал(а): настроен режим работы таймера CTC (сброс при совпадении), с ограничением счета до значения в регистре ICR. .
Огромное спасибо, стало понятнее !
А не подскажете как сделать паузу между пачками импульсов ?
Я сейчас это сделал, просто использовав Таймер2 в режиме таймера с прескалером 1024. Как только он 50 раз переполнится - делаю стоп таймер1. Потом пауза - и старт таймер1. По-ламерски, видимо.
С уважением,
Алексей.
Алексей.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Именно так. Только я говорил про CTC с регистром OCR1A (здесь это 4 режим). В Вашем же случае довольно нетипичное использование таймера, так как ICR - это регистр захвата (в этот регистр "захватывается" значение счетного регистра либо по активному уровню на выводе ICP1, либо по сигналу аналогового компаратора). Но принцип работы CTC режима идентичен совершенно.Gordon Shumway писал(а):То есть это именно тот режим, который вы мне советовали использовать в моей задумке...
На самом деле в этом многообразии режимов разобраться не так сложно, как кажется. Просто при программировании в баскоме все это многообразие остается на заднем плане, так как этих самых простых команд нет, как Вы верно заметили. А о прямой конфигурации кто-то думать не хочет, кто-то разобраться не может, а некоторые и не подозревают даже (и таких большинство)...Gordon Shumway писал(а):Я совсем запутался с этими режимами работы таймера, и, видимо, этот конкретный режим простыми командами Bascom не опишешь.
Ну использование таймера в котором тормозится работа другого таймера не так уж и по-ламерски. Если ресурсов не жаль, то вполне себе решение.Gordon Shumway писал(а):А не подскажете как сделать паузу между пачками импульсов ?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Gordon Shumway
- Мучитель микросхем
- Сообщения: 485
- Зарегистрирован: Пн авг 20, 2007 21:35:45
- Откуда: Мытищи, Московская область
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Свободен, только я совсем про него забыл. Его "на ногах" нет, и он просто вылетел из головы !edm2007 писал(а):Gordon Shumway писал(а): У меги 8 таймеров-то полно, самый простой 0 можно на отсчет пауз посадить. Или тоже занят?
Спасибо !!!
С уважением,
Алексей.
Алексей.
- pavel123
- Грызет канифоль
- Сообщения: 268
- Зарегистрирован: Чт май 17, 2007 09:44:13
- Откуда: Украина, г. Кривой Рог
Re: BASCOM AVR в вопросах и ответах
Доб.день.
Помогите пожалуйста разобраться... Тираню часы ds3231. Записываю в регистр управления байт для секундных импульсов. Часики весело мигают светодиодом.
А вот при попытке считать этот же регистр управления ничего вразумительного не выходит...
Помогите мне найти мою ошибку.
Спасибо.
Вот кусочек кода...
Помогите пожалуйста разобраться... Тираню часы ds3231. Записываю в регистр управления байт для секундных импульсов. Часики весело мигают светодиодом.
А вот при попытке считать этот же регистр управления ничего вразумительного не выходит...
Помогите мне найти мою ошибку.
Спасибо.
Вот кусочек кода...
Код: Выделить всё
Dim Registr_driver As Byte
Dim Registr_driver_1 As Byte
Const Ds3231w = &HD0
Const Ds3231r = &HD1
Const Upradress = &H0E
Config Clock = User
I2cstart
I2cwbyte Ds3231w
I2cwbyte Upradress
I2cwbyte &B00100000
I2cstop
I2cstart
I2cwbyte Ds3231r
I2cwbyte Upradress
I2crbyte Registr_driver , Nack
I2cstop
Registr_driver_1 = Binval(registr_driver)
Locate 1 , 1 : Lcd Registr_driver_1- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Добрый.
Будьте добры, приведите весь код с вызовами соответствующих функций. В обобщенном виде чтение происходит следующим образом:
Будьте добры, приведите весь код с вызовами соответствующих функций. В обобщенном виде чтение происходит следующим образом:
Код: Выделить всё
1. старт
2. адрес микросхемы с битом записи (Ds3231w)
3. адрес, откуда читаем (Upradress)
4. старт
5. адрес микросхемы с битом чтения (Ds3231r)
6. забираем значение (ACK или NACK, по ситуации)
7. стоп
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон


