http://radiokot.ru/forum/viewtopic.php? ... 7&start=40
BASCOM AVR в вопросах и ответах
- Сообщения: 5
- Зарегистрирован: Сб янв 05, 2013 02:03:06
- Реклама
нет,переделал плату под другой порт,удалось немного упрвлять rda5807,мучаю ее дальше...
Уважаемые коты подскажите решение. Суть вопроса такова, хочу сделать автоматическую выключалку света на ультразвуковом датчике HС-SR04. Сделал монтажку, написал код. Алгоритм следующий:
по переполнению таймера происходит замер расстояния от датчика. В основном цикле происходит сравнение min и max значения расстояния с измеренным. Если измеренное расстояние больше max или меньше min значений, то включается свет. max и min значения назначаются при нажатии на кнопку установки (происходит замер расстояния и присваиваются max и min значения). Так вот - через какой то промежуток времени max значение самопроизвольно меняется (без нажатия кнопки установки) и свет не гаснет потому что выполняется условие - измеренное расстояние больше max значения. Не пойму где ошибся - подскажите, код ниже:
$crystal = 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
$baud = 4800
'---------------- используемые библиотеки ----------------------------------------
$lib "glcd-Nokia1100.lib"
Dim A As Word
Dim B As Word
Dim S As Single
Dim G As Single
Dim Pstring As String * 8
Dim S_max_string As String * 8
Dim S_min_string As String * 8
Dim S_max As Single
Dim S_min As Single
Config Pinc.1 = 0 : Portc.1 = 1
S1 Alias Pinc.1
Config Portb.0 = Output
Portb.0 = 0
'---------------- конфигурация LCD Nokia1110 -------------------
Config Graphlcd = 128x64sed , Cs1 = Portc.2 , Si = Portc.4 , Sclk = Portc.5 , Rst = Portc.3
Const Negative_lcd = 0
Const Mirror_y = 0
Const Mirror_x = 1
Initlcd
Cls
' ******************** настраиваем порты для HC-SR04***********************************************
Config Portd.7 = Input
Config Portd.6 = Output
Trigger Alias Portd.6
Trigger = 0
Const K = 0.1725
Config Timer1 = Timer , Prescale = 64
On Timer1 Замер
Enable Timer1
Enable Interrupts
'**************************************************************************************************
Начало:
Do
Debounce S1 , 0 , Установка
Disable Interrupts
If S > S_max Or S < S_min Then Portb.0 = 1 Else Portb.0 = 0
Enable Interrupts
Pstring = Fusing(s , "###.#")
S_max_string = Fusing(s_max , "###.#")
S_min_string = Fusing(s_min , "###.#")
Setfont Font6x8
Lcdat 1 , 20 , "Измеритель"
Lcdat 2 , 20 , "расстояния"
Setfont Font12x16dig
Lcdat 4 , 0 , " " ; Pstring ; " "
Setfont Font6x8
Lcdat 7 , 1 , S_min_string ; " "
Lcdat 8 , 1 , S_max_string ; " "
Loop
End
Замер: ' обработка прерывания по таймеру (выполнение замера)
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pind , 7 , 1
S = A * K
Return
Установка: ' Измерение расстояния и установка min и max значений
Disable Interrupts
Portb.0 = 0
Waitms 3000
Portb.0 = 1
Waitms 3000
Portb.0 = 0
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein B , Pind , 7 , 1
G = B * K
S_max = G + 20
S_min = G - 20
Waitms 3000
Enable Interrupts
Goto Начало
$include "font6x8.font"
$include "font12x16dig.font"
по переполнению таймера происходит замер расстояния от датчика. В основном цикле происходит сравнение min и max значения расстояния с измеренным. Если измеренное расстояние больше max или меньше min значений, то включается свет. max и min значения назначаются при нажатии на кнопку установки (происходит замер расстояния и присваиваются max и min значения). Так вот - через какой то промежуток времени max значение самопроизвольно меняется (без нажатия кнопки установки) и свет не гаснет потому что выполняется условие - измеренное расстояние больше max значения. Не пойму где ошибся - подскажите, код ниже:
Спойлер
$regfile = "m8def.dat"$crystal = 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
$baud = 4800
'---------------- используемые библиотеки ----------------------------------------
$lib "glcd-Nokia1100.lib"
Dim A As Word
Dim B As Word
Dim S As Single
Dim G As Single
Dim Pstring As String * 8
Dim S_max_string As String * 8
Dim S_min_string As String * 8
Dim S_max As Single
Dim S_min As Single
Config Pinc.1 = 0 : Portc.1 = 1
S1 Alias Pinc.1
Config Portb.0 = Output
Portb.0 = 0
'---------------- конфигурация LCD Nokia1110 -------------------
Config Graphlcd = 128x64sed , Cs1 = Portc.2 , Si = Portc.4 , Sclk = Portc.5 , Rst = Portc.3
Const Negative_lcd = 0
Const Mirror_y = 0
Const Mirror_x = 1
Initlcd
Cls
' ******************** настраиваем порты для HC-SR04***********************************************
Config Portd.7 = Input
Config Portd.6 = Output
Trigger Alias Portd.6
Trigger = 0
Const K = 0.1725
Config Timer1 = Timer , Prescale = 64
On Timer1 Замер
Enable Timer1
Enable Interrupts
'**************************************************************************************************
Начало:
Do
Debounce S1 , 0 , Установка
Disable Interrupts
If S > S_max Or S < S_min Then Portb.0 = 1 Else Portb.0 = 0
Enable Interrupts
Pstring = Fusing(s , "###.#")
S_max_string = Fusing(s_max , "###.#")
S_min_string = Fusing(s_min , "###.#")
Setfont Font6x8
Lcdat 1 , 20 , "Измеритель"
Lcdat 2 , 20 , "расстояния"
Setfont Font12x16dig
Lcdat 4 , 0 , " " ; Pstring ; " "
Setfont Font6x8
Lcdat 7 , 1 , S_min_string ; " "
Lcdat 8 , 1 , S_max_string ; " "
Loop
End
Замер: ' обработка прерывания по таймеру (выполнение замера)
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pind , 7 , 1
S = A * K
Return
Установка: ' Измерение расстояния и установка min и max значений
Disable Interrupts
Portb.0 = 0
Waitms 3000
Portb.0 = 1
Waitms 3000
Portb.0 = 0
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein B , Pind , 7 , 1
G = B * K
S_max = G + 20
S_min = G - 20
Waitms 3000
Enable Interrupts
Goto Начало
$include "font6x8.font"
$include "font12x16dig.font"
- Сообщения: 138
- Зарегистрирован: Вс май 16, 2010 01:13:39
Попробуйте для начала:
1. у дебонсе поставьте параметр SUB, и соответственно завершите пп командой ретурн. Метку Начало удалите.
2. Все метки желательно писать латиницей,хоть оно и работает.
3. Config Pinc.1 = 0 - такой команды нет.
4. поставьте подтягивающий резистор на кнопку 10к
5. схема и фото не помешает
1. у дебонсе поставьте параметр SUB, и соответственно завершите пп командой ретурн. Метку Начало удалите.
2. Все метки желательно писать латиницей,хоть оно и работает.
3. Config Pinc.1 = 0 - такой команды нет.
4. поставьте подтягивающий резистор на кнопку 10к
5. схема и фото не помешает
- Реклама
С субпрограммой попробуюCivil писал(а):Попробуйте для начала:
1. у дебонсе поставьте параметр SUB, и соответственно завершите пп командой ретурн. Метку Начало удалите.
2. Все метки желательно писать латиницей,хоть оно и работает.
3. Config Pinc.1 = 0 - такой команды нет.
4. поставьте подтягивающий резистор на кнопку 10к
5. схема и фото не помешает
Config Pinc.1 = 0 : Portc.1 = 1 если про эту строку - то в часиках польских работает (баском начал осваивать с разбора исходника от них и уже написал свой код под мега32 на форуме есть http://radiokot.ru/forum/viewtopic.php? ... 1#p2252171 ).
Метки все на русском - работает;
В тех же часиках кнопки работают без подтягивающих резисторов (самопроизвольно не переключаются).В модели протеуса видно, что единица на порте стоит (т.е подтянут встроенный резистор в контроллере строкой Portc.1 = 1) Правильнее было бы написать:
Config Pinc.1 = Input : Portc.1 = 1 но работает и Config Pinc.1 = 0 : Portc.1 = 1
http://chipenable.ru/index.php/how-conn ... nopki.html рис.16
S_max, G и S_min исправлю - обнулю их первоначальные значения (сейчас при старте на LCD отображаются значение 0)
Думаю, что S_max и S_min нужно записывать в EEPROM и тогда сбоить не будет. И увидел что пропустил Config Debounce = 10
Вот похожий проект на тиньке http://bezkz.su/publ/shemy/vyklyuchatel ... chike.html
В нем ещё используется watchdog , может и себе его использовать для большей стабильности?
Когда стал записывать значения min и max в eeprom всё наладилось, сбоев больше нет:
код:
$crystal = 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
$baud = 4800
'---------------- переменные и библиотеки ----------------------------------------
$lib "glcd-Nokia1100.lib"
Dim A As Word
Dim S As Single
Dim Pstring As String * 8
Dim S_max_string As String * 8
Dim S_min_string As String * 8
Dim S_max1 As Eram Single
Dim S_min1 As Eram Single
Dim S_max As Single
Dim S_min As Single
S_max = 0
S_min = 0
Config Pinc.1 = 0 : Portc.1 = 1
S1 Alias Pinc.1
Config Portb.0 = Output
Portb.0 = 0
'---------------- конфигурацияì LCD Nokia1110 -------------------
Config Graphlcd = 128x64sed , Cs1 = Portc.2 , Si = Portc.4 , Sclk = Portc.5 , Rst = Portc.3
Const Negative_lcd = 0
Const Mirror_y = 0
Const Mirror_x = 1
Initlcd
Cls
' ******************** конфигурация HC-SR04***********************************************
Config Portd.7 = Input
Config Portd.6 = Output
Trigger Alias Portd.6
Trigger = 0
Const K = 0.1725
Config Debounce = 10
Config Timer1 = Timer , Prescale = 64
On Timer1 Замер
Enable Timer1
Enable Interrupts
'**************************************************************************************************
Начало:
Do
S_max = S_max1
S_min = S_min1
Debounce S1 , 0 , Установка
Disable Interrupts
If S > S_max Or S < S_min Then Portb.0 = 1 Else Portb.0 = 0
Enable Interrupts
Pstring = Fusing(s , "###.#")
S_max_string = Fusing(s_max , "###.#")
S_min_string = Fusing(s_min , "###.#")
Setfont Font6x8
Lcdat 1 , 20 , "измеритель"
Lcdat 2 , 20 , "расстояния"
Setfont Font12x16dig
Lcdat 4 , 0 , " " ; Pstring ; " "
Setfont Font6x8
Lcdat 7 , 1 , S_min_string ; " "
Lcdat 8 , 1 , S_max_string ; " "
Loop
End
Замер:
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pind , 7 , 1
S = A * K
Return
Установка:
Disable Interrupts
Portb.0 = 0
Waitms 3000
Portb.0 = 1
Waitms 3000
Portb.0 = 0
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pind , 7 , 1
S = A * K
S_max = S + 20
S_min = S - 20
S_max1 = S_max
S_min1 = S_min
Waitms 3000
Enable Interrupts
Goto Начало
$include "font6x8.font"
$include "font12x16dig.font"
Фото во вложении.
код:
Спойлер
$regfile = "m8def.dat"$crystal = 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
$baud = 4800
'---------------- переменные и библиотеки ----------------------------------------
$lib "glcd-Nokia1100.lib"
Dim A As Word
Dim S As Single
Dim Pstring As String * 8
Dim S_max_string As String * 8
Dim S_min_string As String * 8
Dim S_max1 As Eram Single
Dim S_min1 As Eram Single
Dim S_max As Single
Dim S_min As Single
S_max = 0
S_min = 0
Config Pinc.1 = 0 : Portc.1 = 1
S1 Alias Pinc.1
Config Portb.0 = Output
Portb.0 = 0
'---------------- конфигурацияì LCD Nokia1110 -------------------
Config Graphlcd = 128x64sed , Cs1 = Portc.2 , Si = Portc.4 , Sclk = Portc.5 , Rst = Portc.3
Const Negative_lcd = 0
Const Mirror_y = 0
Const Mirror_x = 1
Initlcd
Cls
' ******************** конфигурация HC-SR04***********************************************
Config Portd.7 = Input
Config Portd.6 = Output
Trigger Alias Portd.6
Trigger = 0
Const K = 0.1725
Config Debounce = 10
Config Timer1 = Timer , Prescale = 64
On Timer1 Замер
Enable Timer1
Enable Interrupts
'**************************************************************************************************
Начало:
Do
S_max = S_max1
S_min = S_min1
Debounce S1 , 0 , Установка
Disable Interrupts
If S > S_max Or S < S_min Then Portb.0 = 1 Else Portb.0 = 0
Enable Interrupts
Pstring = Fusing(s , "###.#")
S_max_string = Fusing(s_max , "###.#")
S_min_string = Fusing(s_min , "###.#")
Setfont Font6x8
Lcdat 1 , 20 , "измеритель"
Lcdat 2 , 20 , "расстояния"
Setfont Font12x16dig
Lcdat 4 , 0 , " " ; Pstring ; " "
Setfont Font6x8
Lcdat 7 , 1 , S_min_string ; " "
Lcdat 8 , 1 , S_max_string ; " "
Loop
End
Замер:
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pind , 7 , 1
S = A * K
Return
Установка:
Disable Interrupts
Portb.0 = 0
Waitms 3000
Portb.0 = 1
Waitms 3000
Portb.0 = 0
Trigger = 1
Waitus 15
Trigger = 0
Waitus 10
Pulsein A , Pind , 7 , 1
S = A * K
S_max = S + 20
S_min = S - 20
S_max1 = S_max
S_min1 = S_min
Waitms 3000
Enable Interrupts
Goto Начало
$include "font6x8.font"
$include "font12x16dig.font"
- Вложения
-
- IMG_3622.jpg
- (191.94 КБ) 343 скачивания
-
- IMG_3621.jpg
- (251.52 КБ) 433 скачивания
-
- IMG_3618.jpg
- (203 КБ) 304 скачивания
Немогу организовать шим на таймере1 в тине25. на таймере 0 работает, а когда в программе меняю таймер баском ругается
Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Down
Start Timer0
Do
Do
Waitms 10
Incr Pwm0b
Loop Until Pwm0b = 255
Do
Waitms 10
Decr Pwm0b
Loop Until Pwm0b = 0
Loop
End вот так всё работает
Config Timer1 = Pwm , Prescale = 8 , Compare B Pwm = Clear Down
Start Timer1
Do
Do
Waitms 10
Incr Pwm1b
Loop Until Pwm1b = 255
Do
Waitms 10
Decr Pwm1b
Loop Until Pwm1b = 0
Loop
End а вот так баском ругается на PWM1b . другие регистры пробовал(OCR1b) не ругается но не работает
Спойлер
Config Portb.1 = OutputConfig Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Down
Start Timer0
Do
Do
Waitms 10
Incr Pwm0b
Loop Until Pwm0b = 255
Do
Waitms 10
Decr Pwm0b
Loop Until Pwm0b = 0
Loop
End
Спойлер
Config Portb.3 = OutputConfig Timer1 = Pwm , Prescale = 8 , Compare B Pwm = Clear Down
Start Timer1
Do
Do
Waitms 10
Incr Pwm1b
Loop Until Pwm1b = 255
Do
Waitms 10
Decr Pwm1b
Loop Until Pwm1b = 0
Loop
End
Приветствую всех котов.Нужен совет. История такая. Есть у меня старый станок для намотки катушек, с мех. счетчиком. Делал я его лет 15 назад. А лет 10 назад добавил ему редуктор 4/1 - стало гораздо веселее. И вот решил я добавить старому другу электронные мозги в виде 4-разрядного счетчика на ATtiny 2313. За основу взял схему (см. приложение), только немного упростил её - убрал запись числа витков в память. Для удобства сделал небольшой имитатор из старого переменного резистора с прикрепленными оптопарами и диском со щелью. Принцип работы: когда щель проходит первую оптопару, срабатывает INT0, когда вторую - INT1. А очередность срабатываний дает направление счета. Вроде бы казалось, ничего сложного, НО: 1.-цифры индикатора заметно мерцают.
2.-нет никакой реакции на прохождение щели через оптопары.
Не могу понять, что я делаю не так.
Может, у кого найдется время посмотреть мой код?
$regfile = "2313def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim W As Word
Dim Count As Byte
Dim Number(4) As Byte
Dim R As Bit 'флаг правого вращения
Dim L As Bit 'флаг левого вращения
Config Portb = Output
Config Pind.0 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Portd.1 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Int0 = Falling
Config Int1 = Falling
On Int0 Encod_r
On Int1 Encod_l
Config Timer0 = Timer , Prescale = 256
On Ovf0 Indic
Enable Interrupts
Enable Int0
Enable Int1
Enable Timer0
Start Timer0
Dig1 Alias Portd.1
Dig2 Alias Portd.4
Dig3 Alias Portd.5
Dig4 Alias Portd.6
Nul Alias Pind.0
W = 0 : R = 0 : L = 0 'начальные значения
Do
If Nul = 0 Then W = 0
If R = 1 And L = 0 Then
Incr W : If W > 9999 Then W = 0
End If
If L = 1 And R = 0 Then
Decr W : If W < 0 Then W = 9999
End If
R = 0 : L = 0
Loop
Encod_r: 'правое вращение
R = 1
Gifr = 64
Return
Encod_l: 'левое вращение
L = 1
Gifr = 128
Return
Indic:
Reset Dig1 : Reset Dig1 : Reset Dig3 : Reset Dig4
Number(1) = W / 1000
Number(2) = W Mod 1000
Number(2) = Number(2) / 100
Number(3) = W Mod 100
Number(3) = Number(3) / 10
Number(4) = W Mod 10
Incr Count : If Count > 4 Then Count = 1
Portb = Lookup(number(count) , Digits)
Select Case Count
Case 1 : If Number(1) <> 0 Then Set Dig1
Case 2 : If Number(2) <> 0 Then Set Dig2
Case 3 : If Number(3) <> 0 Then Set Dig3
Case 4 : Set Dig4
End Select
Return
End
Digits:
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
2.-нет никакой реакции на прохождение щели через оптопары.
Не могу понять, что я делаю не так.
Может, у кого найдется время посмотреть мой код?
$regfile = "2313def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim W As Word
Dim Count As Byte
Dim Number(4) As Byte
Dim R As Bit 'флаг правого вращения
Dim L As Bit 'флаг левого вращения
Config Portb = Output
Config Pind.0 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Portd.1 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Int0 = Falling
Config Int1 = Falling
On Int0 Encod_r
On Int1 Encod_l
Config Timer0 = Timer , Prescale = 256
On Ovf0 Indic
Enable Interrupts
Enable Int0
Enable Int1
Enable Timer0
Start Timer0
Dig1 Alias Portd.1
Dig2 Alias Portd.4
Dig3 Alias Portd.5
Dig4 Alias Portd.6
Nul Alias Pind.0
W = 0 : R = 0 : L = 0 'начальные значения
Do
If Nul = 0 Then W = 0
If R = 1 And L = 0 Then
Incr W : If W > 9999 Then W = 0
End If
If L = 1 And R = 0 Then
Decr W : If W < 0 Then W = 9999
End If
R = 0 : L = 0
Loop
Encod_r: 'правое вращение
R = 1
Gifr = 64
Return
Encod_l: 'левое вращение
L = 1
Gifr = 128
Return
Indic:
Reset Dig1 : Reset Dig1 : Reset Dig3 : Reset Dig4
Number(1) = W / 1000
Number(2) = W Mod 1000
Number(2) = Number(2) / 100
Number(3) = W Mod 100
Number(3) = Number(3) / 10
Number(4) = W Mod 10
Incr Count : If Count > 4 Then Count = 1
Portb = Lookup(number(count) , Digits)
Select Case Count
Case 1 : If Number(1) <> 0 Then Set Dig1
Case 2 : If Number(2) <> 0 Then Set Dig2
Case 3 : If Number(3) <> 0 Then Set Dig3
Case 4 : Set Dig4
End Select
Return
End
Digits:
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
- Вложения
-
- Счетчик на Attiny2313.rar
- (99.13 КБ) 208 скачиваний
Ну я бы увеличил частоту срабатывания таймера на индикацию. Хотя бы раза в 4. Что касается прохождения датчиков, то какая реакция ожидается? Или все это вообще не считает?
В том то и дело, что вообще не считает. Ни быстро, ни медленно. Ни вперед, ни назад. Индикатор проверял батарейкой - все сегменты светятся. Так что пока думаю.
А насчет динамической индикации - недавно сделал термометр на 2313 - работает нормально, без мерцаний, хотя параметры( частота и прескаллер) -точно такие же. Попробовать можно, но это не решает главной проблемы. Так что пока чешу репу дальше.
Надо будет попробовать другой индикатор, но завтра.
А насчет динамической индикации - недавно сделал термометр на 2313 - работает нормально, без мерцаний, хотя параметры( частота и прескаллер) -точно такие же. Попробовать можно, но это не решает главной проблемы. Так что пока чешу репу дальше.
Надо будет попробовать другой индикатор, но завтра.
Для диагностики можно повесить по светодиоду на прерывания и зажигать если произошло событие. Возможно по входу не хватает уровня. Можно пойти совсем другим путем. На диске сделать не щель, а целый сегмент вырезать. Что бы оба датчика были освещены. А отслеживать срабатывание только одного. Тогда при вращении в одну сторону будут оба освещены, а в другую только один. Ну и во время срабатывания следить за вторым.
Помогите пожалуйста разобратся с аппаратным шимом на тини25. Шим на таймере0 - как выше писал без проблем. На таймере же 1 никакой реакции,максимум - получилось сделать сверхкороткие импульсы, без всякой скважности. Даташит уже запарился читать и переводить, всё равно ничего не понял. Средствами баскома таймер1 вообще не получилось запустить, только напрямую прописывая в регистры нужные биты.
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Tccr1 = &B01100101
Gtccr = &B01101100
Ocr1c = 150
End
При всех этих танцев, получается очень короткий импульс, как понял из даташита, когда счетчик насчитает в регистрах ocr1a, ocr1b число соответствующее Ocr1c, то он переключает соответствующий порт, но при этом сбрасывается на ноль и опять переключает порт в исходное состояние. Как заставить порт оставатся во включонном состоянии не пойму.
Вторая загвоздка состоит в том что немогу включить инвертирующие выходы шим. Мне в схеме нужно получить шим на выходе порта3, там находится инвертирующий выход OC1B, но я никак не могу получить на нем сигнал.
Спойлер
$regfile = "attiny25.dat"$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Tccr1 = &B01100101
Gtccr = &B01101100
Ocr1c = 150
End
При всех этих танцев, получается очень короткий импульс, как понял из даташита, когда счетчик насчитает в регистрах ocr1a, ocr1b число соответствующее Ocr1c, то он переключает соответствующий порт, но при этом сбрасывается на ноль и опять переключает порт в исходное состояние. Как заставить порт оставатся во включонном состоянии не пойму.
Вторая загвоздка состоит в том что немогу включить инвертирующие выходы шим. Мне в схеме нужно получить шим на выходе порта3, там находится инвертирующий выход OC1B, но я никак не могу получить на нем сигнал.
Насчет светодиодов - идея интересная. Попробую завтра. И щель попробую сделать пошире.
очень странная система...
баском ругался на запись в регистры чисел...
однакож псле кода
Gtccr = &B01101100
Ocr1c =150
добавив строку
Gtccr = &B01101100
Ocr1c = 150
OCR1B=100
на выходе OC1B появилась скважность.. то есть теперь шимом можно управлять? осталось решит задачу с выводом шим на инвертированный выход OC!B
баском ругался на запись в регистры чисел...
однакож псле кода
Спойлер
Tccr1 = &B01100101Gtccr = &B01101100
Ocr1c =150
Спойлер
Tccr1 = &B01100101Gtccr = &B01101100
Ocr1c = 150
OCR1B=100
МурррраАА!!!наконец то!
найдя скважность в таймере1 атттини25(код выше)
Gtccr = &B01101100
Ocr1c = 150
OCR1B=100
поменяв в строчке GTCCR регистр
Ocr1c = 255
Ocr1b = 100
на инвертируемом выводе OC1B появился ШИМ! 2суток за копьютером не прошли даром....
найдя скважность в таймере1 атттини25(код выше)
Спойлер
Tccr1 = &B01100101Gtccr = &B01101100
Ocr1c = 150
OCR1B=100
поменяв в строчке GTCCR регистр
Спойлер
Gtccr = &B01011100Ocr1c = 255
Ocr1b = 100
- Сообщения: 132
- Зарегистрирован: Пт окт 19, 2012 05:54:55
To rojnov
Этот код и эта схема несовместимы. Разберись с конфигурацией пинов. Бардак полный. С выходов читаем, на входы выводим. Компаратор в проге не при делах. Причеши свою прогу и схему.Потом выкладывай со СВОЕЙ схемой, а не левой.
Этот код и эта схема несовместимы. Разберись с конфигурацией пинов. Бардак полный. С выходов читаем, на входы выводим. Компаратор в проге не при делах. Причеши свою прогу и схему.Потом выкладывай со СВОЕЙ схемой, а не левой.
По поводу счетчика витков. Схема в моем первом сообщении прилагалась в качестве источника идеи, и не более, о чем я, кажется, там же и указал. Поэтому чтобы не было непоняток, прикладываю свою схему, для которой я и писал свой код. Проанализировав работу оптопар в своей схеме, решил упростить себе жизнь, и оптопары заменил на герконы. В итоге проблему это не решило. Счетчик работает нестабильно, то через раз, то вообще сбрасывает число витков на ноль. Пробовал даже отключить второй геркон - не помогло. Может быть, виноват дребезг контактов? Я не знаю, как с этим обстоят дела у герконов. Так что вопрос пока остается открытым по поводу кода - что я делаю неправильно? Раз нет курсов, приходится учиться на советах доброжелательных форумчан.
- Вложения
-
- Схема+код.rar
- (73.55 КБ) 169 скачиваний
- Сообщения: 132
- Зарегистрирован: Пт окт 19, 2012 05:54:55
Я чегой-то припарился, полстраницы пальцы в кровь пальцевую, свою, родную, артериальную стирать об клаву, а потом нихрена не отправляется, ещё раз вход требуется (был же войдён).
To Rojnov.
Сейчас почти правильно (схема и код).
Косяки:
1. Убрать прерывание от таймера (он ПОКА!!!!! нах не нужен)
Indic: - Сделать из него Gosub в основном цикле. Там основные коряги.
2. Флаги внешних прерываний в обработчиках сбрасывать надо, а не устанавливать, иначе там и останешься навечно.
3. ВременнОе перекрытие оптопар, герконов, тайминги (тут вот жестко думать надо, от механики зависит). Тут может (должен) таймер пригодиться.
Блин, флеху с твоей почти обработанной мною темой на каторге забыл, погоди до понедельника. Пиши в ЛС, проще будет.
To Rojnov.
Сейчас почти правильно (схема и код).
Косяки:
1. Убрать прерывание от таймера (он ПОКА!!!!! нах не нужен)
Indic: - Сделать из него Gosub в основном цикле. Там основные коряги.
2. Флаги внешних прерываний в обработчиках сбрасывать надо, а не устанавливать, иначе там и останешься навечно.
3. ВременнОе перекрытие оптопар, герконов, тайминги (тут вот жестко думать надо, от механики зависит). Тут может (должен) таймер пригодиться.
Блин, флеху с твоей почти обработанной мною темой на каторге забыл, погоди до понедельника. Пиши в ЛС, проще будет.
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
Добрый день
хочу реализовать приём и передачу девятого бита. Как инициализировать регистры для работы uart в режиме 9 бит я понял:
Код:
но как вычитывать девятый бит без использоваия ассемблера?
может кто работал и есть опыт?
хочу реализовать приём и передачу девятого бита. Как инициализировать регистры для работы uart в режиме 9 бит я понял:
Код:
Код: Выделить всё
$regfile = "m8adef.dat" '
$crystal = 4000000
Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 9но как вычитывать девятый бит без использоваия ассемблера?
может кто работал и есть опыт?


