Изучение уязвимостей электронных систем.
 
key programming immo tools emergency start device программаторы ключа заводилки Кодграббер штатных охранных систем, toyota, lexus, subaru.

Вернуться   Изучение уязвимостей электронных систем > Для начинающих > Новички

Новички Раздел для новичков. Что такое кодграббер, ретранслятор, подмена кода.

Ответ
 
Опции темы
Старый 05.11.2009, 06:39   #11
Piratcom
продвинутый фрикер
 
Аватар для Piratcom
 
Регистрация: 16.02.2008
Сообщений: 1,710
Поблагодарил: 127
Поблагодарили 268 раз в 177 сообщениях
Piratcom стоит на развилке
По умолчанию

2Ahalam: А я начал с "С" и в асме ваще никак, асм конечно это гут, но на "С" намного проще и быстрее всё это делается... Хотя каждый пишет на чём хочет, суть не меняется, главное чтобы это потом работало...

2Stav: Для этого и создана эта тема, задаёте вопрос и разбираетесь...


Если вас мучает совесть по ночам - спите днем!
------------------------------------------------------------
Если ты обманываешь людей, будь готов к тому что когда - нибудь тебе придётся сесть в тюрьму...
Piratcom вне форума   Ответить с цитированием
Старый 05.11.2009, 21:20   #12
bumer525
начинающий фрикер
 
Аватар для bumer525
 
Регистрация: 31.12.2008
Сообщений: 648
Поблагодарил: 55
Поблагодарили 236 раз в 93 сообщениях
bumer525 скоро станет знаменитым(-ой)
По умолчанию Табличное чтение

Вот с горем пополам наваял табличное чтение.... вроде работает
Спецы по асм раскритикуйте.


