Дата: Воскресенье, 30.12.2012, 20:36 | Сообщение # 1
Группа: Пользователи
Сообщений: 2
Статус: Offline
Я не являюсь программистом, а потому подолгу ищу свои ошибки, но с этой вообще не могу ничего понять.
$regfile = "m8def.dat" 'работаем с atmega8 $crystal = 4000000
Config Portb = Output Config Portd = Output Config 1wire = Portc.0 ' На Эту Ножку Подключим Ds18s20 И Подтягивающий Резистор На 4 , 7 Ком К + Питания
Declare Sub Read_temp(temp As Byte , Znak As Bit) Declare Sub Temp(byval Znak As Bit , Byval Temperature As Byte , Number1 As Byte , Number2 As Byte) Declare Sub Print_temp(number1 As Byte , Number2 As Byte , Delay_0 As Integer)
Dim Temperature_ As Byte Dim Znak_ As Bit Dim Num1_ As Byte , Num2_ As Byte
Select Case Byte1 Case &B00000000 : Znak = 0 Temp = Byte0 / 2 Case &B11111111 : Znak = 1 Temp = &B00000000 - Byte0 Temp = Temp / 2 Case Else : Temp = 77 Znak = 1 End Select
End Sub
Sub Temp(znak As Bit , Temperature As Byte , Number1 As Byte , Number2 As Byte)
'( 2 4 _ 3 |_| 1 6 |_| 5 °8 7 ')
Number1 = Temperature / 10 ' число десятков Number2 = Temperature Mod 10
Select Case Number1 Case 1 : Number1 = &B00010001 '1 Case 2 : Number1 = &B01101011 '2 Case 3 : Number1 = &B01011011 '3 Case 4 : Number1 = &B00011101 '4 Case 5 : Number1 = &B01011110 '5 Case 6 : Number1 = &B01111110 '6 Case 7 : Number1 = &B00010011 '7 Case 8 : Number1 = &B01111111 '8 Case 9 : Number1 = &B01011111 '9 Case 0 : Number1 = &B00000000 '0 End Select
Select Case Number2 Case 1 : Number2 = &B00010001 '1 Case 2 : Number2 = &B01101011 '2 Case 3 : Number2 = &B01011011 '3 Case 4 : Number2 = &B00011101 '4 Case 5 : Number2 = &B01011110 '5 Case 6 : Number2 = &B01111110 '6 Case 7 : Number2 = &B00010011 '7 Case 8 : Number2 = &B01111111 '8 Case 9 : Number2 = &B01011111 '9 Case 0 : Number2 = &B01110111 '0 End Select
If Znak = 1 Then Number2 = Number2 + &B10000000 ' зажигаем точку рядом со второй цифрой, если температура отрицательная
End Sub
Sub Print_temp(number1 As Byte , Number2 As Byte , Delay_0 As Integer)
Dim I As Integer
For I = 1 To 10000 Step 1 ' 20000 взято из расчета 2 сек на весь цикл Portb.1 = 1 ' общий провод num2 Portd = Number1 Portb.0 = 0 ' общий провод num1 Waitus Delay0 Portb.0 = 1 ' общий провод num1 Portd = Number2 Portb.1 = 0 ' общий провод num2 Waitus Delay0 Next
End Sub
На всякий случай прикрепил файл.
Ошибки прикрепил как картинку, не смог понять, как их в Bascom-AVR скопировать текстом..
не понимаю, зачем ему нужен byval. Вроде для того чтобы не менять переменную подставленную в функцию, но конкретно в этом случае зачем он ее просит?
А насчет второй ошибки мне вообще не ясно. То есть bascom считает, что переменной znak где-то может быть присвоено значение отличное от 0 и 1? А где тогда?
Дата: Воскресенье, 30.12.2012, 23:02 | Сообщение # 2
Группа: Свой человек
Сообщений: 175
Статус: Offline
Добрый вечер! При декларировании не используются переменные типа Bit. Только Byte, Word, Integer, Long, Single or String. При замене Znak на Byte у меня все скомпилировалось. Только Byval как положено везде поставить. Код под спойлером.
$regfile = "m8def.dat" 'работаем с atmega8 $crystal = 4000000
Config Portb = Output Config Portd = Output Config 1wire = Portc.0 ' На Эту Ножку Подключим Ds18s20 И Подтягивающий Резистор На 4 , 7 Ком К + Питания
Declare Sub Read_temp(temp As Byte , Znak As Byte) Declare Sub Temp(byval Znak As Byte , Byval Temperature As Byte , Number1 As Byte , Number2 As Byte) Declare Sub Print_temp(number1 As Byte , Byval Number2 As Byte , Byval Elay_0 As Integer)
Dim Temperature_ As Byte Dim Znak_ As Byte Dim Num1_ As Byte , Num2_ As Byte
Select Case Byte1 Case &B00000000 : Znak = 0 Temp = Byte0 / 2 Case &B11111111 : Znak = 1 Temp = &B00000000 - Byte0 Temp = Temp / 2 Case Else : Temp = 77 Znak = 1 End Select
End Sub
Sub Temp(znak As Byte , Temperature As Byte , Number1 As Byte , Number2 As Byte)
'( 2 4 _ 3 |_| 1 6 |_| 5 °8 7 ')
Number1 = Temperature / 10 ' число десятков Number2 = Temperature Mod 10
Select Case Number1 Case 1 : Number1 = &B00010001 '1 Case 2 : Number1 = &B01101011 '2 Case 3 : Number1 = &B01011011 '3 Case 4 : Number1 = &B00011101 '4 Case 5 : Number1 = &B01011110 '5 Case 6 : Number1 = &B01111110 '6 Case 7 : Number1 = &B00010011 '7 Case 8 : Number1 = &B01111111 '8 Case 9 : Number1 = &B01011111 '9 Case 0 : Number1 = &B00000000 '0 End Select
Select Case Number2 Case 1 : Number2 = &B00010001 '1 Case 2 : Number2 = &B01101011 '2 Case 3 : Number2 = &B01011011 '3 Case 4 : Number2 = &B00011101 '4 Case 5 : Number2 = &B01011110 '5 Case 6 : Number2 = &B01111110 '6 Case 7 : Number2 = &B00010011 '7 Case 8 : Number2 = &B01111111 '8 Case 9 : Number2 = &B01011111 '9 Case 0 : Number2 = &B01110111 '0 End Select
If Znak = 1 Then Number2 = Number2 + &B10000000 ' зажигаем точку рядом со второй цифрой, если температура отрицательная
End Sub
Sub Print_temp(number1 As Byte , Number2 As Byte , Delay_0 As Integer)
Dim I As Integer
For I = 1 To 10000 Step 1 ' 20000 взято из расчета 2 сек на весь цикл Portb.1 = 1 ' общий провод num2 Portd = Number1 Portb.0 = 0 ' общий провод num1 Waitus Delay0 Portb.0 = 1 ' общий провод num1 Portd = Number2 Portb.1 = 0 ' общий провод num2 Waitus Delay0 Next
End Sub
попробуй в Хэлпе к Баскому в поиске набрать Byval и посмотреть разделы Call и DeclareSub. Вроде так...
Дата: Воскресенье, 30.12.2012, 23:25 | Сообщение # 3
Группа: Пользователи
Сообщений: 2
Статус: Offline
Спасибо Вам огромное за ответ! Да, я пробовал с byte, оно работало. Просто хотел код по возможности сжать. А почитать про то почему тип bit не используется щас слажу в Google) Спасибо, RD3AVJ! С наступающим Вас! =)