Главная  Микроконтроллеры 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [ 64 ] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

reti

; Включение ключа

r31.$02

DDRD.r31

ByteO,$31

Byte1,$32

Byte2.$33

Byte3.$34

Byte4,$35

Byte5.$36

Byte6,$37

Byte7,$38

MainLoop:

rcall

ByteSExchange

; Здесь должен быть код, заменяющий часть защищаемой программы или ; шифрование данных sbis PIMD,3

rjnp RESET ; Работа с ключом завершена, переполнение стека допустимо rjmp MainLoop

ByteBExchange:

Byte,ByteO

rcall

ByteExchange

ByteO,Byte

Byte,Bytel

rcall

ByteExchange

Bytel,Byte

Byte.Byte2

rcall

ByteExchange

Byte2,Byte

Byte.ByteS

rcall

ByteExchange

Byte3,Byte

Byte,Byte4

rcall

ByteExchange

Byte4.Byte

Byte,ByteS

rcall

ByteExchange

ByteS,Byte

; )Кден прихода импульса на вход INTO, находясь в режиме Power Down Idi г31.$40 out GIHSK,г31 Idi г31,$30 out HCUCR.г31 UnLoop: sei sleep

rjnp UnLoop EXT IMTO:

; Если PD3=0, данные относятся к принтеру sbis PIMD,3



nov Byte.Byte6 rcall ByteExchange nov Byte6.Byte nov Byte,Byte7 rcall ByteExchange nov Byte7.Byte ret

; Обмен одним байтом данных

ByteExchange:

101 LoopCounter.B

; Обработка положительного фронта сигнала синхронизации

Loops: sbrs Byte,7

cbi PORTD.1

sbrc Byte,7

sbi PORTD, 1

Waiti: sbls PIND.2 ;

rjnp Waltl

sec : 0=1 ;

sbis PIMD,0

clc ; c=0

rol Byte

WaitO: sbic PIND,2

rjmp WaitO

; Цикл для 8 битов байта

dec LoopCounter

brne Loops ret

; Вывод бита

)Кдем прихода положительного фронта

Прием бита

)Кдем прихода отрицательного фронта

.EXIT

Программа PC

Исходник на С примера, проверяющего наличие ключа.

Binclude Binclude Binclude

char SendByte(char ByteOut) {

int i.j: long li:

unsigned char ByteOutCpy. Bytein = 0; ByteOutCpy = ByteOut: for (i=0; i<B; i++) {

Bytein = (Bytein « 1) + ((inportb(0x379)&0xS0)==0);

outportb{0x37A.0x021(((12S&ByteOutCpy)==0)));

for (li=0: li<20001; li++);

outportb(0x37A, 0x001 (((12B«,ByteOutCpy )==0)));

for (11=0; 1K20001; li++):

outportb(0x37A. 0x021 (((12S«,ByteOutCpy)==0)));

ByteOutCpy = ByteOutCpy « 1;



for (li=0; 1К20001; li++):

return Bytein;

void KeyOn(void) {

int i; long li;

for (i=0; i<64; i++) {

outportb(0x37A,0x00);

for (li=0; 1K200001: li++):

outportb(0x37A.0x03);

for (li=0: 1K200001; li++);

delay(IOO);

void KeyOff(vold) {

int i; long li;

for (i=0: i<128: i++) {

outportb(0x37A,0x0B);

for (li=0; 1K20001: li++):

outportb(0x37A.0x08);

for (li=0; 1K20001: li++);

void RiainO {

KeyOnO;

printf("%02X ",SendByte(0)); printf("%02X ".SendByte(l)) prlntf("%02X ••,SendByte(2)); prlntf("%02X ,SendByte(3)); printf("%02X ••,SendByte(4)); printf("%02X ".SendByteCS)): printf("%02X ".SendByteCe)); printf("%02X ••,SendByte(7)); printfCAn");

printfC%02X •,SendByte(7)); printf("%02X ".SendByte(6)): printf("%02X ",SendByte(5)); printf("%02X ",SendByte(4)): prinTfC%02X -.SendByteCS)): printfC%02X ••,SendByte(2)); printfC%02X ".SendByte(l)); printfC%02X -.SendByteCO)):

Включение ключа Отправка 8 байтов.

Отправка следующих В байтов и одновременное получение байтов, отправленных раньше



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [ 64 ] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

0.0011