Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.66.13] |
|
Страницы: (18) « Первая ... 12 13 [14] 15 16 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#196
,
|
|
|
повторюсь:
вышли сюда ассемблерный код функции TransmitBitDelay, я тебе обьясню как вычислить эти числа |
Сообщ.
#197
,
|
|
|
Я всё довно понял, времени просто не было
Прикреплённый файлwood.rar (1.71 Кбайт, скачиваний: 419) |
Сообщ.
#198
,
|
|
|
слуай, ты случайно в следующем коде точку с запятой после первого for не ставил???
void TransmitBitDelay(void) { for (int i= число1; i!=0; i--) // здесь точка с запятой ненужна for (int j= число2; j!=0; j--); } если не ставил, значит оптимизатор что то намудрил, уменьши уровень оптимизации и вышли еще раз:) Добавлено в : или попробуй вот так записать: void TransmitBitDelay(void) { for (int i= число1; i!=0; i--) { for (int j= число2; j!=0; j--); } } |
Сообщ.
#199
,
|
|
|
Млин откуда там точка с запятой взялась не понимаю
вроде всё правельно наберал. Ну ладно вот без неё. Прикреплённый файлwoodd.rar (2.46 Кбайт, скачиваний: 397) |
Сообщ.
#200
,
|
|
|
ok завтра на работе посмотрю:)
|
Сообщ.
#201
,
|
|
|
вот это больше на правду похоже, но извини, я опять намудрил:)
переделай функцию вот так, а то компилятор много избыточного кода вставляет: void TransmitBitDelay(void) { for (unsigned char i= число1; i!=0; i--) // здесь точка с запятой ненужна for (unsigned char j= число2; j!=0; j--); } Добавлено в : ссори вот так: void TransmitBitDelay(void) { unsigned char i,j for (i= число1; i!=0; i--) // здесь точка с запятой ненужна for (j= число2; j!=0; j--); } |
Сообщ.
#202
,
|
|
|
Кстати я там поменял:
void TransmitBitDelay(void) { int i,j for (i= число1; i!=0; i--) for (j= число2; j!=0; j--); } А зачем unsigned char? |
Сообщ.
#203
,
|
|
|
int занимает 2 байта, char 1 байт, контроллер восьмиразрядный, т е вся арифметика побайтовая, и если использовать тип int получается больше по коду, в твоем случае рационально использовать unsignrd char
Добавлено в : я тебе уже раньше писал, что int надо использовать по возможности реже |
Сообщ.
#204
,
|
|
|
Сообщ.
#205
,
|
|
|
сейчас, разбирусь с тем, что он накомпилил, и расскажу:)
|
Сообщ.
#206
,
|
|
|
;------------------------------------------------- этот код выполняется 1 раз------------------------------------- TransmitBitDelay: ;сюда попадаем по call2 цикла ; 12 { ; 13 unsigned char i,j; ; 14 for (i= 10; i!=0; i--) MOVLW 10 ;W=10 1 цикл MOVWF i ;i=W (i=10) 1 цикл GOTO TransmitBitDelay_0 ; 2 цикла ;---------------------------------------------------------------------------------------------------------------- итого 6 циклов ; 15 for (j= 10; j!=0; j--); ;--------------------------------------------этот код выполняется i*j раз---------------------------------------- ;-------------------причем команда BTFSS _A_STATUS,2 выполняется за два цикла i раз--------------------------- ;-----------------------------------------------а за один цикл i*(j-1) раз--------------------------------------- ;-------------------команда GOTO TransmitBitDelay_1 выполняется i*(j-1) раз----------------------------------- TransmitBitDelay_1: DECF j,1 ; вычитаем из j 1 1 цикл TransmitBitDelay_2: MOVF j,1 ; (j==0)? 1 цикл BTFSS _A_STATUS,2 ; если не равно 1(2)цикла GOTO TransmitBitDelay_1 ; идем вычитать j 2 цикла ;----------------------------------------------------------------------------------------------------------------- итого i*(5*j-1) циклов ;--------------------------------------------этот код выполняется i раз---------------------------------------- ;-------------------есть тонкость, команда BTFSС i-1 раз выполняется за 2 цикла и 1 раз за 1 цикл-------------- ; ------------------а команда GOTO TransmitBitDelay_4 выполнится всего один раз------------------------- DECF i,1 ; а если равно вычитаем из i 1 1 цикл TransmitBitDelay_0: MOVF i,1 ;(i==0)? 1 цикл BTFSC _A_STATUS,2 ;если равно заканчиваем ф-ю 1(2)цикла GOTO TransmitBitDelay_4 ;на завершение ф-и 2 цикла MOVLW 10 ;если не равно W=10 1 цикл MOVWF j ;j=W (j=10) 1 цикл GOTO TransmitBitDelay_2 ;идем разбираться с j 2 цикла ;----------------------------------------------------------------------------------------------------------------- итого 8*i+1 циклов ; 16 } ;----------------------------------и этот код 1 выполняется 1 раз----------------------------------------------- TransmitBitDelay_4: RETURN ; возврат в основную прогу 2 цикла ;------------------------------------------------------------------------------------------------------------ получаем всего циклов i*(5*j + 7)+9 циклов. Один цикл при твоем кварце 2MHz=2000000Hz допустим нам надо работать со частотой 9600Hz, решаем уравнение 9600=2000000/(i*(5*j+7)+9) мы видим, что оно имеет множество решений, но нам нужны целые, или максимально приближенные к целым, решается оно методом подбора P.S.проверь правильность моих вычислений, а то я мог где то ошибитьсяJ |
Сообщ.
#207
,
|
|
|
Ok
если использовать 8Mhz = (8000000) Что лучше использовать 2Mhz или 8Mhz для передачи таких небольших чисел. Но чтобы не было ни каких задержек тормажений? |
Сообщ.
#208
,
|
|
|
нет, читайте доки, они рулез:)
один такт-8MHz машинный цикл состоит у твоего пика из четырех тактов, т е 2MHz т е это я тебе сказал для твоего кварца |
Сообщ.
#209
,
|
|
|
Один цикл при твоем кварце 2MHz=2000000Hz Мой кварц вобще-то 8Mhz т е это я тебе сказал для твоего кварца Что лучше использовать 2Mhz или 8Mhz для передачи таких небольших чисел. Но чтобы не было ни каких задержек тормажений? |
Сообщ.
#210
,
|
|
|
еше раз обьясняю, машинный цикл и тактовая частота разные вещи
считай машинным циклом время выполнения самой быстрой команды у PIC16 два типа команд, одни выполняются за один машинный цикл, другие за два, есть правда команды, время выполнение которых зависит от результата у PIC16 один машинный цикл = 4 такта, т е я тебе привел вычисления для кварца 8MHz |