LIST P=18F252, F=INHX32
#include <P18F252.INC>
************************************************** *
CONFIG OSC = HS
CONFIG WDT = OFF
CONFIG LVP = OFF
**************************************************
UDATA_ACS
COUNT RES 1
Look CODE_PACK
Lookup:
db 0x00, 0x00, 0x00, 0x00, 0x00 ; 00 // space
db 0x00, 0x00, 0x5F, 0x00, 0x00 ; 01 // !
db 0x00, 0x07, 0x00, 0x07, 0x00 ; 02 // "
db 0x14, 0x7F, 0x14, 0x7F, 0x14 ; 03 // #
db 0x24, 0x2A, 0x7F, 0x2A, 0x12 ; 04 // $
db 0x23, 0x13, 0x08, 0x64, 0x62 ; 05 // %
db 0x36, 0x49, 0x55, 0x22, 0x50 ; 06 // &
db 0x00, 0x05, 0x03, 0x00, 0x00 ; 07 // '
db 0x00, 0x1C, 0x22, 0x41, 0x00 ; 08 // (
db 0x00, 0x41, 0x22, 0x1C, 0x00 ; 09 // )
db 0x14, 0x08, 0x3E, 0x08, 0x14 ; 0A // *
db 0x08, 0x08, 0x3E, 0x08, 0x08 ; 0B // +
db 0x00, 0x50, 0x30, 0x00, 0x00 ; 0C // ,
db 0x08, 0x08, 0x08, 0x08, 0x08 ; 0D // -
db 0x00, 0x60, 0x60, 0x00, 0x00 ; 0E // .
db 0x20, 0x10, 0x08, 0x04, 0x02 ; 0F // /
db 0x3E, 0x51, 0x49, 0x45, 0x3E ; 10 // 0
db 0x00, 0x42, 0x7F, 0x40, 0x00 ; 11 // 1
db 0x42, 0x61, 0x51, 0x49, 0x46 ; 12 // 2
db 0x21, 0x41, 0x45, 0x4B, 0x31 ; 13 // 3
db 0x18, 0x14, 0x12, 0x7F, 0x10 ; 14 // 4
db 0x27, 0x45, 0x45, 0x45, 0x39 ; 15 // 5
db 0x3C, 0x4A, 0x49, 0x49, 0x30 ; 16 // 6
db 0x01, 0x71, 0x09, 0x05, 0x03 ; 17 // 7
db 0x36, 0x49, 0x49, 0x49, 0x36 ; 18 // 8
db 0x06, 0x49, 0x49, 0x29, 0x1E ; 19 // 9
db 0x00, 0x36, 0x36, 0x00, 0x00 ; 1A // :
db 0x00, 0x56, 0x36, 0x00, 0x00 ; 1B // ;
db 0x08, 0x14, 0x22, 0x41, 0x00 ; 1C // <
db 0x14, 0x14, 0x14, 0x14, 0x14 ; 1D // =
db 0x00, 0x41, 0x22, 0x14, 0x08 ; 1E // >
db 0x02, 0x01, 0x51, 0x09, 0x06 ; 1F // ?
db 0x32, 0x49, 0x79, 0x41, 0x3E ; 20 // @
db 0x7E, 0x11, 0x11, 0x11, 0x7E ; 21 // A
db 0x7F, 0x49, 0x49, 0x49, 0x36 ; 22 // B
db 0x3E, 0x41, 0x41, 0x41, 0x22 ; 23 // C
db 0x7F, 0x41, 0x41, 0x22, 0x1C ; 24 // D
db 0x7F, 0x49, 0x49, 0x49, 0x41 ; 25 // E
db 0x7F, 0x09, 0x09, 0x09, 0x01 ; 26 // F
db 0x3E, 0x41, 0x49, 0x49, 0x7A ; 27 // G
db 0x7F, 0x08, 0x08, 0x08, 0x7F ; 28 // H
db 0x00, 0x41, 0x7F, 0x41, 0x00 ; 29 // I
db 0x20, 0x40, 0x41, 0x3F, 0x01 ; 2A // J
db 0x7F, 0x08, 0x14, 0x22, 0x41 ; 2B // K
db 0x7F, 0x40, 0x40, 0x40, 0x40 ; 2C // L
db 0x7F, 0x02, 0x0C, 0x02, 0x7F ; 2D // M
db 0x7F, 0x04, 0x08, 0x10, 0x7F ; 2E // N
db 0x3E, 0x41, 0x41, 0x41, 0x3E ; 2F // O
db 0x7F, 0x09, 0x09, 0x09, 0x06 ; 30 // P
db 0x3E, 0x41, 0x51, 0x21, 0x5E ; 31 // Q
db 0x7F, 0x09, 0x19, 0x29, 0x46 ; 32 // R
db 0x46, 0x49, 0x49, 0x49, 0x31 ; 33 // S
db 0x01, 0x01, 0x7F, 0x01, 0x01 ; 34 // T
db 0x3F, 0x40, 0x40, 0x40, 0x3F ; 35 // U
db 0x1F, 0x20, 0x40, 0x20, 0x1F ; 36 // V
db 0x3F, 0x40, 0x38, 0x40, 0x3F ; 37 // W
db 0x63, 0x14, 0x08, 0x14, 0x63 ; 38 // X
db 0x07, 0x08, 0x70, 0x08, 0x07 ; 39 // Y
db 0x61, 0x51, 0x49, 0x45, 0x43 ; 3A // Z
db 0x00, 0x7F, 0x41, 0x41, 0x00 ; 3B // [
db 0x02, 0x04, 0x08, 0x10, 0x20 ; 3C //Yen Currency Sign
db 0x00, 0x41, 0x41, 0x7F, 0x00 ; 3D // ]
db 0x04, 0x02, 0x01, 0x02, 0x04 ; 3E // ^
db 0x40, 0x40, 0x40, 0x40, 0x40 ; 3F // _
db 0x00, 0x01, 0x02, 0x04, 0x00 ; 40 // `
db 0x20, 0x54, 0x54, 0x54, 0x78 ; 41 // a
db 0x7F, 0x48, 0x44, 0x44, 0x38 ; 42 // b
db 0x38, 0x44, 0x44, 0x44, 0x20 ; 43 // c
db 0x38, 0x44, 0x44, 0x48, 0x7F ; 44 // d
db 0x38, 0x54, 0x54, 0x54, 0x18 ; 45 // e
db 0x08, 0x7E, 0x09, 0x01, 0x02 ; 46 // f
db 0x0C, 0x52, 0x52, 0x52, 0x3E ; 47 // g
db 0x7F, 0x08, 0x04, 0x04, 0x78 ; 48 // h
db 0x00, 0x44, 0x7D, 0x40, 0x00 ; 49 // i
db 0x20, 0x40, 0x44, 0x3D, 0x00 ; 4A // j
db 0x7F, 0x10, 0x28, 0x44, 0x00 ; 4B // k
db 0x00, 0x41, 0x7F, 0x40, 0x00 ; 4C // l
db 0x7C, 0x04, 0x18, 0x04, 0x78 ; 4D // m
db 0x7C, 0x08, 0x04, 0x04, 0x78 ; 4E // n
db 0x38, 0x44, 0x44, 0x44, 0x38 ; 4F // o
db 0x7C, 0x14, 0x14, 0x14, 0x08 ; 50 // p
db 0x08, 0x14, 0x14, 0x18, 0x7C ; 51 // q
db 0x7C, 0x08, 0x04, 0x04, 0x08 ; 52 // r
db 0x48, 0x54, 0x54, 0x54, 0x20 ; 53 // s
db 0x04, 0x3F, 0x44, 0x40, 0x20 ; 54 // t
db 0x3C, 0x40, 0x40, 0x20, 0x7C ; 55 // u
db 0x1C, 0x20, 0x40, 0x20, 0x1C ; 56 // v
db 0x3C, 0x40, 0x30, 0x40, 0x3C ; 57 // w
db 0x44, 0x28, 0x10, 0x28, 0x44 ; 58 // x
db 0x0C, 0x50, 0x50, 0x50, 0x3C ; 59 // y
db 0x44, 0x64, 0x54, 0x4C, 0x44 ; 5A // z
db 0x00, 0x08, 0x36, 0x41, 0x00 ; 5B // <
db 0x00, 0x00, 0x7F, 0x00, 0x00 ; 5C // |
db 0x00, 0x41, 0x36, 0x08, 0x00 ; 5D // >
db 0x10, 0x08, 0x08, 0x10, 0x08 ; 5E // Right Arrow ->
db 0x78, 0x46, 0x41, 0x46, 0x78 ; 5F // Left Arrow <-
db 0x7E, 0x11, 0x11, 0x11, 0x7E ; 60 // А
db 0x7F, 0x49, 0x49, 0x49, 0x31 ; 61 // Б
db 0x7F, 0x49, 0x49, 0x49, 0x36 ; 62 // В
db 0x7F, 0x01, 0x01, 0x01, 0x03 ; 63 // Г
db 0x70, 0x29, 0x27, 0x21, 0x7F ; 64 // Д
db 0x7F, 0x49, 0x49, 0x49, 0x41 ; 65 // Е
db 0x77, 0x08, 0x7F, 0x08, 0x77 ; 66 // Ж
db 0x41, 0x41, 0x41, 0x49, 0x76 ; 67 // З
db 0x7F, 0x10, 0x08, 0x04, 0x7F ; 68 // И
db 0x7F, 0x10, 0x09, 0x04, 0x7F ; 69 // Й
db 0x7F, 0x08, 0x14, 0x22, 0x41 ; 6A // К
db 0x20, 0x41, 0x3F, 0x01, 0x7F ; 6B // Л
db 0x7F, 0x02, 0x0C, 0x02, 0x7F ; 6C // М
db 0x7F, 0x08, 0x08, 0x08, 0x7F ; 6D // Н
db 0x3E, 0x41, 0x41, 0x41, 0x3E ; 6E // О
db 0x7F, 0x01, 0x01, 0x01, 0x7F ; 6F // П
db 0x7F, 0x09, 0x09, 0x09, 0x06 ; 70 // Р
db 0x3E, 0x41, 0x41, 0x41, 0x22 ; 71 // С
db 0x01, 0x01, 0x7F, 0x01, 0x01 ; 72 // Т
db 0x47, 0x28, 0x10, 0x08, 0x07 ; 73 // У
db 0x1E, 0x21, 0x7F, 0x21, 0x1E ; 74 // Ф
db 0x63, 0x14, 0x08, 0x14, 0x63 ; 75 // Х
db 0x3F, 0x20, 0x20, 0x20, 0x5F ; 76 // Ц
db 0x07, 0x08, 0x08, 0x08, 0x7F ; 77 // Ч
db 0x7F, 0x40, 0x7F, 0x40, 0x7F ; 78 // Ш
db 0x3F, 0x20, 0x3F, 0x20, 0x5F ; 79 // Щ
db 0x01, 0x7F, 0x48, 0x48, 0x30 ; 7A // Ъ
db 0x7F, 0x48, 0x30, 0x00, 0x7F ; 7B // Ы
db 0x00, 0x7F, 0x48, 0x48, 0x30 ; 7C // Ь
db 0x41, 0x41, 0x41, 0x49, 0x3E ; 7D // Э
db 0x7F, 0x08, 0x3E, 0x41, 0x3E ; 7E // Ю
db 0x46, 0x29, 0x19, 0x09, 0x7F ; 7F // Я
db 0x20, 0x54, 0x54, 0x54, 0x78 ; 80 // а
db 0x3C, 0x4A, 0x4A, 0x49, 0x31 ; 81 // б
db 0x7C, 0x54, 0x54, 0x28, 0x00 ; 82 // в
db 0x7C, 0x04, 0x04, 0x04, 0x0C ; 83 // г
db 0x72, 0x2A, 0x26, 0x22, 0x7E ; 84 // д
db 0x38, 0x54, 0x54, 0x54, 0x18 ; 85 // е
db 0x6C, 0x10, 0x7C, 0x10, 0x6C ; 86 // ж
db 0x44, 0x44, 0x54, 0x54, 0x38 ; 87 // з
db 0x7C, 0x20, 0x10, 0x08, 0x7C ; 88 // и
db 0x7C, 0x21, 0x12, 0x09, 0x7C ; 89 // й
db 0x7C, 0x10, 0x28, 0x44, 0x00 ; 8A // к
db 0x20, 0x44, 0x3C, 0x04, 0x7C ; 8B // л
db 0x7C, 0x08, 0x10, 0x08, 0x7C ; 8C // м
db 0x7C, 0x10, 0x10, 0x10, 0x7C ; 8D // н
db 0x38, 0x44, 0x44, 0x44, 0x38 ; 8E // о
db 0x7C, 0x04, 0x04, 0x04, 0x7C ; 8F // п
db 0x7C, 0x14, 0x14, 0x14, 0x08 ; 90 // р
db 0x38, 0x44, 0x44, 0x44, 0x20 ; 91 // с
db 0x04, 0x04, 0x7C, 0x04, 0x04 ; 92 // т
db 0x44, 0x28, 0x10, 0x08, 0x04 ; 93 // у
db 0x08, 0x14, 0x7E, 0x14, 0x08 ; 94 // ф
db 0x44, 0x28, 0x10, 0x28, 0x44 ; 95 // х
db 0x3C, 0x40, 0x40, 0x7C, 0x40 ; 96 // ц
db 0x0C, 0x10, 0x10, 0x10, 0x7C ; 97 // ч
db 0x7C, 0x40, 0x7C, 0x40, 0x7C ; 98 // ш
db 0x3C, 0x20, 0x3C, 0x20, 0x7C ; 99 // щ
db 0x04, 0x7C, 0x50, 0x50, 0x20 ; 9A // ъ
db 0x7C, 0x50, 0x20, 0x00, 0x7C ; 9B // ы
db 0x00, 0x7C, 0x50, 0x50, 0x20 ; 9C // ь
db 0x28, 0x44, 0x44, 0x54, 0x38 ; 9D // э
db 0x7C, 0x10, 0x38, 0x44, 0x38 ; 9E // ю
db 0x48, 0x54, 0x34, 0x14, 0x7C ; 9F // я
*************************************************
RESET_VECTOR CODE 0x0000

