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

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

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

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


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


работа с DS1990

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

1

Подскажите, как организовать работу с датчиком DS1990.

Необходимо чтение и эмулирование ключей.
В инете много примеров на асм и С, а в Bascom avr, что-то не встречал

0

2

Добрый день. Неужели никто не может подсказать как организовать работу с DS1990 в Bascom avr. Может есть встроенные функции?

0

3

а поиск????
DS18B20 - помогите пожалуйста
обычный протокол: принял-передал

0

4

18B20 хорошо расписано, протокол отличается по сути только кодом семейства , КС(не помню точно, поправьте, если не верно) считается так же

0

5

Вы меня извините, если что. Но как я понял DS1990 это электронный ключ.
Я только начинаю знакомиться с программированием и поэтому многого не знаю.
Если кто-то писал программу для считывания и эмулирования ключей буду рад ознакомиться с исходным кодом, так как еще раз говорю, что я полный чайник.

0

6

44 страница. Есть схема, плата, исходник на Васике.

0

7

вот подсмотрел у буржуев

Код:
'////////////////////////////////////////////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////
'/////////                                                                      /////////
'///////// Piotr "JamP" Jamrozik                                                /////////
'/////////           OBS£UGA PASTYLEK DALLAS DS1990A DLA PROCESORÓW 51          /////////
'/////////                       Z WYLICZANIEM SUMY CRC                         /////////
'/////////                                                                      /////////
'////////////////////////////////////////////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////


$regfile = "m8def.dat"                                      'Definicja pliku procesora
'$large                          'Model adresowania pamiêci
$crystal = 11059200                                         'Czêstotliwoœæ generatora procesora
$sim
Config Lcd = 20 * 4                                         'Typ wyœwietlacza LCD
Config Lcdbus = 4                                           'Magistrala LCD 4 bity
Config Lcdpin = Pin , Db4 = P2.3 , Db5 = P2.2 , Db6 = P2.1 , Db7 = P2.0 , E = P2.4 , Rs = P2.5       'Definicja wyprowadzeñ LCD
Deflcdchar 0 , 12 , 6 , 18 , 3 , 3 , 18 , 6 , 12            'Uœmiechniêta buŸka :)
Dim Ar(8) As Byte                                           'Tablica danych klucza DS1990
Config 1wire = P2.6                                         'Definicja portu dla magistrali 1wire

Dim I As Byte                                               'Licznik pêtli
Dim Crc As Byte                                             'Suma CRC
Dim Crcp As Byte                                            'Zmienna pomocnicza dla CRC

'////////////////////////////
'/////  START PROCEDUR  /////
'////////////////////////////
Cursor Off Noblink
Cls
Lcd "   CZYTNIK DS1990   "
'----------
Do
Call O1990                                                  'Skok do obslugi pastylki DS1990
Loop
'----------
'///////////////////////////////////////////////////////////
'///// PROCEDURA ODCZYTU I WYŒWIETLANIA KODU Z DS 1990A ////
'///////////////////////////////////////////////////////////
Sub O1990
Waitms 50
1wreset
   If Err = 1 Then
      Return
   Else
      1wwrite &H33
         For I = 1 To 8
            Ar(i) = 1wread()
         Next I
         Call Crc1990                                       'Skok do procedury wyliczaj¹cej CRC
            If Crc <> Ar(8) Then                            'Kontrole poprawnoœci sum CRC z DS1990
            Elseif Crc = 0 Then
            Elseif Ar(8) = 0 Then
            Elseif Crc = 255 Then
            Elseif Ar(8) = 255 Then
            Else                                            'Gdy nie wykryto blêdnego odczytu pastylki
               Locate 3 , 1                                 'zostanie wyœwietlony numer wraz z sum¹
               Lcdhex Ar(8)                                 'kontroln¹ CRC i numerem serii pastylki
               Locate 3 , 11                                'DS1990
               Lcdhex Ar(1)
               Locate 4 , 1
               Lcdhex Ar(7) ; Ar(6) ; Ar(5) ; Ar(4) ; Ar(3) ; Ar(2)
               Call Pastylkaok                              'Tu wstaw swoj¹ procedurê obslugi
            End If
   End If
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Crc1990                                                 'Procedura wyliczania CRC dla DS1990
Crc = 0
    For I = 1 To 7
       Crcp = Crc Xor Ar(i)
       Crc = Lookup(crcp , Crc8)
    Next
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Pastylkaok                                              'Procedura Obslugi pastylki
Locate 2 , 1
Lcd Chr(0)
End Sub
'//////////////////////////////////////////////////////////////////////////////
'Tablica do wyliczania CRC dla DS1990
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53
'/////////////////////////////   KONIEC PROGRAMU   /////////////////////////////

