АвторСообщение



Пост N: 7
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 11.03.10 23:16. Заголовок: Компилятор для PIC16F84


Здравствуйте.
Столкнулся с проблемой. Компилятор CCSC в среде MPLAB. Всё компилирует, но проблема с прерываниями и не только. Дизассемблер показывает что в прошивке вообще нет точки входа в прерывание ORG 4. Дебаггер работает вроде нормально и всё происходит как задумано. Proteus отказывается понимать прошивку как надо. Вместо правильного результата работы выдаёт какой-то бред, даже в элементарной программе моргания светодиодами. Тоже самое выдаёт прошитый контроллер. Далее пробую среду PCW C Compiler IDE... Там оказалось всё намного хуже.. даже дебаггер говорит, что данный тип контроллера не поддерживается. Следующий шаг, это переход на MicroC для PIC.Столкнулся с такой же проблемой... Пишет что ICD дебаггер не работает с данным типом устройств.
Вот как то так всё у меня... Подскажите пожалуйста рабочий дебаггер/компилятор для моего контроллера, если можно то поделитесь ссылкой))). Буду очень признателен.

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 35 [только новые]


moderator




Пост N: 1582
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 3
ссылка на сообщение  Отправлено: 11.03.10 23:35. Заголовок: WinNT пишет: Подска..


WinNT пишет:

 цитата:
Подскажите пожалуйста рабочий дебаггер/компилятор для моего контроллера, если можно то поделитесь ссылкой))). Буду очень признателен.


Так не понятно, какой контроллер? И не понятно какой язык?


Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 8
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 11.03.10 23:40. Заголовок: Язык СИ, а контролле..


Язык СИ, а контроллер PIC16F84 в заголовке темы указан=)
Помогите пожалуйста, очень нужно.

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1583
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 3
ссылка на сообщение  Отправлено: 11.03.10 23:42. Заголовок: А понял, в названии,..


А понял, в названии, 84. Но 84, никогда не поддерживал режим отладки. Поэтому и не "понимает" отладчик.
В Си не силен, да и здесь он не модный. Даже подозреваю, что и MPLAB Си для 84 не поддерживает. Слишком мал и прост.
WinNT пишет:

 цитата:
Дебаггер работает вроде нормально и всё происходит как задумано.


Как он с 84 будет работать?
Не понятно?

Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 9
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 00:03. Заголовок: полного текста пока ..


полного текста пока нет, пока только наброски но даже элементарно это работает не так как надо при компиляции в MPLAB:

#include <16F84.h> 
#fuses HS,NOWDT,NOPROTECT //нет защиты, высокочастотный кварц, нет сторожевого

byte STATUS;
byte INTCON;
byte OPTION_REG;
byte TMR0;
#locate STATUS=0x03
#locate INTCON=0x0B
#locate OPTION_REG=0x81
#locate TMR0=0x01
#bit holl_IN=0x05.0
#bit dpkv_OUT=0x05.1
#bit LED_GREEN=0x05.2
#bit LED_RED=0x05.3
#bit BTN_0=0x06.0
#bit BTN_1=0x06.1


int16 mkseconds;
int8 dtimer;
int8 dpkvtime;
int1 lastholl;
byte save_w;
byte save_status;
byte last_holl;


#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; в ПП прерывания.
Незнаю на что грешить.
в чём может быть проблема?


00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 10
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 00:07. Заголовок: MAZ пишет: Как он с..


MAZ пишет:

 цитата:
Как он с 84 будет работать?
Не понятно?



Как не странно всё работает=) и компилирует.
А Proteus и сам контроллер отжигают=)

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 11
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 00:10. Заголовок: А можно например как..


А можно например как-нибудь разработать программу под другой контроллер, отладить её,а затем откомпилировать под мой ПИК?

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1584
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 3
ссылка на сообщение  Отправлено: 12.03.10 01:27. Заголовок: Можно конечно. Взять..


Можно конечно. Взять например,873, 876, сконфигурировать, он и отладчик поддерживает. Не вылезать из памяти программ 84, ну и не забывать по особенности, порты настроить, периферию отключить..
Правда не понимаю, как можно Си в контроллере отлаживать?
На том же 84, можно таких дел натворить, но на asm. Си всю память программ займет, а толку мало.
WinNT пишет:

 цитата:
но работать с большими числами и делением на 24 проблематично в нём.


А на чем же тогда? на нем родимом. Только за счет универсальной библиотеке для Си на asm в 1,5-3 раза размер увеличат и время.
WinNT пишет:

 цитата:
Компилятор CCSC в среде MPLAB. Всё компилирует, но проблема с прерываниями и не только. Дизассемблер показывает что в прошивке вообще нет точки входа в прерывание ORG 4. Дебаггер работает вроде нормально и всё происходит как задумано


Так чего надо? компилировать Си или декомпилировать hex.
Декомпилировать в asm могу. А PICC пока ставить не собирался.

Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 12
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 01:44. Заголовок: Эмм, а как на ассемб..


Эмм, а как на ассемблере такие операции делать? Просто я щас только самодеятельностью занимаюсь. У мну специальность инженер Физик-Электронщик. К контроллером отношения не имею, это так, для жизни=)
Может есть какие-нибудь библиотеки на ассемблере для математических операций, с 16-ти битными числами?
как например мне поделить регистр на число 24?

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 13
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 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

bcf Status,0
rrf last,1 ; last/2
movfw last
addwf out,1 ; out:=out+last/8

bcf Status,0
rrf last,1 ; last/2
movfw last
subwf out,1 ; out:=out-last/16

bcf Status,0
rrf last,1 ; last/2
movfw last
addwf out,1 ; out:=out+last/32

bcf Status,0
rrf last,1 ; last/2
movfw last
subwf out,1 ; out:=out-last/64

bcf Status,0
rrf last,1 ; last/2
movfw last
addwf out,1 ; out:=out+last/128


bcf Status,0
rrf out,1 ; out:=out/2
bcf Status,0
rrf out,1 ; out:=out/2
bcf Status,0
rrf out,1 ; out:=out/2

; вернём вычисленное значение полупериода генерируемого импульса
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бит. Может есть готовые решения подпрограмм таких операций, в каких нибудь библиотеках? А то всё это как-то выглядит не рационально.

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1710
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 4
ссылка на сообщение  Отправлено: 12.03.10 03:11. Заголовок: Уважаемый WinNt. Сн..


Уважаемый WinNt.
Сначала оргвопрос.
Почему Ваш профиль участника заполнен не в соответствии с правилами форума?
Я считаю это неуважением к форуму. Подумайте над этим. В течение одних суток.
Это Вам советует админ форума, который слова на ветер не бросает.
Следующее.
Вы попали "на территорию чистого ассемблера" (см. пояснение внизу главной страницы моего сайта), то есть, языка профессионалов (это не свидетельствует о том, что все мы профи. Мы только на них учимся).
По этой простой причине, на Ваши СИ-вопросы никто отвечать не будет (таковы "правила игры").
Просьба либо изьясняться на нашем языке (и более конкретно), либо душевно (Вас поймут).
Все остальное - от лукавого и "не прокатит".
Вы, как Рязанец (очень уважаю этот воистину русский город), должны понять сказанное (кстати, я закончил РВВКУС и моя жена из Рязани).
По поводу "инженера Физика-Электронщика".
В нашем сообществе, это не имеет никакого значения. Значение имеет другое.

Может есть какие-нибудь библиотеки на ассемблере для математических операций, с 16-ти битными числами?

В ассемблере можно "сваять" всё (в пределах дозволенного разумом). По той причине, что это "мать". В том числе и для СИ. В том числе и очень качественное. Только "пахать" нужно. У Вас есть такое желание?
Если есть, то милости просим, а если нет, то Вы не туда попали.

По поводу этого:

Народ, вот кароче старая программа моя, работает, но кривовато, ошибки искать не стал особо, решил перейти на сишник, как я понял на моём железе это не реально...

Получается, что "кривизну" Вам искать лень и Вы решили "загрузить" этим нас?
Так дело не пойдёт.
Элементарный вопрос: "На каком основании люди будут тратить свое время на разборки с тем, чего Вы вожделеете"?
На мой взгляд, такого дружеского отношения к себе Вы еще не заработали.
Сначала достойно заработайте, а далее жизнь покажет.


Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 7
Зарегистрирован: 18.05.07
Откуда: Украина, Бердянск
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 04:01. Заголовок: Вот не много подпра..


Вот не много подправил, не знаю что программа должна делать, но светодиодами моргает и на 24 делит.
#include <16F84.h>  
#fuses HS,NOWDT,NOPROTECT //нет защиты, высокочастотный кварц, нет сторожевого
#use delay(clock=4000000)
byte STATUS;
byte INTCON;
byte OPTION_REG;
byte TMR0;
#locate STATUS=0x03
#locate INTCON=0x0B
#locate OPTION_REG=0x81
#locate TMR0=0x01
#bit holl_IN=0x05.0
#bit dpkv_OUT=0x05.1
//#bit LED_GREEN=0x05.2
//#bit LED_RED=0x05.3
#bit BTN_0=0x06.0
#bit BTN_1=0x06.1


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++;
}


void main()
{
OPTION_REG=0b11010000;
SET_TRIS_A(0b00000001);
SET_TRIS_B(0b00000011);
dpkvtime=0;
// Инициализируем TMR0, коэффициент деления = 32
setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
// Разрешить прерывание от TMR0
enable_interrupts(int_timer0);
// Глобальное разрешение прерываний INTCON,7 = 1
enable_interrupts(global);

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;
}
}
}


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1711
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 4
ссылка на сообщение  Отправлено: 12.03.10 04:22. Заголовок: Николай, просьба в..


Николай, просьба выложить то же самое, но в чистом "ассемблере".
Просто интересно, сколько это занимает "места" в памяти программ. А также и с точки зрения возможной оптимизации.

Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1585
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 3
ссылка на сообщение  Отправлено: 12.03.10 09:59. Заголовок: WinNT пишет: Эмм, а..


WinNT пишет:

 цитата:
Эмм, а как на ассемблере такие операции делать?


А на чем же? Для понимания. Си или любой язык высокого уровня это прежде всего библиотека на asm.
Когда прижмет, делают еще ассемблерные вставки.
Почему то сложилось мнение на Си можно, а на асм нельзя. Как будто Си это какое то заклинания для контроллера "подели на 24". Достал компилятор из библиотеки программу деления на асм, причем не оптимальную и перевел в hex. "Слава Великому он поделил, а асм такое не умеет" Смешно же ведь.
Если ковш у эскаватора метр на метр, как прокопать траншею в ширину лопаты? Правильно, надо взять лопату и сделать. Ковш эту работу сделает быстро, но не ювелирно, и с большим запасом. Ну уж яму тоже можно 2х2 выкопать и лопатой, причем аккуратненько под размеры и без осыпания.
Дешевле выйдет, чуть подольше в первый раз, но потом.... главное чтобы "силы" в голове были.
Интересовался работой людей ломающие доступы к программам "кряки". Так вот там высокий уровень не катит, только asm и все видно как на ладони, и код с которым надо сравнить, чтобы программа посчитала за своего. Или вообще убрать подпрограмму замка. На С или чем то более крутом, это танец с бубном. Но так и было задуманно. Кто спустится на уровень регистра, когда почти одной строчкой можно поделить 64 разрядные числа.

Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 14
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 11:10. Заголовок: Evgeny Korabelnikov ..


Evgeny Korabelnikov пишет:

 цитата:
Почему Ваш профиль участника заполнен не в соответствии с правилами форума?
Я считаю это неуважением к форуму. Подумайте над этим. В течение одних суток.



Извините,наверное просто забыл. Всё исправил.

Evgeny Korabelnikov пишет:

 цитата:
Получается, что "кривизну" Вам искать лень и Вы решили "загрузить" этим нас?



Ну на самом деле я не хотел вас грузить никого тут, но в принципе основной ответ получил от MAZ, спасибо вам большое.

MAZ пишет:

 цитата:
А на чем же? Для понимания. Си или любой язык высокого уровня это прежде всего библиотека на asm.



Ну это понятно, просто я подумал что эти библиотеки уже существуют и велосипед изобретать не придётся. Эххх щас бы действительно найти бы разобранные по полочкам алгоритмы на ASM под СИ компилятор=)

ur3qmn пишет:

 цитата:
Вот не много подправил, не знаю что программа должна делать, но светодиодами моргает и на 24 делит.



Моя программа тоже работала,просто дело в том, если перестать управлять PIN_A3, то PIN_A2 просто загорается и всё, больше не тухнет, я так понимаю возможно это глюк компилятора.

Ладно, спасибо всем за оказанное содействие.
Буду возвращаться на ассемблер, пробовать громоздить код с 16бит числами. .... задумка проскочила написать собственный компилятор=))))

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1181
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг: 3
Фото:
ссылка на сообщение  Отправлено: 12.03.10 12:26. Заголовок: WinNT пишет: что эт..


WinNT пишет:

 цитата:
что эти библиотеки уже существуют

На официальном сайте есть математические библиотеки для работы с плавающей запятой, и по моему даже для целых чисел есть отдельная библиотека...

Еще неизвестно, что хуже: постоянный бардак или непостоянный порядок? Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 15
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 12.03.10 12:27. Заголовок: На сайте микрочип?..


На сайте микрочип?

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1182
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг: 3
Фото:
ссылка на сообщение  Отправлено: 12.03.10 12:34. Заголовок: Ну да..


Ну да

Еще неизвестно, что хуже: постоянный бардак или непостоянный порядок? Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1587
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 3
ссылка на сообщение  Отправлено: 12.03.10 12:45. Заголовок: WinNT пишет: просто..


WinNT пишет:

 цитата:
просто я подумал что эти библиотеки уже существуют и велосипед изобретать не придётся. Эххх щас бы действительно найти бы разобранные по полочкам алгоритмы на ASM


Да и здесь тоже кое что имеется, разложенное по полочкам, присоединяйтесь. Если деление, делим просто и быстро, даже с десятичной запятой и n знаков после . Да и велосипед изобретать иногда полезно, а вдруг на квадратных колесах ездить будет.
WinNT пишет:

 цитата:
Буду возвращаться на ассемблер, пробовать громоздить код с 16бит числами


Не громоздить, а оптимизировть. Возьмите эту операцию на Си и переведите в асм, вот где громаждение.

Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 8
Зарегистрирован: 18.05.07
Откуда: Украина, Бердянск
Рейтинг: 0
ссылка на сообщение  Отправлено: 25.03.10 13:08. Заголовок: Евгений Александров..


Евгений Александрович пишет:

 цитата:
Николай, просьба выложить то же самое, но в чистом "ассемблере".
Просто интересно, сколько это занимает "места" в памяти программ. А также и с точки зрения возможной оптимизации.



Это дизассемблированный, ранее приведенный код.

---  C:\PROGRA~1\PICC\devices\16F628.h  ---------------------------------------------------------- 
1: //////// Standard Header file for the PIC16F628 device ////////////////
2: #device PIC16F628
050 0832 MOVF 0x32, W
051 01F8 CLRF 0x78
052 0231 SUBWF 0x31, W
053 1803 BTFSC 0x3, 0
054 2858 GOTO 0x58
055 0831 MOVF 0x31, W
056 00F7 MOVWF 0x77
057 2864 GOTO 0x64
058 01F7 CLRF 0x77
059 3008 MOVLW 0x8
05A 00B3 MOVWF 0x33
05B 0DB1 RLF 0x31, F
05C 0DF7 RLF 0x77, F
05D 0832 MOVF 0x32, W
05E 0277 SUBWF 0x77, W
05F 1803 BTFSC 0x3, 0
060 00F7 MOVWF 0x77
061 0DF8 RLF 0x78, F
062 0BB3 DECFSZ 0x33, F
063 285B GOTO 0x5b
064 3400 RETLW 0
--- C:\Program Files\Microchip\PIC\Pr\Pr.c -----------------------------------------------------
1: #include <16F628.h>
000 3000 MOVLW 0
001 008A MOVWF 0xa
002 2865 GOTO 0x65
003 0000 NOP
004 00FF MOVWF 0x7f
005 0E03 SWAPF 0x3, W
006 0183 CLRF 0x3
007 00A1 MOVWF 0x21
008 087F MOVF 0x7f, W
009 00A0 MOVWF 0x20
00A 080A MOVF 0xa, W
00B 00A8 MOVWF 0x28
00C 018A CLRF 0xa
00D 0EA0 SWAPF 0x20, F
00E 0804 MOVF 0x4, W
00F 00A2 MOVWF 0x22
010 0877 MOVF 0x77, W
011 00A3 MOVWF 0x23
012 0878 MOVF 0x78, W
013 00A4 MOVWF 0x24
014 0879 MOVF 0x79, W
015 00A5 MOVWF 0x25
016 087A MOVF 0x7a, W
017 00A6 MOVWF 0x26
018 087B MOVF 0x7b, W
019 00A7 MOVWF 0x27
01A 1383 BCF 0x3, 0x7
01B 1283 BCF 0x3, 0x5
01C 1E8B BTFSS 0xb, 0x5
01D 2820 GOTO 0x20
01E 190B BTFSC 0xb, 0x2
01F 2833 GOTO 0x33
020 0822 MOVF 0x22, W
021 0084 MOVWF 0x4
022 0823 MOVF 0x23, W
023 00F7 MOVWF 0x77
024 0824 MOVF 0x24, W
025 00F8 MOVWF 0x78
026 0825 MOVF 0x25, W
027 00F9 MOVWF 0x79
028 0826 MOVF 0x26, W
029 00FA MOVWF 0x7a
02A 0827 MOVF 0x27, W
02B 00FB MOVWF 0x7b
02C 0828 MOVF 0x28, W
02D 008A MOVWF 0xa
02E 0E21 SWAPF 0x21, W
02F 0083 MOVWF 0x3
030 0EFF SWAPF 0x7f, F
031 0E7F SWAPF 0x7f, W
032 0009 RETFIE
2: #fuses HS,NOWDT,NOPROTECT //нет защиты, высокочастотный кварц, нет сторожевого
3: #use delay(clock=4000000)
4: byte STATUS;
5: byte INTCON;
6: byte OPTION_REG;
7: byte TMR0;
8: #locate STATUS=0x03
9: #locate INTCON=0x0B
10: #locate OPTION_REG=0x81
11: #locate TMR0=0x01
12: #bit holl_IN=0x05.0
13: #bit dpkv_OUT=0x05.1
14: //#bit LED_GREEN=0x05.2
15: //#bit LED_RED=0x05.3
16: #bit BTN_0=0x06.0
17: #bit BTN_1=0x06.1
18:
19:
20: int mkseconds;
21: int dtimer;
22: int dpkvtime;
23: int lastholl;
24: int i;
25: byte save_w;
26: byte save_status;
27: byte last_holl;
28:
29: #int_timer0
30: void timer0_isr(void)
31: {
32: if(i)
033 08AD MOVF 0x2d, F
034 1903 BTFSC 0x3, 0x2
035 2840 GOTO 0x40
33: {
34: OUTPUT_LOW(PIN_A2);// светодиод должен моргать при прерываниях
036 1683 BSF 0x3, 0x5
037 1105 BCF 0x5, 0x2
038 1283 BCF 0x3, 0x5
039 1105 BCF 0x5, 0x2
35: OUTPUT_HIGH(PIN_A3);
03A 1683 BSF 0x3, 0x5
03B 1185 BCF 0x5, 0x3
03C 1283 BCF 0x3, 0x5
03D 1585 BSF 0x5, 0x3
36: i = 0;
03E 01AD CLRF 0x2d
37: }
38: else
03F 284A GOTO 0x4a
39: {
40: OUTPUT_LOW(PIN_A3);
040 1683 BSF 0x3, 0x5
041 1185 BCF 0x5, 0x3
042 1283 BCF 0x3, 0x5
043 1185 BCF 0x5, 0x3
41: OUTPUT_HIGH(PIN_A2);
044 1683 BSF 0x3, 0x5
045 1105 BCF 0x5, 0x2
046 1283 BCF 0x3, 0x5
047 1505 BSF 0x5, 0x2
42: i = 1;
048 3001 MOVLW 0x1
049 00AD MOVWF 0x2d
43: }
44: //LED_GREEN^=LED_GREEN; //если убрать эту строчку то LED_RED не моргает, не знаю почему
45: TMR0=0; //инкемент происходит через каждые 100мкс
04A 0181 CLRF 0x1
46: mkseconds++;
04B 0AA9 INCF 0x29, F
47: dtimer++;
04C 0AAA INCF 0x2a, F
48: }
49:
50:
04D 110B BCF 0xb, 0x2
04E 118A BCF 0xa, 0x3
04F 2820 GOTO 0x20
51: void main()
52: {
065 0184 CLRF 0x4
066 301F MOVLW 0x1f
067 0583 ANDWF 0x3, F
068 3007 MOVLW 0x7
069 009F MOVWF 0x1f
53: OPTION_REG=0b11010000;
06A 30D0 MOVLW 0xd0
06B 1683 BSF 0x3, 0x5
06C 0081 MOVWF 0x1
54: SET_TRIS_A(0b00000001);
06D 3001 MOVLW 0x1
06E 0065 TRIS 0x5
55: SET_TRIS_B(0b00000011);
06F 3003 MOVLW 0x3
070 0066 TRIS 0x6
56: dpkvtime=0;
071 1283 BCF 0x3, 0x5
072 01AB CLRF 0x2b
57: // Инициализируем TMR0, коэффициент деления = 32
58: setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
073 3004 MOVLW 0x4
074 00F7 MOVWF 0x77
075 1DF7 BTFSS 0x77, 0x3
076 287F GOTO 0x7f
077 3007 MOVLW 0x7
078 0181 CLRF 0x1
079 3081 MOVLW 0x81
07A 0084 MOVWF 0x4
07B 0800 MOVF 0, W
07C 39C0 ANDLW 0xc0
07D 380F IORLW 0xf
07E 0080 MOVWF 0
07F 0064 CLRWDT
080 3081 MOVLW 0x81
081 0084 MOVWF 0x4
082 0800 MOVF 0, W
083 39C0 ANDLW 0xc0
084 0477 IORWF 0x77, W
085 0080 MOVWF 0
59: // Разрешить прерывание от TMR0
60: enable_interrupts(int_timer0);
086 168B BSF 0xb, 0x5
61: // Глобальное разрешение прерываний INTCON,7 = 1
62: enable_interrupts(global);
087 30C0 MOVLW 0xc0
088 048B IORWF 0xb, F
63:
64: while (TRUE)
65: {
66: if(holl_IN==0 & lastholl==1) // если от +12 к 0
089 3000 MOVLW 0
08A 1C05 BTFSS 0x5, 0
08B 3001 MOVLW 0x1
08C 00B2 MOVWF 0x32
08D 0B2C DECFSZ 0x2c, W
08E 2890 GOTO 0x90
08F 2892 GOTO 0x92
090 3000 MOVLW 0
091 2893 GOTO 0x93
092 3001 MOVLW 0x1
093 0532 ANDWF 0x32, W
094 1903 BTFSC 0x3, 0x2
095 289F GOTO 0x9f
67: {
68: lastholl=0;
096 01AC CLRF 0x2c
69: dpkvtime=mkseconds/24;
097 0829 MOVF 0x29, W
098 00B1 MOVWF 0x31
099 3018 MOVLW 0x18
09A 00B2 MOVWF 0x32
09B 2050 CALL 0x50
09C 0878 MOVF 0x78, W
09D 00AB MOVWF 0x2b
70: mkseconds=0;
09E 01A9 CLRF 0x29
71: }
72: if(holl_IN==1 & lastholl==0) // если от 0 к +12
09F 3000 MOVLW 0
0A0 1805 BTFSC 0x5, 0
0A1 3001 MOVLW 0x1
0A2 00B2 MOVWF 0x32
0A3 08AC MOVF 0x2c, F
0A4 1903 BTFSC 0x3, 0x2
0A5 28A8 GOTO 0xa8
0A6 3000 MOVLW 0
0A7 28A9 GOTO 0xa9
0A8 3001 MOVLW 0x1
0A9 0532 ANDWF 0x32, W
0AA 1903 BTFSC 0x3, 0x2
0AB 28B6 GOTO 0xb6
73: {
74: lastholl=1;
0AC 3001 MOVLW 0x1
0AD 00AC MOVWF 0x2c
75: dpkvtime=mkseconds/24;
0AE 0829 MOVF 0x29, W
0AF 00B1 MOVWF 0x31
0B0 3018 MOVLW 0x18
0B1 00B2 MOVWF 0x32
0B2 2050 CALL 0x50
0B3 0878 MOVF 0x78, W
0B4 00AB MOVWF 0x2b
76: mkseconds=0;
0B5 01A9 CLRF 0x29
77: }
78:
79: if (dtimer>dpkvtime & dpkvtime!=0)
0B6 082A MOVF 0x2a, W
0B7 022B SUBWF 0x2b, W
0B8 1C03 BTFSS 0x3, 0
0B9 28BC GOTO 0xbc
0BA 3000 MOVLW 0
0BB 28BD GOTO 0xbd
0BC 3001 MOVLW 0x1
0BD 00B1 MOVWF 0x31
0BE 08AB MOVF 0x2b, F
0BF 1D03 BTFSS 0x3, 0x2
0C0 28C3 GOTO 0xc3
0C1 3000 MOVLW 0
0C2 28C4 GOTO 0xc4
0C3 3001 MOVLW 0x1
0C4 0531 ANDWF 0x31, W
0C5 1903 BTFSC 0x3, 0x2
0C6 28CA GOTO 0xca
80: {
81: dpkv_OUT=!dpkv_OUT;
0C7 3002 MOVLW 0x2
0C8 0685 XORWF 0x5, F
82: dtimer=0;
0C9 01AA CLRF 0x2a
83: }
84: }
0CA 2889 GOTO 0x89
0CB 0063 SLEEP


Но это далеко не оптимальный код С, т.е на С тоже надо уметь писать правильно, что бы получать оптимальный вариант. Я сам на С не пишу, но прогресс не стоит на месте... Там где нужен С, он нужен. Плохого ни чего за этот язык не скажу, а вот от компилятора зависит много.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1766
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 5
ссылка на сообщение  Отправлено: 25.03.10 19:17. Заголовок: Николай, спасибо, ..


Николай, спасибо, но пока ("беглый взгляд") я вижу "кота в мешке", с которым нужно детально разбираться.
Примерно то же самое можно получить в результате дизассемблирования.
Задаю главный вопрос: "Вы создали СИ-программу. Можете ли Вы детально (на уровне отдельных команд, "закольцовок", тактики и т.д.) объяснить ее работу"?
Только ради Бога не ссылайтесь на "СИ-волшебника".
Если нет, то как говорится, "на нет и суда нет".
Если можете, то объясните. В "чистом асссемблере" (без коррекции СИ-результата). С достойными комментариями на русском языке и т.д. (НАШИ правила Вы знаете. Для этого и создан "Обмен…"). Разберемся.
Лично я, с учётом того, что существует командная, скоростная и функциональная оптимизация (их "гибрид" - само собой), всеми конечностями "за" такую "тренировку", причём, вне зависимости от конечного результата ("мозговой штурм" полезен всегда).


Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 9
Зарегистрирован: 18.05.07
Откуда: Украина, Бердянск
Рейтинг: 0
ссылка на сообщение  Отправлено: 26.03.10 03:30. Заголовок: Евгений Александрови..


Евгений Александрович пишет:

 цитата:
Задаю главный вопрос: "Вы создали СИ-программу. Можете ли Вы детально (на уровне отдельных команд, "закольцовок", тактики и т.д.) объяснить ее работу"?


В предыдущем посте я писал, что языком С не владею и программы для PIC на нем не пишу, пробовал, но как-то не пошло, по этому я не могу ответить на ваш вопрос!


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1769
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 5
ссылка на сообщение  Отправлено: 26.03.10 04:37. Заголовок: Николай, понятно. ..


Николай, понятно. Если ненароком "зацепил", то принародно прошу у Вас прощения.
В этом случае, можно посоветовать только одно: использовать "СИ-продукт" как "наводку на то-сё".
Проще говоря, сначала нужно убедиться в работоспособности "СИ-матери", затем детально понять ее логику, а затем "заоптимизировать" ее под конкретную задачу.
В нашем деле, это вполне может оказаться полезным. И даже очень. Как источник готовых, но избыточных решений, требующих тщательной проверки (в приложении к решению конкретной задачи) и "доведения до ума", но не более того.


Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 3
Зарегистрирован: 02.04.10
Откуда: г.Элиста
Рейтинг: 0
ссылка на сообщение  Отправлено: 06.04.10 11:32. Заголовок: К вопросу о подпрогр..


К вопросу о подпрограммах для PIC-ов на Ассемблере.
В книге Майкл Предко. «СПРАВОЧНИК по PIC-микроконтроллерам. »
Глава 11. Полезные подпрограммы.
Глава 12. 16-разрядные числа.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 17
Info: Студент
Зарегистрирован: 28.01.10
Откуда: Россия, Рязань
Рейтинг: 0
ссылка на сообщение  Отправлено: 23.04.10 01:57. Заголовок: Evgeny Korabelnikov ..


Evgeny Korabelnikov пишет:

 цитата:
Задаю главный вопрос: "Вы создали СИ-программу. Можете ли Вы детально (на уровне отдельных команд, "закольцовок", тактики и т.д.) объяснить ее работу"?



Вот знаете, я когда на Сишнеге писал, всё понимал, что там на "самом деле" происходит. Сколько этих возможно не нужных кодов команд вписывается в файл прошивки... Вот просто обычное условие прописываю, а в голове в это время всё это же,только в объёме ассемблера представляется=) и тут думаешь:"Как же хорошо, что там всё уже до меня сделали". Сейчас я понимаю, что я пишу не операционку UNIX, а маленькую программульку, которая каждому под силу и на ассемблере, при этом создаётся высшая степень оптимизации размера и быстродействия программы=)
Мой выбор - ассемблер!!!=)
Спасибо всем вам!!!

00000001+00000001=00000002 Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 4
Зарегистрирован: 27.09.10
Откуда: Россия, Ярославль
Рейтинг: 0
ссылка на сообщение  Отправлено: 27.09.10 23:30. Заголовок: ur3qmn , какая верси..


WinNT , какая версия компилятора ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 5
Зарегистрирован: 27.09.10
Откуда: Россия, Ярославль
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.09.10 16:59. Заголовок: #include <16F84...



 цитата:
#include <16F84.h >
#fuses HS, NOWDT, NOPROTECT //нет защиты, высокочастотный кварц, нет сторожевого
#use delay (clock = 4000000)
//------------------------
#byte STATUS = 0x03
#byte INTCON = 0x0B
#byte OPTION_REG = 0x81
#byte TMR0 = 0x01
#byte PORTA = 0x05
#byte PORTB = 0x06
#bit holl_IN = PORTA.0
#bit dpkv_OUT = PORTA.1
#define LED_GREEN PIN_A2
#define LED_RED PIN_A3
#bit Marker = PORTB.2 //FOR debug only!!
#bit BTN_0 = PORTB.0
#bit BTN_1 = PORTB.1
//------------------------

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) {
// This secthion for debg only
Marker = 1; //
#asm //
NOP //
NOP //
NOP //
#endasm //
Marker = 0; //
//---------------------------
mkseconds++;
dtimer++;
i++;
IF (i == 30) {
i = 0;
output_toggle (LED_GREEN);
output_toggle (LED_RED);
}

TMR0 = 0; //инкемент происходит через каждые 100мкс

//----------------------------------
VOID main () {
OPTION_REG = 0b11010000;
SET_TRIS_A (0b00000001);
SET_TRIS_B (0b00000001);
PORTB = 0;
PORTA = 0b00000100;
dpkvtime = 0;
setup_counters (RTCC_INTERNAL, RTCC_DIV_32); // Инициализируем TMR0, коэффициент деления = 32
enable_interrupts (INT_timer0); // Разрешить прерывание от TMR0
enable_interrupts (global); // Глобальное разрешение прерываний INTCON, 7 = 1

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;
}
}
}



