$regfile = "m48def.dat"
$crystal = 4000000
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Config 1wire = Portc.5
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.0 , Rs = Portd.1
'Temp variables
Dim B As Byte
Dim W As Word
'Program variables
Dim Dg As Integer
Dim Min1 As Integer
Dim Min2 As Integer
Dim Min3 As Integer
Dim Min4 As Integer
Dim Max1 As Integer
Dim Max2 As Integer
Dim Max3 As Integer
Dim Max4 As Integer
Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim Sc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
Cls
W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Do
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()
Dsid4(1) = 1wsearchnext()
Loop Until Err = 1
'First sensor
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
Locate 1 , 1
Lcd "CRC OK Sensor 1 ID"
Wait 1
Locate 1 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
' Second sensor
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 2 , 1
Lcd "CRC OK Sensor 2 ID"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Wait 1
'Third sensor
If Dsid3(8) = Crc8(dsid3(1) , 7) Then
Locate 3 , 1
Lcd "CRC OK Sensor 3 ID"
Wait 1
Locate 3 , 1
For B = 1 To 8
Lcd Hex(dsid3(b))
Next
End If
Wait 1
'Fourth sensor
If Dsid4(8) = Crc8(dsid4(1) , 7) Then
Locate 4 , 1
Lcd "CRC OK Sensor 4 ID"
Wait 1
Locate 4 , 1
For B = 1 To 8
Lcd Hex(dsid4(b))
Next
End If
Wait 1
Cls
Init
' Main loop
Do
Convallt
Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200
1wverify Dsid1(1)
Locate 1 , 1
If Err = 1 Then
Lcd "Err "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8 ) Then
Dg = Decigrades(sc(9))
If Min1 > Dg Then Min1 = Dg
If Max1 < Dg Then Max1 = Dg
Lcd Dg : Locate 1 , 7 : Lcd Min1 : Locate 1 , 14 : Lcd Max1
End If
End If
1wverify Dsid2(1)
Locate 2 , 1
If Err = 1 Then
Lcd "DsId2 not on bus "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8 ) Then
Dg = Decigrades(sc(9))
If Min2 > Dg Then Min2 = Dg
If Max2 < Dg Then Max2 = Dg
Lcd Dg : Locate 2 , 7 : Lcd Min2 : Locate 2 , 14 : Lcd Max2
End If
End If
Wait 1
1wverify Dsid3(1)
Locate 3 , 1
If Err = 1 Then
Lcd "DsId3 not on bus "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8 ) Then
Dg = Decigrades(sc(9))
If Min3 > Dg Then Min3 = Dg
If Max3 < Dg Then Max3 = Dg
Lcd Dg : Locate 3 , 7 : Lcd Min3 : Locate 3 , 14 : Lcd Max3
End If
End If
Wait 1
1wverify Dsid4(1)
Locate 4 , 1
If Err = 1 Then
Lcd "DsId4 not on bus "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) ,8 ) Then
Dg = Decigrades(sc(9))
If Min4 > Dg Then Min4 = Dg
If Max4 < Dg Then Max4 = Dg
Lcd Dg : Locate 4 , 7 : Lcd Min4 : Locate 4 , 14 : Lcd Max4
End If
End If
Wait 1
Loop
End 'end program
'Sets variables and LCD for further use'''''''''''''''''''''''''''''''''''''''''
Sub Init
Cls
Lcd " Min Max"
Locate 2 , 1
Lcd " Min Max"
Locate 3 , 1
Lcd " Min Max"
Locate 4 , 1
Lcd " Min Max"
Min1 = 999 ' to get a real value from start
Min2 = 999
Min3 = 999
Min4 = 999
End Sub
Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
End Sub
Function Decigrades(byval Sc(9) As Byte)
Decigrades = 0
Decigrades = Makeint(sc(1) , Sc(2))
Decigrades = Decigrades * 10
Decigrades = Decigrades / 16
End Function
BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
Да, вот ,кстати, и код. Опрос 4-х датчиков. Не работает ни хрена. В чем засада?
Цапу крутить надо!!! Ку или не ку?
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
Нашел когда-то на польском форуме. Проверял, работает.
Код: Выделить всё
'Termometr 4 punktowy DS18b20 by Duch na podstawie materia¦ºw znalezionych w sieci
'Kontakt duszkowski@o2.pl
$regfile = "m8def.DAT" 'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000 'deklaracja czeÜtotlwioÜci pracy (wew oscylator 1MHz w zupe¦noÜci wystarcza)
'Deklaracja portºw od wyÜwietlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 20 * 2 'ustawiamy typ wyÜwietlacza (soft jest dostosowany do pracy z wyÜwietlaczem 2x20, przy pracy z innym wyÜwietlaczem trzeba búdzie skorygowaö wyÜwietlanie znakºw)
'*************************************WAïNE**********************************************
'Pamiútaö o pod¦¦czeniu rezystora podci¦gaj¦cego o wartoÜci 4.7kohm miúdzy lini¦ DQ a VCC
Config 1wire = Portd.5 'deklaracja portu na ktºrym búd¦ podpiúte DS18b20
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim B As Byte 'deklaracja zmiennej do odczytu kodºw ID
Dim W As Byte 'deklaracja zmiennej do odczytu iloÜc czujnikºw
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
Cursor Off 'Wy¦¦cza kursor
Cls 'Funkcja CLS czyÜci ekran
Lcd " Termometr by Duch " ; 'ekran startowy (pojawia siú tylko podczas w¦¦czania urz¦dzenia)
Lowerline
Lcd " 2007 "
Wait 5
Cls
W = 1wirecount()
Lcd "Ilosc czujnikow:" 'Informuje ile czujnikºw jest podpiútych do uk¦adu (pojawia siú tylko podczas w¦¦czania urz¦dzenia)
Waitms 500
Lcd W
Wait 3
Cls 'Znajdß pierwszy czujnik podpiúty do portu
Dsid1(1) = 1wsearchfirst() 'Znajdß kolejny czujnik podpiúty do portu
Dsid2(1) = 1wsearchnext() 'Znajdß kolejny czujnik podpiúty do portu
Dsid3(1) = 1wsearchnext() 'Znajdß kolejny czujnik podpiúty do portu
Dsid4(1) = 1wsearchnext()
'*******************Odczyt numerºw ID czujnikºw temperatury*********************
If Dsid1(8) = Crc8(dsid1(1) , 7) Then 'ta opcja pojawia siú tylko przy w¦¦czaniu urz¦dzenia
Locate 1 , 1
Lcd "CRC OK Czujnik 1 ID"
Wait 1
Locate 1 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
Wait 2
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 2 , 1
Lcd "CRC OK Czujnik 2 ID"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Wait 2
If Dsid3(8) = Crc8(dsid3(1) , 7) Then
Locate 1 , 1
Lcd "CRC OK Czujnik 3 ID"
Wait 1
Locate 1 , 1
For B = 1 To 8
Lcd Hex(dsid3(b))
Next
End If
Wait 2
If Dsid4(8) = Crc8(dsid4(1) , 7) Then
Locate 2 , 1
Lcd "CRC OK Czujnik 4 ID"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid4(b))
Next
End If
Wait 2
Cls
'*******************koniec odczytu ID czujnikºw temperatury*********************
Do
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysy¦amy adres pierwszego czujnika
1wwrite &HBE
I1 = 1wread(2)
'----------
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
1wwrite &HBE
I2 = 1wread(2)
'----------
1wreset
1wwrite &H55
1wverify Dsid3(1) 'wysylam adres trzeciego czujnika
1wwrite &HBE
I3 = 1wread(2)
'----------
1wreset
1wwrite &H55
1wverify Dsid4(1) 'wysylam adres czwartego czujnika
1wwrite &HBE
I4 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
'****JeÜli pracujesz z wyÜwietlaczem innym ni¬ 2x20 to tutaj trzeba wprowadziö zmiany w LOCATE********
I1 = I1 * 10
I1 = I1 / 16
'If I1 > 0 Then Cls 'korekta przesuniecia znaku st C przy przejÜciu z temp ujemnej na dodatni¦
Ss = Str(i1)
Ss = Format(ss , " 0.0")
Locate 1 , 1 'Pozycja wyÜwietlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
Lcd "Zew" ; Ss ; Chr(0) ;
I2 = I2 * 10
I2 = I2 / 16
'If I2 > 0 Then Cls
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Locate 2 , 1
Lcd "Lod" ; Ss ; Chr(0) ;
I3 = I3 * 10
I3 = I3 / 16
'If I3 > 0 Then Cls
Ss = Str(i3)
Ss = Format(ss , " 0.0")
Locate 1 , 11
Lcd "Wew " ; Ss ; Chr(0) ;
I4 = I4 * 10
I4 = I4 / 16
'If I4 > 0 Then Cls
Ss = Str(i4)
Ss = Format(ss , " 0.0")
Locate 2 , 11
Lcd "Piec" ; Ss ; Chr(0) ;
Loop
'Koniec programu
'Pozdrawiam DuchТого, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Re: BASCOM AVR в вопросах и ответах
Спасибо, переработаю и попробую. Результат напишу.
Цапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
Переделал для своего варианта - получается опять хрень...
смотри вложения:
смотри вложения:
Цапу крутить надо!!! Ку или не ку?
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
Я протэусу не доверяю. Завтра попробую в железе, отпишусь.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Здравствуйте уважаемые коты! В микроконтроллерах я новичок, дел с ними не разу не имел, но вот пришла пора заменить сделанную мной два года назад ненадёжно работающую аналоговую схему чем то более надежным, простым, стабильным с более гибкими характеристиками. Выход, как следует - микроконтроллер. Попытался самостоятельно его освоить, но полмесяца уже изучаю, а даже толком мигать светодиодом не научился. Bascom выбрал так как там более проще новичку, в си вообще какая то каша получается. И раз обучение оказалось таким сложным и долгим(чтоб написать нужную мне программу такими темпами уйдет месяца три), а время не ждет, то решил обратится за помощью к вам. Надеюсь пинать меня не будете, а поможете встать на путь истинный.
В общем устройство - панель индикации на мотоцикле. Конкретно - светодиодные указатели (температуры и топлива). У меня они абсолютно идентичны, схемы аналоговые, с возможностью гибкой настройки. Теперь хотелось бы выполнить то же самое в цифре, заодно лишившись множество ненужных элементов.
Принцип работы схемы на контроллере мне хотелось бы иметь таким: измеряем входное напряжение(сопротивление терморезистора или тому подобное), при достижении нужных значений зажигаем соответствующий светодиод. Ещё нужно чтоб была гибкая настройка момента вспыхивания каждого светодиода в виде: измерили 1 значение, нажали кнопку - значение запомнилось; измерили второе - нажали- запомнили; затем мк зажигает нужные светодиоды по записанным значениям.
Как я понял, дело придется иметь с еепром, для нужной цели был выбран ATmega8 - заодно будет запас по функциям.
Алгоритм мне представляется такой: включаем устройство, нажимаем кнопку - система входит в режим записи. Греем терморезистор до первой температуры - нажимаем кнопку - значение ацп записывается в еепром. И так все нужные значения. Нажимаем кнопку - устройство входит в стандартный режим работы. После этого, а так же после каждого последующего включения устройства, записанные данные ацп считываются с еепром, в процессе работы эти данные сравниваются с полученными данными ацп от датчика и зажигается соответствующий светодиод.
Пытаюсь выполнить это программно, но знаний не хватает, толком ничего не выходит. В протеусе попробовал симулировать(сильно упрощенную версию - для принципа работы), тоже плохо получается. В железе пока не пробовал - в нем спаяна простенькая схема, на которой тренируюсь зажигать светодиоды как хочу, а не как получится.
Вот ниже прилагаю схему в протеусе и примерную программу, что у меня вышло.
В общем устройство - панель индикации на мотоцикле. Конкретно - светодиодные указатели (температуры и топлива). У меня они абсолютно идентичны, схемы аналоговые, с возможностью гибкой настройки. Теперь хотелось бы выполнить то же самое в цифре, заодно лишившись множество ненужных элементов.
Принцип работы схемы на контроллере мне хотелось бы иметь таким: измеряем входное напряжение(сопротивление терморезистора или тому подобное), при достижении нужных значений зажигаем соответствующий светодиод. Ещё нужно чтоб была гибкая настройка момента вспыхивания каждого светодиода в виде: измерили 1 значение, нажали кнопку - значение запомнилось; измерили второе - нажали- запомнили; затем мк зажигает нужные светодиоды по записанным значениям.
Как я понял, дело придется иметь с еепром, для нужной цели был выбран ATmega8 - заодно будет запас по функциям.
Алгоритм мне представляется такой: включаем устройство, нажимаем кнопку - система входит в режим записи. Греем терморезистор до первой температуры - нажимаем кнопку - значение ацп записывается в еепром. И так все нужные значения. Нажимаем кнопку - устройство входит в стандартный режим работы. После этого, а так же после каждого последующего включения устройства, записанные данные ацп считываются с еепром, в процессе работы эти данные сравниваются с полученными данными ацп от датчика и зажигается соответствующий светодиод.
Пытаюсь выполнить это программно, но знаний не хватает, толком ничего не выходит. В протеусе попробовал симулировать(сильно упрощенную версию - для принципа работы), тоже плохо получается. В железе пока не пробовал - в нем спаяна простенькая схема, на которой тренируюсь зажигать светодиоды как хочу, а не как получится.
Вот ниже прилагаю схему в протеусе и примерную программу, что у меня вышло.
Код: Выделить всё
Config Portb = Output
Config Portc.0 = Input
Config Portc.1 = Input
Config Portc.4 = Output
Config Portc.5 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim I1 As Integer
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim I5 As Integer
Dim A As Byte
Dim N As Integer
Dim B As Bit
Dim B1 As Byte
Dim X1 As Eram Integer
Dim X2 As Eram Integer
Dim X3 As Eram Integer
Dim X4 As Eram Integer
Dim X5 As Eram Integer
Const Debouncetime = 75
Config Portd.2 = Input
Config Portd.3 = Input
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 1024
A = 0
On Int0 Sapis
On Int1 Regim
On Timer0 Pulse
Enable Interrupts
Enable Int0
Start Adc
Zapis:
If A = 1 Then X1 = N
If A = 2 Then X2 = N
If A = 3 Then X3 = N
If A = 4 Then X4 = N
If A = 5 Then X5 = N
If A = 6 Then A = 0
I1 = X1
I2 = X2
I3 = X3
I4 = X4
I5 = X5
Do
If B1 <> 0 Then
Enable Timer0
Else
Disable Timer0
End If
N = Getadc(0)
If B = 1 Then
B = 0
Goto Zapis
End If
If N <= I1 Then
Set Portb.0
Reset Portb.1
Reset Portb.2
Reset Portb.3
Reset Portb.4
Reset Portb.5
End If
If N > I1 And N <= I2 Then
Set Portb.1
Reset Portb.0
Reset Portb.2
Reset Portb.3
Reset Portb.4
Reset Portb.5
End If
If N > I2 And N <= I3 Then
Set Portb.2
Reset Portb.1
Reset Portb.0
Reset Portb.3
Reset Portb.4
Reset Portb.5
End If
If N > I3 And N <= I4 Then
Set Portb.3
Reset Portb.1
Reset Portb.0
Reset Portb.2
Reset Portb.4
Reset Portb.5
End If
If N > I4 And N <= I5 Then
Set Portb.4
Reset Portb.1
Reset Portb.0
Reset Portb.3
Reset Portb.2
Reset Portb.5
End If
If N > I5 Then
Set Portb.5
Reset Portb.1
Reset Portb.0
Reset Portb.3
Reset Portb.4
Reset Portb.2
End If
Loop
Sapis:
Gifr = 64
A = A + 1
B = 1
Return
Regim:
Gifr = 64
If B1 = 0 Or B1 = 1 Then B1 = B1 + 1
If B1 = 3 Then B1 = 0
Return
Pulse:
If B1 = 1 Then Toggle Portc.4
If B1 = 2 Then Toggle Portc.5
Return
End 'end programRe: BASCOM AVR в вопросах и ответах
Сдается мне, для данного проекта 8 меги маловато будет (судя по потребностям), а вот мега16 в самый раз!, немного неясно , что да как, если можно - более подробно техническое задание, т.е. что куда приходит и что откуда выходит. Порты обозначать не надо, достаточно обозвать сигналы.
Что сие означает???, более подробно и более понятно (желательно инженерными терминами).
Да, и еще, что такое "СТАНДАРТНЫЙ РЕЖИМ" ???? Чего он делает? И какие это "ЭТИ" данные???
Вы то хоть сами поняли чего написали???
Нажимаем кнопку - устройство входит в стандартный режим работы. После этого, а так же после каждого последующего включения устройства, записанные данные ацп считываются с еепром, в процессе работы эти данные сравниваются с полученными данными ацп от датчика и зажигается соответствующий светодиод.
Что сие означает???, более подробно и более понятно (желательно инженерными терминами).
Да, и еще, что такое "СТАНДАРТНЫЙ РЕЖИМ" ???? Чего он делает? И какие это "ЭТИ" данные???
Вы то хоть сами поняли чего написали???
Цапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
То max50: надеюсь свидимся, тогда и поговорим
Цапу крутить надо!!! Ку или не ку?
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Извините, просто текст большой был, вот и немного путанно и написал.
Меги8 - хватит - будет 2 аналогичных устройства на 2х мк
Распишу более подробно.
1 устройство - указатель температуры с индикацией на восьми светодиодах.
Имеем датчик температуры в виде терморезистора(не помню какой, он уже 2 года стоит). Через простейший делитель он подключен к входу ацп. При изменении его сопротивления напряжение на входе ацп меняется, и этим ацп измеряется и выводится в виде фиксированного значения на один из восьми светодиодов. То есть получается простейший омметр. Теперь нам остается этот омметр правильно откалибровать, чтоб он показывал нужные значения.
С калибровкой сложнее. Чтоб можно было менять не только терморезистор, но и значения, при которых зажигаются светодиоды(вдруг понадобится изменить шкалу) и при этом не прошивать устройство новыми значениями каждый раз, делаем возможность калибровать рабочее устройстве. В результате получится гибкий индикатор. Можем подключить на вход любое изменяемое сопротивление(терморезистор, реостат с датчика уровня топлива, или просто подведем измеряемое напряжение), нажатием кнопок откалибруем чтоб при нужном сопротивлении или напряжении загорался нужный нам светодиод.
Работу этой калибровки представляю так:
так называемый "стандартный режим" - простой режим работы указателя, он измеряет температуру(сопротивление терморезистора) и выводит на светодиоды. То есть делает именно то, для чего и предназначен. Подаем питание на устройство - и оно работает как указатель.
Теперь начинаем процесс калибровки. Для этого нажимаем предназначенную кнопку, и устройство входит в калибровочный режим. Греем терморезистор до нужной нам температуры№1, при которой должен загореться первый светодиод. Нажимаем вторую кнопочку - это первое значение заносится в память. Затем нагреваем резюк дальше до температуры №2, при которой будет гореть светодиод №2. Нажимаем снова вторую кнопочку - второе значение записали в память. И так последовательно запоминаем все 8 значений . После этого нажимаем первую кнопку, и устройство выходит из калибровочного режима, и начинает работать в стандарте, то есть как положено: зажигать светодиоды в зависимости от нагрева терморезистора, в соответствии с проведенной калибровкой.
вот как мог так объяснил принцип работы нужного устройства. Если сделать возможность подобной калибровки, то это устройство можно использовать в различных указателях, меняя только входной датчик. Так же можно спокойно изменять шкалу, если старая не устраивает значениями.
Встречал схему простого бортового компьютера на этом контроллере, там он подключался к стандартному реостатному датчику топлива, и калибровался именно таким способом - залили в бак литр- два - кнопку нажали - значение запомнилось.
Меги8 - хватит - будет 2 аналогичных устройства на 2х мк
Распишу более подробно.
1 устройство - указатель температуры с индикацией на восьми светодиодах.
Имеем датчик температуры в виде терморезистора(не помню какой, он уже 2 года стоит). Через простейший делитель он подключен к входу ацп. При изменении его сопротивления напряжение на входе ацп меняется, и этим ацп измеряется и выводится в виде фиксированного значения на один из восьми светодиодов. То есть получается простейший омметр. Теперь нам остается этот омметр правильно откалибровать, чтоб он показывал нужные значения.
С калибровкой сложнее. Чтоб можно было менять не только терморезистор, но и значения, при которых зажигаются светодиоды(вдруг понадобится изменить шкалу) и при этом не прошивать устройство новыми значениями каждый раз, делаем возможность калибровать рабочее устройстве. В результате получится гибкий индикатор. Можем подключить на вход любое изменяемое сопротивление(терморезистор, реостат с датчика уровня топлива, или просто подведем измеряемое напряжение), нажатием кнопок откалибруем чтоб при нужном сопротивлении или напряжении загорался нужный нам светодиод.
Работу этой калибровки представляю так:
так называемый "стандартный режим" - простой режим работы указателя, он измеряет температуру(сопротивление терморезистора) и выводит на светодиоды. То есть делает именно то, для чего и предназначен. Подаем питание на устройство - и оно работает как указатель.
Теперь начинаем процесс калибровки. Для этого нажимаем предназначенную кнопку, и устройство входит в калибровочный режим. Греем терморезистор до нужной нам температуры№1, при которой должен загореться первый светодиод. Нажимаем вторую кнопочку - это первое значение заносится в память. Затем нагреваем резюк дальше до температуры №2, при которой будет гореть светодиод №2. Нажимаем снова вторую кнопочку - второе значение записали в память. И так последовательно запоминаем все 8 значений . После этого нажимаем первую кнопку, и устройство выходит из калибровочного режима, и начинает работать в стандарте, то есть как положено: зажигать светодиоды в зависимости от нагрева терморезистора, в соответствии с проведенной калибровкой.
вот как мог так объяснил принцип работы нужного устройства. Если сделать возможность подобной калибровки, то это устройство можно использовать в различных указателях, меняя только входной датчик. Так же можно спокойно изменять шкалу, если старая не устраивает значениями.
Встречал схему простого бортового компьютера на этом контроллере, там он подключался к стандартному реостатному датчику топлива, и калибровался именно таким способом - залили в бак литр- два - кнопку нажали - значение запомнилось.
- saschai
- Говорящий с текстолитом
- Сообщения: 1596
- Зарегистрирован: Вс дек 14, 2008 20:36:47
- Откуда: SPb
Re: BASCOM AVR в вопросах и ответах
Перенес
Последний раз редактировалось saschai Сб мар 12, 2011 11:54:58, всего редактировалось 5 раз.
Re: BASCOM AVR в вопросах и ответах
max50 писал(а):Нашел когда-то на польском форуме. Проверял, работает.
Дай наводку на форум, плииз. Охота с земляками об МК побазарить.
- saschai
- Говорящий с текстолитом
- Сообщения: 1596
- Зарегистрирован: Вс дек 14, 2008 20:36:47
- Откуда: SPb
Re: BASCOM AVR в вопросах и ответах
Поскольку здесь базар о земляках
пошел, перенес в др. тему
Мужчины в личке решайте свои домашние проблемы, а не в закрепленной темме
Мужчины в личке решайте свои домашние проблемы, а не в закрепленной темме
Последний раз редактировалось saschai Сб мар 12, 2011 12:31:48, всего редактировалось 3 раза.
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
Jack_A писал(а):max50 писал(а):Нашел когда-то на польском форуме. Проверял, работает.
Дай наводку на форум, плииз. Охота с земляками об МК побазарить.
http://www.elektroda.pl/rtvforum/topic811706-0.html
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Re: BASCOM AVR в вопросах и ответах
Помогите пожалуйста реализовать код опроса кнопки. Перечитал кучу рускоязычных ссылок в инете, но воз и ныне там
....
Всего в устройстве 3 кнопки. Для опроса кнопок использую команду DEBOUNCE. С работой двух кнопок я справился, используя данную команду, а вот алгоритм работы третьей и основной кнопки сложный.
Мне необходимо реализовать следующий алгоритм работы данной кнопки:
1. одно короткое нажатие вызывает подпрограмму начала работы устройства (Старт)
2. второе короткое нажатие должно остановить выполнение этого действия (стоп)
3. Длительное же нажатие данной кнопки, порядка 1 секунды, должно вызывать подпрограмму (Установка)
Все указанные подпрограммы написаны и поотдельности работают. Но вот с кодом третьей кнопки затык
Желательно использовать для опроса этой кнопки прерывание INT0, но пока не получилось написать корректный код для этого.
Пробовал использовать указанный в данной теме пример с использованием условия с задержкой и командой DEBOUNCE, но получил лишь нестабильный опрос и работу только 1 и 3 пункта
В программировании новичок, недавно начал изучать баском, так как с СИ были у меня проблемы.
PS Timer0 и Timer1 уже используются в программе
PPS Для чего это надо - не секрет
. Делаю таймер и хочу после отладки кода и проверки в железе на макетке, вместо кнопок подключить энкодер и сделать все управление таймера на нем
Очень прошу, помогите!
Всего в устройстве 3 кнопки. Для опроса кнопок использую команду DEBOUNCE. С работой двух кнопок я справился, используя данную команду, а вот алгоритм работы третьей и основной кнопки сложный.
Мне необходимо реализовать следующий алгоритм работы данной кнопки:
1. одно короткое нажатие вызывает подпрограмму начала работы устройства (Старт)
2. второе короткое нажатие должно остановить выполнение этого действия (стоп)
3. Длительное же нажатие данной кнопки, порядка 1 секунды, должно вызывать подпрограмму (Установка)
Все указанные подпрограммы написаны и поотдельности работают. Но вот с кодом третьей кнопки затык
Желательно использовать для опроса этой кнопки прерывание INT0, но пока не получилось написать корректный код для этого.
Пробовал использовать указанный в данной теме пример с использованием условия с задержкой и командой DEBOUNCE, но получил лишь нестабильный опрос и работу только 1 и 3 пункта
В программировании новичок, недавно начал изучать баском, так как с СИ были у меня проблемы.
PS Timer0 и Timer1 уже используются в программе
PPS Для чего это надо - не секрет
Очень прошу, помогите!
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Немного разобрался с работой кнопок(пока тренируюсь на бегущем огоньке). Если в начале я использовал включение светодиодов в основном цикле, а на кнопках использовал прерывания и в них устанавливал флаги, то программа получалась сложной и запутанной, и пока не выполняла все действия в основном цикле, не менялась. Теперь использую управление светодиодами в прерывании таймера, а в основном цикле идет всего лишь опрос кнопок через debounce, и в подпрограммах кнопок уже управляю таймером и другими переменными. При тестировании в железе программа сразу же заработала так как хотелось.
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
serg_svd, поподробней опиши, что да как должно быть по третьей кнопке, ну и код программы. Сам сейчас реализовал пример, в котором одна кнопка выполняет три разных действия - в основной программе переключает одно, длительное нажатие запускает и останавливает подпрограмму, а в подпрограмме переключает другое.
- ZverXz
- Открыл глаза
- Сообщения: 45
- Зарегистрирован: Ср авг 19, 2009 20:46:13
- Откуда: Липецкая область, город Грязи
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Здрасьте. Собрал программатор по этой ссылке http://radioded.ru/content/view/100/1 но никак не получается прошить контроллер(атмега32). Пишет ошибку
avrdude.exe: can't open device "LPT1"
avrdude.exe: failed to open parallel port "LPT1"
что надо проверить? Спаял как и там все по схме, но только на макетке.
avrdude.exe: can't open device "LPT1"
avrdude.exe: failed to open parallel port "LPT1"
что надо проверить? Спаял как и там все по схме, но только на макетке.
Re: BASCOM AVR в вопросах и ответах
To max50: Это я тупанул мальца...
Все работает. Это в Протеусе на 4МГц глючит - в железе все ОК! Спасибо, Макс! Выручил. 

Цапу крутить надо!!! Ку или не ку?
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
Igor_67 писал(а):To max50: Это я тупанул мальца...Все работает. Это в Протеусе на 4МГц глючит - в железе все ОК!
Я помню, что на 8 меге работало, а на 48 проверить руки не дошли.
Igor_67 писал(а):Спасибо, Макс! Выручил.
Не за что!
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
ZverXz писал(а):Здрасьте. Собрал программатор по этой ссылке http://radioded.ru/content/view/100/1 но никак не получается прошить контроллер(атмега32). Пишет ошибку
avrdude.exe: can't open device "LPT1"
avrdude.exe: failed to open parallel port "LPT1"
что надо проверить? Спаял как и там все по схме, но только на макетке.
Проверить наличие порта. Дудка его не может открыть.
А что мешает установить PonyProg? Он точно поддерживат LPT. У меня такой программатор несколько лет работает без проблем. Но лучше собрать USB-програматор. 32 мегу будет быстрее шить.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.