Помогите разобраться. Что-то не работает.

0

8

Этот код для MSC51, а не для AVR. У меги8 нет порта P2. Как минимум надо:
$sim - заремить, ЖКИ подключить примерно так:

Код:
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6

а 1wire - примерно так : Config 1wire = Portb.5 
Ну а дальше смотреть.

0

9

сделал вот так

Код:
'////////////////////////////////////////////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////
'/////////                                                                      /////////
'///////// Piotr "JamP" Jamrozik                                                /////////
'/////////           OBS£UGA PASTYLEK DALLAS DS1990A DLA PROCESORÓW 51          /////////
'/////////                       Z WYLICZANIEM SUMY CRC                         /////////
'/////////                                                                      /////////
'////////////////////////////////////////////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////


$regfile = "m8def.dat"                                      'Definicja pliku procesora
'$large                          'Model adresowania pamiêci
$crystal = 11059200                                         'Czêstotliwoœæ generatora procesora
$sim
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portc.7 , Rs = Portc.6       'Definicja wyprowadzeñ LCD
Deflcdchar 0 , 12 , 6 , 18 , 3 , 3 , 18 , 6 , 12            'Uœmiechniêta buŸka :)
Dim Ar(8) As Byte                                           'Tablica danych klucza DS1990
Config 1wire = Portc.5                                      'Definicja portu dla magistrali 1wire

Dim I As Byte                                               'Licznik pêtli
Dim Crc As Byte                                             'Suma CRC
Dim Crcp As Byte                                            'Zmienna pomocnicza dla CRC

'////////////////////////////
'/////  START PROCEDUR  /////
'////////////////////////////
Cursor Off Noblink
Cls
Lcd "   CZYTNIK DS1990   "
'----------
Do
Call O1990                                                  'Skok do obslugi pastylki DS1990
Loop
'----------
'///////////////////////////////////////////////////////////
'///// PROCEDURA ODCZYTU I WYŒWIETLANIA KODU Z DS 1990A ////
'///////////////////////////////////////////////////////////
O1990:
Waitms 50
1wreset
   If Err = 1 Then
      Return
   Else
      1wwrite &H33
         For I = 1 To 8
            Ar(i) = 1wread()
         Next I
         Call Crc1990                                       'Skok do procedury wyliczaj¹cej CRC
            If Crc <> Ar(8) Then                            'Kontrole poprawnoœci sum CRC z DS1990
            Elseif Crc = 0 Then
            Elseif Ar(8) = 0 Then
            Elseif Crc = 255 Then
            Elseif Ar(8) = 255 Then
            Else                                            'Gdy nie wykryto blêdnego odczytu pastylki
               Locate 3 , 1                                 'zostanie wyœwietlony numer wraz z sum¹
               Lcdhex Ar(8)                                 'kontroln¹ CRC i numerem serii pastylki
               Locate 3 , 11                                'DS1990
               Lcdhex Ar(1)
               Locate 4 , 1
               Lcdhex Ar(7) ; Ar(6) ; Ar(5) ; Ar(4) ; Ar(3) ; Ar(2)
               Call Pastylkaok                              'Tu wstaw swoj¹ procedurê obslugi
            End If
   End If
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Crc1990                                                 'Procedura wyliczania CRC dla DS1990
Crc = 0
    For I = 1 To 7
       Crcp = Crc Xor Ar(i)
       Crc = Lookup(crcp , Crc8)
    Next
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Pastylkaok                                              'Procedura Obslugi pastylki
Locate 2 , 1
Lcd Chr(0)
End Sub
'//////////////////////////////////////////////////////////////////////////////
'Tablica do wyliczania CRC dla DS1990
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53
'/////////////////////////////   KONIEC PROGRAMU   /////////////////////////////

но вот такие ошибки
http://uploads.ru/t/S/k/H/SkH1M.jpg

0

10

Вот пример на АСМ

Код:
WR1wire:; Попрограмма передачи байта по 1-wire интерфейса
        ; Передаёт байт из регистра outByte

ldi	bit,8
WR1_l1:cli	    ; Запрещаем обработку прерываний

sbi	DDR1wire, BIT1wire  ; Переводим линию в "0" в течении минимум 1 мкс	
rcall	RD1_dummy          ; (при частоте 4 -> 1.75 мкс)
sbrc	outByte,0
  cbi	DDR1wire, BIT1wire  ; Если нужно выдать "1" переводим линию в "1" сразу же