goto Main
*************************************************
Main:

movlw 0x9f ; Выбор строчки(символа) в таблице по метке ;9F
movwf 0x01 ; регистр строчки(символа)
;
movlw .5 ; Счётчик столбцов
movwf COUNT ; Регистр счётчика
;
Table_rd:
movlw 0x05 ; Операция для выбора строки таблицы
mulwf 0x01 ; адрес следующей строчки в 5 раз больше
;
movlw UPPER Lookup ; Определяем адрес таблицы в памяти
movwf TBLPTRU ; программ (1 байт таблицы)
movlw HIGH Lookup
movwf TBLPTRH
movlw LOW Lookup
movwf TBLPTRL
;
addwf PRODL,F ; Устанавливаем табличный указатель
btfsc STATUS,C ; на нужной строке таблицы
incf PRODH
movff PRODL,TBLPTRL
movff PRODH,TBLPTRH
;
Read_word:
tblrd*+ ; Читаем строку с последовательным
movf TABLAT,W ; выводом результата в регистр
movwf 0x02 ; данных 0х02
decfsz COUNT
goto Read_word

Wait: goto Wait
;
;************************************************* *****************************
; Конец программ

END

Вообщем есть сомнения по поводу операции умножения в случае если таблица будет больше и результат умножения перевалит за 16 бит......
bumer525 вне форума   Ответить с цитированием
Старый 07.11.2009, 07:27   #13
timofeygsm
случайно влез
 