Здесь все мигает ...
И так :
1) Наивно полагаем , что прерываться бум каждые 100 мкс .
Считаем 1/(100/32/256) получаем ~ 8.24 мс
Но даже и так - интересно вы сможете увидеть эти переключения ?
Посему заведен доп. делитель i .Получаем приблизительный период переключения ~490 мс.
Но это костыли , вычисляйте делители с учетом ваших выражений в main цикле , чтобы не пришлось делать сложных вычислений.

2) В условных операторах должны использоваться логические выражения . & и && это не одно и то же .
Советую почитать Кернигана и Ричи.

3) Сравнения вашего исходника с моим и чтение справки/литературы вам поможет.

4) Не слушайте тех кто говорит что только асм или только С .
Изучайте и то и другое . И то и другое можно использовать совместно.
В С асм вставки - для ускорения/уменьшения размера кода.
Привыкнув к дисциплине в С можно на асм создавать хорошо структирироованый код.
ЗЫ Если обьясните механику , можно и работу остальной части исправить.
ЗЫЫ Не могу приаттачить ни картинки ни файлы.



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2291
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 5
ссылка на сообщение  Отправлено: 28.09.10 18:48. Заголовок: Для usbeeax. Вы по..


Для usbeeax.
Вы попали в "епархию чистого асма" (это оговорено изначально). Просьба изьясняться на нём.

Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 7
Зарегистрирован: 27.09.10
Откуда: Россия, Ярославль
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.09.10 19:45. Заголовок: Есть, сэр ! Больше т..


