Отправлено: 11.03.10 23:16. Заголовок: Компилятор для PIC16F84
Здравствуйте. Столкнулся с проблемой. Компилятор CCSC в среде MPLAB. Всё компилирует, но проблема с прерываниями и не только. Дизассемблер показывает что в прошивке вообще нет точки входа в прерывание ORG 4. Дебаггер работает вроде нормально и всё происходит как задумано. Proteus отказывается понимать прошивку как надо. Вместо правильного результата работы выдаёт какой-то бред, даже в элементарной программе моргания светодиодами. Тоже самое выдаёт прошитый контроллер. Далее пробую среду PCW C Compiler IDE... Там оказалось всё намного хуже.. даже дебаггер говорит, что данный тип контроллера не поддерживается. Следующий шаг, это переход на MicroC для PIC.Столкнулся с такой же проблемой... Пишет что ICD дебаггер не работает с данным типом устройств. Вот как то так всё у меня... Подскажите пожалуйста рабочий дебаггер/компилятор для моего контроллера, если можно то поделитесь ссылкой))). Буду очень признателен.
Отправлено: 11.03.10 23:42. Заголовок: А понял, в названии,..
А понял, в названии, 84. Но 84, никогда не поддерживал режим отладки. Поэтому и не "понимает" отладчик. В Си не силен, да и здесь он не модный. Даже подозреваю, что и MPLAB Си для 84 не поддерживает. Слишком мал и прост. WinNT пишет:
цитата:
Дебаггер работает вроде нормально и всё происходит как задумано.
#int_rtcc void TIMER_INTERRUPT () { #asm MOVWF save_w SWAPF STATUS,W MOVWF save_status BCF STATUS,5 BCF STATUS,6 #endasm LED_RED=!LED_RED; // светодиод должен моргать при прерываниях LED_GREEN=!LED_GREEN; //если убрать эту строчку то LED_RED не моргает, не знаю почему TMR0=150; //инкемент происходит через каждые 100мкс mkseconds++; dtimer++; #asm SWAPF save_status,W MOVWF STATUS SWAPF save_w,F SWAPF save_w,W #endasm }
void main() { TMR0=0; OPTION_REG=0b11010000; INTCON=0b10100000; SET_TRIS_A(0b00000001); SET_TRIS_B(0b00000011); dpkvtime=0; while (TRUE) { if(holl_IN==0 & lastholl==1) // если от +12 к 0 { lastholl=0; dpkvtime=mkseconds/24; mkseconds=0; } if(holl_IN==1 & lastholl==0) // если от 0 к +12 { lastholl=1; dpkvtime=mkseconds/24; mkseconds=0; }
if (dtimer>dpkvtime & dpkvtime!=0) { dpkv_OUT=!dpkv_OUT; dtimer=0; } } }
Ассемблер знаю на свой взгляд очень хорошо, писал много программ, но работать с большими числами и делением на 24 проблематично в нём. В данной программе почемуто вообще практически не работает,а именно не происходит исполнения этой строчки кода
dpkv_OUT=!dpkv_OUT;
А также не мигает LED_RED, если убрать строчку LED_GREEN=!LED_GREEN; в ПП прерывания. Незнаю на что грешить. в чём может быть проблема?
Отправлено: 12.03.10 01:27. Заголовок: Можно конечно. Взять..
Можно конечно. Взять например,873, 876, сконфигурировать, он и отладчик поддерживает. Не вылезать из памяти программ 84, ну и не забывать по особенности, порты настроить, периферию отключить.. Правда не понимаю, как можно Си в контроллере отлаживать? На том же 84, можно таких дел натворить, но на asm. Си всю память программ займет, а толку мало. WinNT пишет:
цитата:
но работать с большими числами и делением на 24 проблематично в нём.
А на чем же тогда? на нем родимом. Только за счет универсальной библиотеке для Си на asm в 1,5-3 раза размер увеличат и время. WinNT пишет:
цитата:
Компилятор CCSC в среде MPLAB. Всё компилирует, но проблема с прерываниями и не только. Дизассемблер показывает что в прошивке вообще нет точки входа в прерывание ORG 4. Дебаггер работает вроде нормально и всё происходит как задумано
Так чего надо? компилировать Си или декомпилировать hex. Декомпилировать в asm могу. А PICC пока ставить не собирался.
Отправлено: 12.03.10 01:44. Заголовок: Эмм, а как на ассемб..
Эмм, а как на ассемблере такие операции делать? Просто я щас только самодеятельностью занимаюсь. У мну специальность инженер Физик-Электронщик. К контроллером отношения не имею, это так, для жизни=) Может есть какие-нибудь библиотеки на ассемблере для математических операций, с 16-ти битными числами? как например мне поделить регистр на число 24?
Отправлено: 12.03.10 02:16. Заголовок: Народ, вот кароче ст..
Народ, вот кароче старая программа моя, работает, но кривовато, ошибки искать не стал особо, решил перейти на сишник, как я понял на моём железе это не реально... Цель задачи: преобразовать сигнал датчика холла на распердвале двигателя, в сигнал датчика положения коленвала. 1 оборот растредвала = 5 импульсов датчика холла (двигатель 5 цилиндров) 1 оборот распредвала = 2 оборота коленвала = 60 импульсов настоящего датчика коленвала, с двумя пропусками.
;*********************************************************************************************** ; emul.asm - версия 8 бит ; Устройство эмуляции ДПКВ 60-2 по ДХ для 5ц двигателя ; PIC16F84A Кварц 10 мГц. ; Автор: WinNT ;=============================================================================================== LIST p=16F84 ; Установка типа микроконтроллера. __CONFIG 03FF1H ; Бит защиты выключен, WDT выключен, ; стандартный XT - генератор. ;=============================================================================================== ; Определение положения регистров специального назначения. ;=============================================================================================== TMR0 equ 01h ; таймер для прерывания PCL equ 02h ; Регистр позиции процессора Status equ 03h ; Регистр выбора банка. Option_reg equ 81h ; настройка контроллера intcon equ 0bh ; Конфигурационный регистр прерываний TrisA equ 05h ; Регистр выбора направления работы выводов порта А. PortA equ 05h ; Регистр управления защелками порта А. TrisB equ 06h ; Регистр выбора направления работы выводов порта В. PortB equ 06h ; Регистр управления защелками порта В. ;=============================================================================================== ; Определение названия и положения регистров общего назначения. ;=============================================================================================== tmp equ 0Ch ; временное хранение информации htm equ 0Dh ; регистр времени холла Stat_Temp equ 0Fh ; младший регистр времени TMPL equ 10h ; временное хранение инфы last equ 11h ; Время ДХ out equ 12h ; Время ДПКВ flag equ 13h ; регистр флагов (0,0,0,0,0,0,завершение вычисления времени генерируемого импульса ; бит 7 - не исп. ; бит 6 - не исп. ; бит 5 - запрет изменения времени в прерывании. ; бит 4 - принудительный инкремен времени ; бит 3 - флаг сброса времени генератора ; бит 2 - предыдущее значение датчика холла. ; бит 1 - Вычисление нового времени генерируемого импульса произведено ; бит 0 - Генерация импульсов разрешена gtm equ 14h ; текущее время генерации одного импульса (младший регистр) gtmH equ 15h ; (старший регистр) div equ 16h ; число делений outH equ 17h ; старший для деления TMPH equ 18h ; тоже для разной инфы outL equ 19h ; младший для деления ;=============================================================================================== ; Определение места размещения результатов операций. ;=============================================================================================== F equ 1 ; Результат направить в регистр. ;===============================================================================================
org 0 ; Начать выполнение программы с адреса 0 PC. goto init ; Переход в инициализацию org 4 ; Точка входа в прерывание prerivanie movwf tmp ; Сохраняем регистр W movfw Status ; сохраним Status movwf Stat_Temp ; btfsc intcon,2 ; проверяем на наличие прерывания по таймеру goto timer_prer ; если да, тогда выполняем программу goto exit_prer ; если нет, то выходим timer_prer ; инкремент времени генератора btfsc flag,5 ; если сейчас нельзя (т.е.работает генератор/счётчик) goto genset ; тогда пропускаем, иначе инкрементируем системные счётчики ; инкремент времени генератора incf gtm ; btfss Status,2 ; регистр переполнился? goto incholl2 ; если нет, то инкрементируем время холла movlw .255 ; если да, то принудительно ставим максимум movwf gtm incholl2 incf htm ; инкремент холла btfss Status,2 ; регистр переполнился? goto exit_prer ; если нет, то выходим movlw .255 ; если да, то принудительно ставим максимум movwf htm goto exit_prer ; и выходим genset bsf flag,4 ; заставляем генератор/счётчик инкрементировать время при возможности exit_prer movfw Stat_Temp ; movwf Status ; Возвращаем Status movfw tmp ; Возвращаем значение регистра W bcf intcon,2 ; сброс переполнения таймера retfie ; выход из прерывания, PCL и PCH из стека
;######################################################################################################### init ; Инициализация контроллера movlw b'10100000' ; Конфигурация прерываний movwf intcon bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status). movlw b'11010000' ; Резисторы PORTB выключены, внутренний такт, предделитель 1/32 movwf Option_reg movlw b'00000000' ; Первый контакт на вход, а остальные на выход movwf TrisA ; для порта А movlw .0 ; Всё на выход movwf TrisB ; для порта B bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит movlw .0 ; Обнуляем порты и регистры movwf PortB movwf PortA movwf htm movwf last movwf tmp movwf TMR0 movwf gtm movwf flag goto rundrive ; Запускам двигатель
main ; Главный цикл программы bsf flag,1 ; запретить вычисление call holltimer ; мерием время импульсов холла call calculate ; вычисляем новые импульсы btfsc flag,0 ; проверка на разрешение генерировать call generate ; генерация новых импульсов
goto main
rundrive ; Процедура запуска двигателя ; Пока нет реализации bsf PortA,3 ; Красный светодид btfsc PortA,0 ; если сейчас +12 goto stop1 ; тогда ждём установки 0 goto stop0 ; иначе ждём установки +12 stop1 btfsc PortA,0 ; если +12 goto stop1 ; ждём bcf flag,2 ; иначе запоминаем текущее значение 0 goto yes_run ; начинаем запуск stop0 btfss PortA,0 ; если 0 goto stop0 ; ждём bsf flag,2 ; запоминаем текущее значение +12 yes_run bcf PortA,3 ; светодиод погаснет clrf htm bsf flag,3 ; сброс таймера для первого генерирования goto main return
holltimer ; регистрация времени прерывания шторки btfsc flag,2 ; если было +12 goto wait0 ; то ждём 0 ; иначе ждём +12 btfss PortA,0 ; если до сих пор 0 return ; то выходим ; если стало +12 bsf flag,2 ; то установим предыдущее значение в 1 goto savetime ; и сохраняем время wait0 ; точка ожидания 0 btfsc PortA,0 ; если пока +12 return ; то выходим ; если стало 0 bcf flag,2 ; то установим предыдущее значение в 0 ; и сохраняем время savetime bsf flag,5 ; запретим прерыванию менять время системы movfw htm ; записываем время полуимпульса и сбрасываем счётчик времени movwf last bcf flag,1 ; занова посчитать новое время
; bsf flag,3 ; сброс таймера для первого генерирования ; bcf PortA,1 ; ставим 0 на выходе ; bcf flag,4 ; сохраним 0
clrf htm btfsc flag,4 ; если во время сохранения произошло прерывание, goto increment_system ; тогда инкрементируем время системы bcf flag,5 ; разрешить прерыванию менять время генератора return
generate ; процедура генерации импульсов за заданное время bsf flag,5 ; запретим прерыванию менять время системы btfsc flag,3 ; если надо сбросить время генератора, то clrf gtm ; очистка времени генератора ; проверяем текущее время генерации bsf PortA,2 ; генератор включен (зелёный светодиод) ; goto invert ; movfw gtm ; проверим регистр subwf last,0 ; (w=last-gtm) btfss Status,0 ; если отрицательный результат (прошло достаточно времени) goto invert ; инвертируем сигнал на выходе и обнуляем счётчик времени ; проверим их равенство btfsc Status,2 ; если результат равен 0 (т.е регистры равны), тогда goto invert ; инвертируем goto end_gener ; иначе выходим т.к.рано инвертирвать invert btfsc PortA,1 ; если +5, то делаем 0 goto null_out bsf PortA,1 ; иначе делаем +5 goto clr_gtm null_out bcf PortA,1 clr_gtm clrf gtm ; очистка времени генератора
end_gener ; завершение генерации bcf flag,3 ; время изначально сброшено (для первого импульса) btfsc flag,4 ; если во время генерации произошло (1) прерывание, goto increment_system ; тогда инкрементируем время системы bcf flag,5 ; разрешить прерыванию менять время генератора return
calculate ; процедура вычисления времени новых импульсов генерации ; цель которой, заключается в делений на 24 btfsc flag,1 ; если уже вычислялоcь для данного момента return ; то выходим ; goto setlast ; ставим аварийный генератор ; goto was_ok
bcf Status,0 rrf last,1 ; last/2 bcf Status,0 rrf last,1 ; last/2 movfw last movwf out ; out:=last/4
; вернём вычисленное значение полупериода генерируемого импульса movfw out movwf last
movlw .0 ; проверка last на 0 xorwf last,0 ; btfsc Status,2 ; тогда goto setlast ; ставим аварийный генератор goto was_ok ; иначе всё уже нормaльно, можно генерировать
setlast ; принудительно поставим last для аварийного режима movlw .100 movwf last was_ok bsf flag,1 ; вычисление выполнено bsf flag,0 ; установим флаг разрешения генерации в 1 ; bsf last,0 return
;###################################################################################################### increment_system ; системный инкремент счётчиков времени ; инкремент времени генератора incf gtm ; btfss Status,2 ; регистр переполнился? goto incholl ; если нет, то инкрементируем время холла movlw .255 ; если да, то принудительно ставим максимум movwf gtm incholl incf htm ; инкремент холла btfss Status,2 ; регистр переполнился? goto end_sys_inc ; если нет, то выходим movlw .255 ; если да, то принудительно ставим максимум movwf htm end_sys_inc bcf flag,4 ; принудительный инкремент сброшен bcf flag,5 ; разрешить прерыванию менять время генератора return ; (increment_system) возврат в main
error404 bsf PortA,3 goto error404
end ; Директива конца программы
Помогите чем сможете, может есть какие рекомендации? Знаю одно, что в прерываниях надо выставлять TMR0 где-то 150 (просто погрешность работы программы очень большая), но тогда счётчик будет выходить за диапазон 8бит. Нужно как-то всё переделать под 16бит. Может есть готовые решения подпрограмм таких операций, в каких нибудь библиотеках? А то всё это как-то выглядит не рационально.
Уважаемый WinNt. Сначала оргвопрос. Почему Ваш профиль участника заполнен не в соответствии с правилами форума? Я считаю это неуважением к форуму. Подумайте над этим. В течение одних суток. Это Вам советует админ форума, который слова на ветер не бросает. Следующее. Вы попали "на территорию чистого ассемблера" (см. пояснение внизу главной страницы моего сайта), то есть, языка профессионалов (это не свидетельствует о том, что все мы профи. Мы только на них учимся). По этой простой причине, на Ваши СИ-вопросы никто отвечать не будет (таковы "правила игры"). Просьба либо изьясняться на нашем языке (и более конкретно), либо душевно (Вас поймут). Все остальное - от лукавого и "не прокатит". Вы, как Рязанец (очень уважаю этот воистину русский город), должны понять сказанное (кстати, я закончил РВВКУС и моя жена из Рязани). По поводу "инженера Физика-Электронщика". В нашем сообществе, это не имеет никакого значения. Значение имеет другое.
Может есть какие-нибудь библиотеки на ассемблере для математических операций, с 16-ти битными числами?
В ассемблере можно "сваять" всё (в пределах дозволенного разумом). По той причине, что это "мать". В том числе и для СИ. В том числе и очень качественное. Только "пахать" нужно. У Вас есть такое желание? Если есть, то милости просим, а если нет, то Вы не туда попали.
По поводу этого:
Народ, вот кароче старая программа моя, работает, но кривовато, ошибки искать не стал особо, решил перейти на сишник, как я понял на моём железе это не реально...
Получается, что "кривизну" Вам искать лень и Вы решили "загрузить" этим нас? Так дело не пойдёт. Элементарный вопрос: "На каком основании люди будут тратить свое время на разборки с тем, чего Вы вожделеете"? На мой взгляд, такого дружеского отношения к себе Вы еще не заработали. Сначала достойно заработайте, а далее жизнь покажет.
int mkseconds; int dtimer; int dpkvtime; int lastholl; int i; byte save_w; byte save_status; byte last_holl;
#int_timer0 void timer0_isr(void) { if(i) { OUTPUT_LOW(PIN_A2);// светодиод должен моргать при прерываниях OUTPUT_HIGH(PIN_A3); i = 0; } else { OUTPUT_LOW(PIN_A3); OUTPUT_HIGH(PIN_A2); i = 1; } //LED_GREEN^=LED_GREEN; //если убрать эту строчку то LED_RED не моргает, не знаю почему TMR0=0; //инкемент происходит через каждые 100мкс mkseconds++; dtimer++; }
while (TRUE) { if(holl_IN==0 & lastholl==1) // если от +12 к 0 { lastholl=0; dpkvtime=mkseconds/24; mkseconds=0; } if(holl_IN==1 & lastholl==0) // если от 0 к +12 { lastholl=1; dpkvtime=mkseconds/24; mkseconds=0; }
if (dtimer>dpkvtime & dpkvtime!=0) { dpkv_OUT=!dpkv_OUT; dtimer=0; } } }
Николай, просьба выложить то же самое, но в чистом "ассемблере". Просто интересно, сколько это занимает "места" в памяти программ. А также и с точки зрения возможной оптимизации.
А на чем же? Для понимания. Си или любой язык высокого уровня это прежде всего библиотека на asm. Когда прижмет, делают еще ассемблерные вставки. Почему то сложилось мнение на Си можно, а на асм нельзя. Как будто Си это какое то заклинания для контроллера "подели на 24". Достал компилятор из библиотеки программу деления на асм, причем не оптимальную и перевел в hex. "Слава Великому он поделил, а асм такое не умеет" Смешно же ведь. Если ковш у эскаватора метр на метр, как прокопать траншею в ширину лопаты? Правильно, надо взять лопату и сделать. Ковш эту работу сделает быстро, но не ювелирно, и с большим запасом. Ну уж яму тоже можно 2х2 выкопать и лопатой, причем аккуратненько под размеры и без осыпания. Дешевле выйдет, чуть подольше в первый раз, но потом.... главное чтобы "силы" в голове были. Интересовался работой людей ломающие доступы к программам "кряки". Так вот там высокий уровень не катит, только asm и все видно как на ладони, и код с которым надо сравнить, чтобы программа посчитала за своего. Или вообще убрать подпрограмму замка. На С или чем то более крутом, это танец с бубном. Но так и было задуманно. Кто спустится на уровень регистра, когда почти одной строчкой можно поделить 64 разрядные числа.
Почему Ваш профиль участника заполнен не в соответствии с правилами форума? Я считаю это неуважением к форуму. Подумайте над этим. В течение одних суток.
Извините,наверное просто забыл. Всё исправил.
Evgeny Korabelnikov пишет:
цитата:
Получается, что "кривизну" Вам искать лень и Вы решили "загрузить" этим нас?
Ну на самом деле я не хотел вас грузить никого тут, но в принципе основной ответ получил от MAZ, спасибо вам большое.
MAZ пишет:
цитата:
А на чем же? Для понимания. Си или любой язык высокого уровня это прежде всего библиотека на asm.
Ну это понятно, просто я подумал что эти библиотеки уже существуют и велосипед изобретать не придётся. Эххх щас бы действительно найти бы разобранные по полочкам алгоритмы на ASM под СИ компилятор=)
ur3qmn пишет:
цитата:
Вот не много подправил, не знаю что программа должна делать, но светодиодами моргает и на 24 делит.
Моя программа тоже работала,просто дело в том, если перестать управлять PIN_A3, то PIN_A2 просто загорается и всё, больше не тухнет, я так понимаю возможно это глюк компилятора.
Ладно, спасибо всем за оказанное содействие. Буду возвращаться на ассемблер, пробовать громоздить код с 16бит числами. .... задумка проскочила написать собственный компилятор=))))
просто я подумал что эти библиотеки уже существуют и велосипед изобретать не придётся. Эххх щас бы действительно найти бы разобранные по полочкам алгоритмы на ASM
Да и здесь тоже кое что имеется, разложенное по полочкам, присоединяйтесь. Если деление, делим просто и быстро, даже с десятичной запятой и n знаков после . Да и велосипед изобретать иногда полезно, а вдруг на квадратных колесах ездить будет. WinNT пишет:
цитата:
Буду возвращаться на ассемблер, пробовать громоздить код с 16бит числами
Не громоздить, а оптимизировть. Возьмите эту операцию на Си и переведите в асм, вот где громаждение.
Пост N: 8
Зарегистрирован: 18.05.07
Откуда: Украина, Бердянск
Рейтинг:
0
Отправлено: 25.03.10 13:08. Заголовок: Евгений Александров..
Евгений Александрович пишет:
цитата:
Николай, просьба выложить то же самое, но в чистом "ассемблере". Просто интересно, сколько это занимает "места" в памяти программ. А также и с точки зрения возможной оптимизации.
Но это далеко не оптимальный код С, т.е на С тоже надо уметь писать правильно, что бы получать оптимальный вариант. Я сам на С не пишу, но прогресс не стоит на месте... Там где нужен С, он нужен. Плохого ни чего за этот язык не скажу, а вот от компилятора зависит много.
Николай, спасибо, но пока ("беглый взгляд") я вижу "кота в мешке", с которым нужно детально разбираться. Примерно то же самое можно получить в результате дизассемблирования. Задаю главный вопрос: "Вы создали СИ-программу. Можете ли Вы детально (на уровне отдельных команд, "закольцовок", тактики и т.д.) объяснить ее работу"? Только ради Бога не ссылайтесь на "СИ-волшебника". Если нет, то как говорится, "на нет и суда нет". Если можете, то объясните. В "чистом асссемблере" (без коррекции СИ-результата). С достойными комментариями на русском языке и т.д. (НАШИ правила Вы знаете. Для этого и создан "Обмен…"). Разберемся. Лично я, с учётом того, что существует командная, скоростная и функциональная оптимизация (их "гибрид" - само собой), всеми конечностями "за" такую "тренировку", причём, вне зависимости от конечного результата ("мозговой штурм" полезен всегда).
Пост N: 9
Зарегистрирован: 18.05.07
Откуда: Украина, Бердянск
Рейтинг:
0
Отправлено: 26.03.10 03:30. Заголовок: Евгений Александрови..
Евгений Александрович пишет:
цитата:
Задаю главный вопрос: "Вы создали СИ-программу. Можете ли Вы детально (на уровне отдельных команд, "закольцовок", тактики и т.д.) объяснить ее работу"?
В предыдущем посте я писал, что языком С не владею и программы для PIC на нем не пишу, пробовал, но как-то не пошло, по этому я не могу ответить на ваш вопрос!
Николай, понятно. Если ненароком "зацепил", то принародно прошу у Вас прощения. В этом случае, можно посоветовать только одно: использовать "СИ-продукт" как "наводку на то-сё". Проще говоря, сначала нужно убедиться в работоспособности "СИ-матери", затем детально понять ее логику, а затем "заоптимизировать" ее под конкретную задачу. В нашем деле, это вполне может оказаться полезным. И даже очень. Как источник готовых, но избыточных решений, требующих тщательной проверки (в приложении к решению конкретной задачи) и "доведения до ума", но не более того.
Пост N: 3
Зарегистрирован: 02.04.10
Откуда: г.Элиста
Рейтинг:
0
Отправлено: 06.04.10 11:32. Заголовок: К вопросу о подпрогр..
К вопросу о подпрограммах для PIC-ов на Ассемблере. В книге Майкл Предко. «СПРАВОЧНИК по PIC-микроконтроллерам. » Глава 11. Полезные подпрограммы. Глава 12. 16-разрядные числа.
Задаю главный вопрос: "Вы создали СИ-программу. Можете ли Вы детально (на уровне отдельных команд, "закольцовок", тактики и т.д.) объяснить ее работу"?
Вот знаете, я когда на Сишнеге писал, всё понимал, что там на "самом деле" происходит. Сколько этих возможно не нужных кодов команд вписывается в файл прошивки... Вот просто обычное условие прописываю, а в голове в это время всё это же,только в объёме ассемблера представляется=) и тут думаешь:"Как же хорошо, что там всё уже до меня сделали". Сейчас я понимаю, что я пишу не операционку UNIX, а маленькую программульку, которая каждому под силу и на ассемблере, при этом создаётся высшая степень оптимизации размера и быстродействия программы=) Мой выбор - ассемблер!!!=) Спасибо всем вам!!!
Здесь все мигает ... И так : 1) Наивно полагаем , что прерываться бум каждые 100 мкс . Считаем 1/(100/32/256) получаем ~ 8.24 мс Но даже и так - интересно вы сможете увидеть эти переключения ? Посему заведен доп. делитель i .Получаем приблизительный период переключения ~490 мс. Но это костыли , вычисляйте делители с учетом ваших выражений в main цикле , чтобы не пришлось делать сложных вычислений.
2) В условных операторах должны использоваться логические выражения . & и && это не одно и то же . Советую почитать Кернигана и Ричи.
3) Сравнения вашего исходника с моим и чтение справки/литературы вам поможет.
4) Не слушайте тех кто говорит что только асм или только С . Изучайте и то и другое . И то и другое можно использовать совместно. В С асм вставки - для ускорения/уменьшения размера кода. Привыкнув к дисциплине в С можно на асм создавать хорошо структирироованый код. ЗЫ Если обьясните механику , можно и работу остальной части исправить. ЗЫЫ Не могу приаттачить ни картинки ни файлы.
Пост N: 2293
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг:
5
Отправлено: 28.09.10 20:07. Заголовок: Есть, сэр ! Больше т..
Есть, сэр ! Больше такого не повторится. Терпеть не могу сэров/пэров/мэнов/…, так как у них менталитет не тот. А то, что Вы поняли (надеюсь на это) "правила игры", хорошо. Это приветствуется. Соблюдайте их и всё будет в норме, а если не будете соблюдать, то разговор будет другим. На мой взгляд, это жёстко, но справедливо ("красным цветом я не разбрасываюсь").
Но человек задал вопрос о С . С этим как быть? В соответствии с конечным результатом (ответ человека, задавшего вопрос): Мой выбор - ассемблер!!!=) Спасибо всем вам!!!
Все даты в формате GMT
3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет