Поиск
Показаны результаты для тегов '8051'.
-
8051 число циклов выполнения инструкции
repstosw опубликовал тема в В помощь начинающему
Нужно прецезионно(равными интервалами) организовать считывание из SFR регистра и вывести сигнал на ножку. Не могу найти достоверные растактовки для инструкций ядра 8051. Встречаются разночтения: в одних источниках пишут, что инструкция DJNZ занимает 2/4 цикла в зависимости от результата, а других - в обоих случаях 2 цикла. Интересуют именно число циклов, без привязки к конкретной частоте. У меня недоверие и вопросы: как может инструкция с условным переходом выполняться одинаковое число тактов? Там всегда будет 2 значения циклов - в случае если переход выполнен, и в случае если перехода не будет. В частности меня интересует число циклов выполнения следующих инструкций: mov A,SFR movx @DPTR,A inc DPTR nop ;1 цикл djnz R2,Label mov A,#0x15 movx @R1,A clr A ;1 цикл ? mov R2,#0x18 sjmp Label -
Пытаюсь оживить Season интерфейс. Это такой эмулятор смарт карты. Ведет он себя ровно как смарт или сим карта. Он вставляется в слот считывателя и после сброса по питанию выдает считавателю ATR ответ и после этого считыватель он же ридер готов общаться с помощью APDU команд. Устанавливается обмен по последовательному порту со скоростью 9600 N-8-1. Season подключает три провода RX TX и Reset. Reset он же сброс по питанию я вижу по прерыванию меняю значение LED на одно их IO портов. А вот дальше я забуксовал. Нужно отправить десяток HEX-ов через порт во временных рамках 40000 циклов, но ридер меня не видет и никак не реагирует. Может у кого остались исходники работы с Season интерфейсом? Или есть идеи как его побороть? Прерывание (P00) запаяно на первую ножку DB9 оно же сброс который от ридера. По прерыванию у меня переключается LED1. Это происходит и когда вставляю в ридер Season и если если задаю reset в программе управления ридером. //----------------------------------------------------------------------------- // MAIN Routine //----------------------------------------------------------------------------- void main (void) { char atr[16] = {0x3B, 0xF7, 0x11, 0x00, 0x40, 0x96, 0x70, 0x70, 0x07, 0x0E, 0x6C, 0xB6, 0xD6}; PCA0MD &= ~0x40; // Disable Watchdog timer Oscillator_Init(); // Initialize the system clock Port_Init (); // Initialize crossbar and GPIO Ext_Interrupt_Init(); // Initialize External Interrupts EA = 1; if(!LED1) { uart_tx(0x3B); uart_tx(0xF7); uart_tx(0x11); uart_tx(0x00); uart_tx(0x40); uart_tx(0x96); } while(1); } // void uart_msg(unsigned char *c) { while(*c != 0) { uart_tx(*c++); } } void uart_tx(unsigned int sdata) { while(!TI0); SBUF0 = sdata; while(!TI0); TI0 = 0; } //----------------------------------------------------------------------------- void INT0_ISR (void) interrupt 0 { LED1 = !LED1; }