Есть, сэр ! Больше такого не повторится.

Но человек задал вопрос о С .
С этим как быть?




Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2293
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 5
ссылка на сообщение  Отправлено: 28.09.10 20:07. Заголовок: Есть, сэр ! Больше т..


Есть, сэр ! Больше такого не повторится.
Терпеть не могу сэров/пэров/мэнов/…, так как у них менталитет не тот. А то, что Вы поняли (надеюсь на это) "правила игры", хорошо.
Это приветствуется. Соблюдайте их и всё будет в норме, а если не будете соблюдать, то разговор будет другим. На мой взгляд, это жёстко, но справедливо ("красным цветом я не разбрасываюсь").

Но человек задал вопрос о С .
С этим как быть?

В соответствии с конечным результатом (ответ человека, задавшего вопрос):
Мой выбор - ассемблер!!!=)
Спасибо всем вам!!!



Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2135
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 4
ссылка на сообщение  Отправлено: 28.09.10 21:57. Заголовок: usbeeax пишет: ЗЫ ..


usbeeax пишет:

 цитата:
ЗЫ


usbeeax пишет:

 цитата:
ЗЫЫ


Полистал Ожегова, не нашел. Тогда зачем, или это на Си?

Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 8
Зарегистрирован: 27.09.10
Откуда: Россия, Ярославль
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.09.10 22:03. Заголовок: MAZ, ЗЫ = = PS иска..