Аватар для timofeygsm
 
Регистрация: 05.09.2009
Сообщений: 17
Поблагодарил: 1
Поблагодарили 0 раз в 0 сообщениях
timofeygsm стоит на развилке
По умолчанию

Неплохо было бы дописать подпрограмку которая при чтении из заданного нам регистра в котором ASCII код выводила его на LCD!
timofeygsm вне форума   Ответить с цитированием
Старый 07.11.2009, 11:43   #14
bumer525
начинающий фрикер
 
Аватар для bumer525
 
Регистрация: 31.12.2008
Сообщений: 648
Поблагодарил: 55
Поблагодарили 236 раз в 93 сообщениях
bumer525 скоро станет знаменитым(-ой)
По умолчанию

Цитата:
Сообщение от timofeygsm Посмотреть сообщение
Неплохо было бы дописать подпрограмку которая при чтении из заданного нам регистра в котором ASCII код выводила его на LCD!

Ну так в чём же дело?
Допиши к моему примеру эту процедуру, только не банальным копированием разработки Олега, а с задействованием SPI МК. Покажи так сказать новичкам мастер класс.
Хорошая тема получится для изучения программирования на асм конкретного камня
18F252, с примерами использования его возможностей.
Глядишь ещё кто нибудь присоединиться
bumer525 вне форума   Ответить с цитированием
Старый 10.11.2009, 04:30   #15
timofeygsm
случайно влез
 
Аватар для timofeygsm
 
Регистрация: 05.09.2009
Сообщений: 17
Поблагодарил: 1
Поблагодарили 0 раз в 0 сообщениях
timofeygsm стоит на развилке
По умолчанию

Не присоединиться! Потому что на мой взгляд писать на асме интерфейсную часть это глупо и большая потеря времени. Для этого есть языки выше уровня например С. У меня на асме наработки управления PCD8544 аппаратными средствами mssp модуля 252ого уже месяц лежат в незаконченном виде. Кто нибудь хоть раз побывал конфигурировать на асме, 252 SPI с PCD8544?
timofeygsm вне форума   Ответить с цитированием
Старый 10.11.2009, 16:44   #16
validol
случайно влез
 
Аватар для validol
 
Регистрация: 10.08.2009
Сообщений: 40
Поблагодарил: 4
Поблагодарили 7 раз в 5 сообщениях
validol стоит на развилке
По умолчанию

Вот может еще кому-то пригодиться.

CASE для асма. Под 18 пики онли.

Основной плюс это то что работает в любом участке памяти.
И время работы этого CASE не зависит от значения параметра.
Минус в том что значения на входе не могут быть более 127.
Но обычного этого хватает с головой.

Код:
#define MAXVALUE 0x7F		; количество меток в CASE - 1, в данном случае 128 меток
				; работаем только со значениями 0-127

DATABANK udata
TEMPPCLREG	res 1

CODEPART code

ComputedGOTO:			; точка входа, входной параметр в регистре W
	SUBLW MAXVALUE	; проверка входного параметра
	BTFSS STATUS,C
	goto ErrorBound	
	SUBLW MAXVALUE	; восстанавливаем значение

	BCF STATUS,C		; умножаем на 2
	RLCF WREG,W	
	
	ADDLW 0x0C		; учитываем длинну кода самой процедуры
	ADDWF PCL,W
	MOVWF TEMPPCLREG	; прибавляем к PCL и сохраняем
	MOVLW 0X00
	ADDWFC PCLATH,F		; учитываем перенос в старшие регистры
	ADDWFC PCLATU,F
	MOVF TEMPPCLREG,W	; обновляем PCL (при этом обновляются и PCLATH и PCLATU)
	MOVWF PCL

	goto Label0
	goto Label1
	goto Label2
	...	
	goto Label127

ErrorBound:			; ошибка входного параметра

	END
И еще одна полезная процедурка. Включаем нужный бит по номеру бита.
На входе номер бита (0-7) в регистре W

Код:
SetBit:
	ANDLW 0x07
	MOVWF VAL
	MOVLW 0X04
	BTFSS VAL, 1
	MOVLW 0X01
	BCF STATUS,C
	BTFSC VAL, 0
	RLCF WREG, F
	BTFSC VAL, 2
	SWAPF WREG, F
	RETURN

Последний раз редактировалось validol; 10.11.2009 в 16:54.
validol вне форума   Ответить с цитированием
Старый 19.11.2009, 21:39   #17
bumer525
начинающий фрикер
 
Аватар для bumer525
 
Регистрация: 31.12.2008
Сообщений: 648
Поблагодарил: 55
Поблагодарили 236 раз в 93 сообщениях
bumer525 скоро станет знаменитым(-ой)
По умолчанию Запись, чтение внешний EEPROM с использованием FSR

Постигая азы программирования МК наваял вот такой примерчик. Может кому пригодится.
16 байт потаму что хочу разместить 2 hop + fix + but + name + flag
Пример можно компилить должно работать без проблем, заточено под модельку протеуса от ANG "Анализатор с епром"

PHP код:
;********************************************************************************************
    LIST 
P=18F252                     
    
#include <P18F252.INC>;ПОДКЛЮЧЕНИЕ ФАЙЛА С ОПИСАНИЕМ ПЕРЕМЕННЫХ И СИСТЕМНЫХ РЕСУРСОВ PIC18F252    
    
radix dec
;********************************************************************************************
    
CONFIG    OSC HS                 
    CONFIG    WDT 
OFF       
    CONFIG    LVP 
OFF  
;********************************************************************************************          
    
eehi        EQU    0x03f         
    eelow        EQU    0x03e
    bank4        EQU    0x000
    bank5        EQU    0x001      
    
;
    
org    0x0000        Вектор сброса процессораначальный адрес
    
;
;*****************************************************************************************
;                 
Активация модуля MSSP режим работы I2C
;**********************************************************************************************    
    ;
    
bsf        TRISC,3        на выход (всегда для ЕЕ I2C)
    
bsf        TRISC,4        на выход (всегда для ЕЕ I2C)
    
bsf        SSPSTAT,SMP        управление длительностью фронта выключено в стандартном режиме
    bcf        SSPSTAT
,CKE        входные уровни соответствуют спецификации I2C
    movlw        0x09            
только в режиме ВЕДУЩИЙ I2C формируем скорость обмена или тактовый сигнал =
    
movwf        SSPADD        ; = Fosc / (4*(SSPADD +1)) в данном случае 4000000 / (4*(9+1)) = 100000 100 кГц
    movlw        0x08            
0000 1000
    movwf        SSPCON1        
бит 0-1000 то ВЕДУЩИЙ режим I2Cтактовый сигнал Fosc / (4*(SSPADD +1)) 
    
bsf        SSPCON1,SSPEN    модуль MSSP включен выводы SDASCL используются модулем MSSP
    
;return
;**********************************************************************************************    
    ;
    
call        clear        Чистим регистры МК
    call        write_ee        
Забиваем нулями 16 байт EEPROM
    
;--------------------------------------------------------------------------------------
    ;     
Работа с косвеной адресацией FSR запись в регистры литеры (0x0b)
    ;--------------------------------------------------------------------------------------
    
movlw        .16        формируем счётчик на 16 байт
    movwf        0x0f        
регистр счётчика
    lfsr        FSR0
,0x010    
    movlw        0x0b        
заполняем все 16 байт литерой (0x0b
loop
    movwf        POSTINC0    
    decfsz        0x0f        
уменьшаем на еденицу счётчик    
    bra        loop        
циклим процесс
    
;----------------------------------------------------------------------------------------
    ;
    
call        write_ee        Забиваем литерой(0x0b16 байт EEPROM    
    call        clear        
Чистим регистры МК
    call        read_ee        
Читаем 16 байт EEPROM с записью в регистры МК
    
;
    ;----------------------------------------------------------
pause
    movlw        0x9B                
    movwf        bank4
wr
    movlw        0xFF                
    movwf        bank5
    
;
    
decfsz    bank5F
    bra        
$-2
    decfsz    bank4
F
    bra        wr
    bra        pause
    
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
;    Подпрограмма        ЧТЕНИЕ СТРОКИ 16 байт ВНЕШНЕЙ EEPROM 24LC512        
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
            
передаём команду записи
            
;------------------------------------------
read_ee
    bcf        PIR1
,SSPIF        
    bsf        SSPCON2
,SEN        Формируем START бит на выводах SSP(SCL и SDA
    ;
    
btfss        PIR1,SSPIF        
    bra        
$-2
    bcf        PIR1
,SSPIF                
    movlw        0xA0        
1010 0000 ГДЕ 1010 команда_000 адрес устройства определяется пинами А0A1A2_0 режим записи
    movwf        SSPBUF                    
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_read_ee    
    bcf        PIR1
,SSPIF        
            
;-------------------------------------------
            ; 
Адресуем строку EEPROM 
            
;-------------------------------------------
        
movlw     0x00            0000 0000
        movwf     eehi            
короче получается строка 0000 БАЙТ 0(строчка состоит из 16 байт)
        
movlw     0x00            0000 0000
        movwf    eelow        
            
;    
    
movff        eehi ,SSPBUF        пишем в буфер старший бит адреса строки ЕЕPROM
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_read_ee    
    bcf        PIR1
,SSPIF        
    
;
    
movff        eelow ,SSPBUF        пишем в буфер младший бит адреса строки ЕЕPROM
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_read_ee    
    bcf        PIR1
,SSPIF        
            
;--------------------------------------------
            ; 
Передаём команду чтения ЕЕPROM
            
;--------------------------------------------
    
bsf        SSPCON2,RSEN        Повторный START
    btfss        PIR1
,SSPIF        
    bra        
$-2
    bcf        PIR1
,SSPIF        
    
;
    
movlw        0xA1        1010 0001 ГДЕ 1010 команда_000 адрес устройства определяется пинами А0A1A2_1 режим чтения
    movwf        SSPBUF        
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_read_ee    
            
;------------------------------------------------------------------
            ;  
Чтение строки EEPROM 16 байт с использованием FSR косвеная адресация 
            
;------------------------------------------------------------------
        
    
movlw        0x10            формируем счётчик на 16 байт
    movwf        0x0f            
регистр счётчика
    lfsr        FSR0
,0x010        
loop4        
    bsf        SSPCON2
,RCEN        разрешить приём данных с шины I2C
    btfss        SSPSTAT
,BF        
    bra        
$-2
    movf        SSPBUF
,0        
    movwf        POSTINC0        
    bcf        PIR1
,SSPIF        
    bcf        SSPCON2
,ACKDT        Подтверждаем приём байта
    bsf        SSPCON2
,ACKEN        Формируем на выводах SSP(SCL и SDA)бит подтверждения
    btfss        PIR1
,SSPIF        
    bra        
$-2
    decfsz    0x0f                
уменьшаем на еденицу счётчик    
    bra        loop4            
циклим процесс
    
;
    
bsf        SSPCON2,PEN        Формируем STOP бит на выводах SSP(SCL и SDA
    
btfss        PIR1,SSPIF        
    bra        
$-2
    
return    0
    
;************* пауза после неудачного чтения ЕЕ ***********************
povtor_read_ee
    movlw        0x0A        
    movwf        0x023
    
;
    
movlw        0xFF        
    movwf        0x022
    
;
    
decfsz        0x022F
    bra        
$-2
    decfsz        0x023
F
    bra        
$-10
    
;--------------- подготовка к повторному чтению ЕЕ -------------------
    
bcf        PIR1,SSPIF        
    bsf        SSPCON2
,PEN        Формируем STOP бит на выводах SSP(SCL и SDA)
    ;
    
btfss        PIR1,SSPIF        
    bra        
$-2
    
goto        read_ee            Читаем строку 16 байт EEPROM
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
;    Подпрограмма    ЗАПИСЬ СТРОКИ ВО ВНЕШНЮЮ EEPROM 24LC512
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
            
передаём команду записи
            
;------------------------------------------
write_ee
    bcf        PIR1
,SSPIF        
    bsf        SSPCON2
,SEN        Формируем START бит на выводах SSP(SCL и SDA
    ;
    
btfss        PIR1,SSPIF        
    bra        
$-2
    bcf        PIR1
,SSPIF        
    movlw        0xA0        
1010 0000 ГДЕ 1010 команда_000 адрес устройства определяется пинами А0A1A2_0 режим записи
    movwf        SSPBUF            
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
;goto        write_ee
    
goto        povtor_write_ee    
    bcf        PIR1
,SSPIF        
            
;-------------------------------------------
            ; 
Адресуем строку EEPROM 
            
;-------------------------------------------
        
movlw     0x00            0000 0000
        movwf     eehi            
короче получается строка 0000 БАЙТ 0(строчка состоит из 12 байт)
        
movlw     0x00            0000 0000
        movwf    eelow        
            
;
    
movff        eehi ,SSPBUF        пишем в буфер старший бит адреса строки ЕЕPROM
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_write_ee    
    bcf        PIR1
,SSPIF        
    
;
    
movff        eelow ,SSPBUF        пишем в буфер младший бит адреса строки ЕЕPROM    
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_write_ee    
    bcf        PIR1
,SSPIF        
            
;-------------------------------------------
            ;    
Запись 16 байт в строку EEPROM 
            
;-------------------------------------------
    
movlw        0x10            формируем счётчик на 16 байт
    movwf        0x0f            
регистр счётчика
    lfsr        FSR0
,0x010                
loop1        
    movf        POSTINC0
,0        
    movwf        SSPBUF        
    btfss        PIR1
,SSPIF        
    bra        
$-2
    btfsc        SSPCON2
,ACKSTAT    
    
goto        povtor_write_ee    
    bcf        PIR1
,SSPIF        
    decfsz    0x0f                
уменьшаем на еденицу счётчик    
    bra        loop1            
циклим процесс
    
;
    
bsf        SSPCON2,PEN        Формируем STOP бит на выводах SSP(SCL и SDA)
    
btfss        PIR1,SSPIF        
    bra        
$-2
    
return    0
    
;************* пауза после неудачной записи в ЕЕ ***********************
povtor_write_ee
    movlw        0x0A        
    movwf        0x023
    
;
    
movlw        0xFF        
    movwf        0x022
    
;
    
decfsz    0x022F
    bra        
$-2
    decfsz    0x023
F
    bra        
$-10
    
;--------------- подготовка к повторной записи ЕЕ -------------------
    
bcf        PIR1,SSPIF        
    bsf        SSPCON2
,PEN        Формируем STOP бит на выводах SSP(SCL и SDA)
    ;
    
btfss        PIR1,SSPIF        
    bra        
$-2
    
goto        write_ee             На начало записи строки 16 байт EEPROM
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
; *********************************************************************************
;    
Подпрограмма Чистим 16 регистров данных через FSR косвеная адресация            
;**********************************************************************************
clear
    movlw        .16            
формируем счётчик на 16 байт
    movwf        0x0f            
регистр счётчика
    lfsr        FSR0
,0x010        
loop2
    clrf        POSTINC0        
    decfsz        0x0f            
уменьшаем на еденицу счётчик    
    bra        loop2            
циклим процесс
    
return    0
;**********************************************************************************
Конец программ
    end 
bumer525 вне форума   Ответить с цитированием
Старый 19.11.2009, 21:52   #18
Allex
Гость
 
Сообщений: n/a
Сообщение Настольная книга для желающих изучить AVR ассемблер

Каюсь, ослепленный тягой к изучению микроконтроллеров, нарушил заповедь "Да не переведи иноземный копирайтовый текст". Самостоятельно перевел книгу Джона Мортона "Вводный курс AVR", примерно за год, до ее официального выхода на русском языке. Написана понятным языком, и после прочтения раз на 10, вполне доступна для понимания Ныне, переведя еще одну, не вышедшую на родной мове книгу по программированию на Си для AVR, толщиной сантиметра 4, с удивлением вспоминаю, как заряженный простотой изложения Джона, самостоятено накатал на ассе прогу на пару килограмм (расходомер). Конечно по мере изучения Си, тяга к написанию на ассемблере значительно ослабла, но увы бывают случаи, когда без него не обойтись.
Так что всем начинающим рекомендую.
Сильных знатоков аглицкого,читавших оригинал, прошу сильно не пинать ногами, в школе учил немецкий
Выкладывать буду главами, в силу большого объема книги (около 5.5мб).
Желающие получить книгу одним файлом, пишите адреса....
Удачного чтения! и как говорится ДОНТ ВОРРИ ВЕ ХАППИ...
Вложения
Тип файла: pdf Вводный курс AVR- Глава1.pdf (1.56 Мб, 134 просмотров)
  Ответить с цитированием
Старый 21.11.2009, 22:05   #19
Allex
Гость
 
Сообщений: n/a
По умолчанию

Вторая глава.
Вложения
Тип файла: pdf Вводный курс AVR- Глава2.pdf (1.30 Мб, 105 просмотров)
  Ответить с цитированием
Старый 22.11.2009, 17:05   #20
burnout84
гость
 
Аватар для burnout84
 
Регистрация: 14.02.2007
Сообщений: 178
Поблагодарил: 14
Поблагодарили 73 раз в 27 сообщениях
burnout84 стоит на развилке
По умолчанию

Как выполнить операции деления и умножения на пик 16ф84?
burnout84 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодрабберы, FAQ для начинающих. exchange Новички 59 24.09.2014 07:47
"С" (Си) для начинающих, в вопросах и ответах. Piratcom Новички 9 05.01.2011 20:44
Для начинающих test Сотовые системы 5 15.08.2008 00:50
Для начинающих test Автомобили 286 20.12.2007 01:30


Текущее время: 18:09. Часовой пояс GMT +4.


Перевод: zCarot