ror	outByte
                                            ; Выдерживаем интервал Tslot=80 мкс
ldi	DelayReg,(320+2)/3 ; (4 * 80) - 6 - 12
rcall	usDelay
cbi	DDR1wire, BIT1wire    ; переводим линию в "1"
  sei	    ; Разрешение прерываний
ldi	DelayReg,8     ; Выдерживаем интервал Tslot>=8 мкс
rcall	usDelay
dec	bit
brne	WR1_l1
ret
; ****************************************************************************
Init1wire:	; Попрограмма инициализации устройств расположеных на шине 1-wire
sbi	DDR1wire, BIT1wire  ; Переводим линию в "0"
ldi	DelayReg,180	     ; Ждём >480 мкс (525 мкс)
rcall	usDelay
rcall	usDelay2
cli
cbi	DDR1wire, BIT1wire  ; Переводим линию в "1"
ldi	DelayReg, 90	     ; 
rcall	usDelay	           ; Ждём 69 мкс
sbic  PIN1wire,BIT1wire   ; если на входе 1
	   rjmp ba_i1w               ; то переходим
sei
ldi	DelayReg, 55	     ; 
rcall	usDelay	           ; Ждём ещё 240 мкс	
rcall	usDelay	
      sbic  PIN1wire,BIT1wire   ; если на входе 1
      rjmp delay240_1820        ; то переходим
ldi temp,$BF              ;  иначе всё ещё "0" на входе
    	sts A1820+1,temp	        ;  похоже КЗ,  в ОЗУ ($BF в старший байт температуры)
    ret                       ; выходим
   ba_i1w:           ; обрыв
      sei
ldi temp,$7F              ;  "0" на входе нет,
    	sts A1820+1,temp	        ;   похоже обрыв, в ОЗУ ($7F в старший байт температуры)	    	
    ret                       ; выходим
   delay240_1820:
   ;   ldi temp,$EF              ; датчик присутствует и в норме
	;	ldi	DelayReg, 55	     ; ждём ещё 240 мкс
	;	rcall	usDelay	           ; для завершения	
	;	rcall	usDelay             ; внутренних процедур инициализации
    ret
; ****************************************************************************
CRC8calc:; Подпрограмма вычисления CRC8 блока памяти начиная с указателя Z
         ; длиной count байт
         ; Использует регистры Z, R0
clr	CRC8accum
ldi	CRC8mask, 0x0C
CRC8_l1: ld	R0, Z+
   ldi	bit,8
CRC8_l2: ror	R0
   ror	CRC8accum
   brcc	CRC8_l3
   subi	CRC8accum, 0x80	; Инверсия старшего бита накопителя CRC8
CRC8_l3:	brpl	CRC8_l4
   eor	CRC8accum, CRC8mask
CRC8_l4:	dec	bit
   brne	CRC8_l2
   dec	count
   brne	CRC8_l1
 ;  tst	CRC8accum
ret
; ****************************************************************************

;=====================================================================================================
; При наличии таблетки TM и соответствующего режима считываем её.

TMem_1wire:
     mov temp,rgf2             ; копируем флаги режима
     andi temp,0b00011111      ; выделяем текущий режим
     cpi temp, 0b00011001      ; если стоит режим 1Wire master
     breq     PC+2             ; то переход
    ret                  ; иначе выход

sbi	DDR1wTM,BIT1wTM    ; Переводим линию в "0"
ldi	DelayReg, 180	     ; Ждём >480 мкс (525 мкс)
rcall	usDelay
rcall	usDelay2
cli                       ; запретим прерывания
cbi	DDR1wTM,BIT1wTM    ; Переводим линию в "1"
ldi	DelayReg, 90	     ; 
rcall	usDelay	           ; Ждём 69 мкс
sbis  PIN1wTM,BIT1wTM    ; если на входе "0"
rjmp init2_TM             ; то переход
	   sei                       ;
ldi temp,$FE              ; иначе заносим
sts ATM+6,temp        ; в ОЗУ признак отсутствия таблетки на линии ($FE)
	  rjmp exitTMem1W        ; и выходим
	
	 init2_TM:
	   sei                       ; разрешим прерывания
ldi	DelayReg, 55	     ; 
rcall	usDelay	           ; ждём ещё 240 мкс	
rcall	usDelay	
      sbic  PIN1wTM,BIT1wTM    ; если на входе 1
      rjmp  ReadRom_1wTM        ; то переходим  (всё окей)
ser   temp                ; иначе если всё ещё "0" на входе - то
    	sts ATM+6,temp	           ; похоже КЗ, в ОЗУ ($FF в ст. байт номера ключа - признак КЗ)
     rjmp exitTMem1W        ; и выходим

   ReadRom_1wTM:
     lds temp,ATM+6       ; иначе грузим предыдущее состояние ключа на шине
     cpi temp, $FD        ; если  его не было, было КЗ или считался с ошибкой
     brsh start_RR1wTM    ; то переход
    rjmp exitTMem1W        ; иначе выходим

  start_RR1wTM:
ldi	DelayReg, 55	     ; ждём ещё 240 мкс
rcall	usDelay	           ; для завершения	
rcall	usDelay             ; внутренних процедур инициализации
      ldi	outByte,0x33	; command  чтение ПЗУ
ldi	bit,8          ; 8 бит на передачу
   WR1_m1:cli	      ; Запрещаем обработку прерываний
sbi	DDR1wTM,BIT1wTM   ; Переводим линию в "0" в течении минимум 1 мкс	
rcall	RD1_dummy          ; (при частоте 4 -> 1.75 мкс)
sbrc	outByte,0
cbi	DDR1wTM,BIT1wTM   ; Если нужно выдать "1" переводим линию в "1" сразу же
ror	outByte
                                            ; Выдерживаем интервал Tslot=80 мкс
ldi	DelayReg,(320+2)/3 ; (4 * 80) - 6 - 12
rcall	usDelay
cbi	DDR1wTM,BIT1wTM     ; переводим линию в "1"
sei	    ; Разрешение прерываний
ldi	DelayReg,8     ; Выдерживаем интервал Tslot>=8 мкс
rcall	usDelay
dec	bit
brne	WR1_m1

  ; tm_temp:
     ldi ZL,low(ATM)       ; начальный адрес
     ldi ZH,high(ATM)      ; для приема номера TM
     ldi count,8           ;
     rcall RD1WireTM
     dec count
     brne PC-2
	   ldi count,7
	   sbiw ZL,8            ; уазатель на 0ой байт
rcall CRC8calc       ; вычисляем CRC
	   lds temp,ATM+7       ; грузим принятый CRC
cp CRC8accum,temp    ; если CRC совпадает c принятым
breq TM_eep          ; то переход
ldi temp,$FD         ; иначе признак ошибки считывания
sts ATM+6,temp       ; в ОЗУ
	 rjmp exitTMem1W        ; и выходим

   TM_eep:
     clr temp           ;
     sts cntPO,temp     ; обнуляем счетчик на отключение питания
     rcall opr_compTM       ;
     sbrs temp,7            ; если ключи не совпали (пп возвратила "$00")
     rjmp EE_newKey         ; то переход
     ldi temp,$FC          ; иначе признак одинаковых ключей
     sts ATM+6,temp       ; в ОЗУ
    rjmp exitTMem1W        ; и выходим

   EE_newKey:
     ldi ZL,low(ATM)        ; уазатель на 0ой байт принятого ключа (старший - не меняется по идее)
     ldi YL,low(AlEE)       ; начало области ОЗУ
     ldi YH,high(AlEE)      ; для адресов и данных EEPROM
     ldi count,8

     std Y+16,XH          ; заносим старший байт адреса
     ld temp,Z+           ; грузим байт ключа
     std Y+32,temp        ; заносим байт данных для EEPROM
     st Y+,XL             ; заносим младший байт адреса для EEPROM
     adiw XL,1
     dec count
     brne PC-6

     ldi temp,8          ; в EEPROM
     sts QBe2p,temp      ; занесем 8 байт

     ldi temp,$FB          ; признак разных ключей
     sts ATM+6,temp        ; в ОЗУ

   exitTMem1W:
     ret
; ****************************************************************************
RD1wireTM:	; Попрограмма приёма байта по 1-wire интерфейса для DS1990
; Принятый байт возвращается в регистре inByte
ldi	bit,8
  RD1_m1:cli	    ; Запрещаем обработку прерываний
sbi	DDR1wTM,BIT1wTM  ; Импульс запроса передачи бита >1 мкс
rcall	RD1_dummy	    ; (при частоте 4 MHz -> 1.75 мкс)
cbi	DDR1wTM,BIT1wTM    ; отпускаем линию
ldi	DelayReg,(34+2)/3	    ; (4 * 14) - 6 - 11
rcall	usDelay
clc	    ; Проверка линии после 13,2 мкс после импульса запроса
sbic  PIN1wTM,BIT1wTM
sec
    	sei
    	ror	inByte
    	
ldi	DelayReg, 219/3	   ; (4 * 70) - 6 - 106
rcall	usDelay    ;	Через 70 мкс от импульса запроса бита
	    ; ожидает появления "1"  на линии в течении 50 мкс
ldi	DelayReg, 200/5	     ; (4 * 50)
  RD1_m2:sbic PIN1wTM,BIT1wTM       ; Если в течении 50 мкc.
rjmp	RD1_m3                 ; на линии "0",
dec   DelayReg               ; то похоже она замкнута на землю
brne	RD1_m2
ldi temp,$FF                 ;  ошибку
    	sts ATM+6,temp    	   ;  в ОЗУ
	
  RD1_m3: dec	bit
    brne	RD1_m1
    st Z+,inByte	
        ret

; ****************************************************************************
; Подпрограмма на определение совпадения принятого и имеющегося ключа
	opr_compTM:      	
     ldi ZL,low(ATM)       ; указатель на начальный адрес
     ldi ZH,high(ATM)      ; принятого номера TM
     ldi YL,low(a1TMKey)  ; адрес в ОЗУ
     ldi YH,high(a1TMKey)  ; первого ключа
     ldi count,8          ;   У DS1990 8 байт
     lds temp,numTM       ; грузим порядковый номер записываемого ключа
     mul count,temp       ; величина смещения
     add YL,R0            ;
     adc YH,R1

     clr XH             ; начальный адрес
     ldi XL,$30         ; EEPROM 1ого ключа
     add XL,R0          ; начальный адрес
     adc XH,R1          ; EEPROM Nого ключа

    cycle_compareTM:
     ld fbin,Y+           ; грузим байт хранящийся в соответствующем номере ключа
     ld temp,Z+           ; и принятый
     cp fbin,temp         ; сравниваем их
     brne noComp_TM       ; и если они не равны - то переход
     dec count            ; -1
     brne cycle_compareTM
     ser temp
    ret
    noComp_TM:
     ldi temp,9         ;
     sub temp,count     ;
     sub ZL,temp        ;
     sub YL,temp        ;
     ldi count,8        ;
     ld temp,Z+         ;
     st Y+,temp         ;
     dec count          ;
     brne PC-3          ; переписываем в ОЗУ новый ключ
     clr temp
    ret

Только как перенести это на Bascom?
Уважаемые ГУРУ посогите чайнику

0

11

Здравствуйте, такая проблема:

Есть исходный код, по чтению DS1990. Работает без ошибок. Но, есть 2 ключа, контрольная сумма в них равна 00 и FF. Они не считываются. Если отключить проверку контрольной суммы - все работает.

Код:
Sub Read1990
   Waitms 50
   1wreset
   If Err = 1 Then
      Return
   Else
      1wwrite &H33
      '1wwrite &H0F
         For I = 1 To 8
            Ar(i) = 1wread()
            Waitus 240

         Next I
             Call Crc1990                                   'Âûçîâ ïðîâåðêì CRC
             If Crc <> Ar(8) Then
             Elseif Crc = 0 Then
             Elseif Ar(8) = 0 Then
             Elseif Crc = 255 Then
             Elseif Ar(8) = 255 Then
             Else
               Keyr = Hex(ar(1)) + Hex(ar(2)) + Hex(ar(3)) + Hex(ar(4)) + Hex(ar(5)) + Hex(ar(6)) + Hex(ar(7)) + Hex(ar(8))
             End If
   End If
End Sub

Sub Crc1990
Crc = 0
    For I = 1 To 7
       Crcp = Crc Xor Ar(i)
       Crc = Lookup(crcp , Crc8)
    Next
End Sub

'Tablica do wyliczania CRC dla DS1990
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53

0

12

Вот как раз, только не могу разобраться, что тут программа делает

Код:
If Crc <> Ar(8) Then
             Elseif Crc = 0 Then
             Elseif Ar(8) = 0 Then
             Elseif Crc = 255 Then
             Elseif Ar(8) = 255 Then
             Else
               Keyr = Hex(ar(1)) + Hex(ar(2)) + Hex(ar(3)) + Hex(ar(4)) + Hex(ar(5)) + Hex(ar(6)) + Hex(ar(7)) + Hex(ar(8))
             End If

0

13

Получается функция умышленно не возвращает код ключа, если CRC = 0 и FF (255)? С какой целью это реализовано? Не проще сравнить CRC и Ar(8) и если они равны, то вернуть код, если не верны, вернуть 0?

0

Похожие темы


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