MAZ, ЗЫ = = PS
искать в google Post Scriptum.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2295
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг: 5
ссылка на сообщение  Отправлено: 28.09.10 22:12. Заголовок: Значит лень перекл..


Значит лень переключить раскладку клавиатуры. Это наводит на всяческие мысли.

Безумству храбрых поем мы песню (А.М.Горький) Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2136
Зарегистрирован: 03.01.07
Откуда: Россия, Рассказово Тамбовская обл
Рейтинг: 4
ссылка на сообщение  Отправлено: 28.09.10 22:44. Заголовок: usbeeax = гыиууфч, п..


usbeeax = гыиууфч, понятно!
Наверно так проще.
А зыы, это наверно опечатка? PSS.

Я знаю, что мало знаю, узнаю больше, и понимаю, что знаю еще меньше. Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 529
Зарегистрирован: 18.11.08
Откуда: Россия, г.Уфа
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.09.10 16:48. Заголовок: MAZ пишет: А зыы, э..


MAZ пишет:

 цитата:
А зыы, это наверно опечатка? PSS.


Эта опечатка прижилась ещё до интернета в Fidonet (Фидо).
Это из тех случаев которые стоит знать, но не стоит им следовать.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 23
Зарегистрирован: 27.09.10
Откуда: Россия, Ярославль
Рейтинг: 0
ссылка на сообщение  Отправлено: 02.10.10 22:56. Заголовок: Автору топика похоже..


Автору топика похоже ничего уже не нужно , сам не рад что вопрос задал.
Модераторы запугали бедного новичка.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 5
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия