| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
АЦП COM порт и управление нагрузкой на PIC16F877
18.03.2011, 10:56
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
да, я не вижу никакой необходимости выделять для ацп отдельное прерывание. Да и для таймера, собственно, тоже.
Преобразование ацп происходит несколько микросекунд - это время сопоставимо с тем, что Вы теряете при сохранении восстановлении контекста прерывания. Отдельное прерывание придумали для ацп затем, чтобы уложить контроллер в спячку, запустить и проснуться - тогда шумы генератора, наводки от импульсных сигналов не будут сказываться на точности измерения.
Далее - функции временных задержек рассчитаны на частоту кварца, кратную 4 мегаГерцам, так что идея с таймером была верной. Реализация подкачала .
|
PHP код:
|
#define FOSC 10240000
#define TMR1_SET 65536 - ((FOSC/4)/1000) // 1 ms
#define TMR1_H (TMR1_SET››8)&0xFF
#define TMR1_L TMR1_SET&0xFF
//
T1CKPS0=divid0; // T1CON
T1CKPS1=divid1; // устанавливаем делители
T1OSCEN=0;//выключаем внутренний генератор
TMR1CS=0; //внутренняя тактовая частота на таймер
TMR1ON=1;
CCP1CON=0;//режим захвата выключен
TMR1IF=0;
TMR1IE=0;//прерывания от таймера запрещены
void fn_DelayMs(unsigned int iDelay)
{
do{
TMR1H=TMR1_H;
TMR1L=TMR1_L;
TMR1IF=0;
do{
}while(!TMR1IF);
}while(--iDelay);
}
|
И, наконец, что за шпаковские извращения ???
__CONFIG(0x03F72);
ADCON1=0b10001110;
Никаких абсолютных значений в тексте!!!
"В любые времена и на любой земле" (С) Галина Хомчик.
__CONFIG(HS & WDTEN & PWRTEN & BOREN & LVPDIS & UNPROTECT );
например
Откройте заголовочный файл на камень и оттуда берите правильные названия бит и регистров.
long unsigned int counter; - это сколько - лонг или инт ?
Последний раз редактировалось urry; 18.03.2011 в 11:00.
Причина: правильнописание хромает
|
|
|
|
18.03.2011, 11:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
Сообщение от urry
|
И, наконец, что за шпаковские извращения ???
__CONFIG(0x03F72);
ADCON1=0b10001110;
Никаких абсолютных значений в тексте!!!
"В любые времена и на любой земле" (С) Галина Хомчик.
__CONFIG(HS & WDTEN & PWRTEN & BOREN & LVPDIS & UNPROTECT );
|
Абсолютно согласен! И это не только вопрос стиля. По возможности все константы и переменные (глобальные) декларируйте в одном месте (я например делаю отдельный файл). В программе используйте имя константы, а не абсолютное значение. Если что-то зависит от частоты резонатора(тот же UART), используйте формулы - у Вас под столом большой калькулятор - пусть занимается своими прямыми обязанностями. При необходимости вся программа впоследствии переделывается сменой нескольких цифр в одном месте.
Сообщение от urry
|
|
long unsigned int counter; - это сколько - лонг или инт ?
|
Это же длинный беззнаковый интеджер!
Типы переменных.zip
Последний раз редактировалось omercury; 18.03.2011 в 11:52.
|
|
|
|
18.03.2011, 12:33
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
я имел в виду, что вначале должен идти знак - unsigned long int, человек не должен задумываться над тем, что бы это могло быть. Понятно, что компилятору это все равно - меня раздражает.
http://local.joelonsoftware.com/medi...BD.D0.B3.D1.80
http://www.codenet.ru/progr/visualc/...n-Notation.php
Последний раз редактировалось urry; 18.03.2011 в 13:07.
|
|
|
|
18.03.2011, 13:33
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
Это я пошутил так неудачно... 
Почему-то подумал, что тип long Int пишется по-человечески - в одно слово. Проверил себя - нет, раздельно...
|
|
|
|
18.03.2011, 14:27
|
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
|
Цитата:
|
|
Но пекаря меньше всего заботит тот факт, что краска на внешних панелях печи начала немного желтеть. Качество выпекаемого печью хлеба осталось превосходным.
|
У всех своё понятие о чистоте, но на первом месте качество.
Код не работает - вот где проблема (на данный момент). Ваши наставления учту, да так удобнее будет. Просто я на C++ почти не писал.
|
|
|
|
18.03.2011, 14:57
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
Ну так это минус вам, по любому, а не тем кто вам пытался помочь.
|
|
|
|
18.03.2011, 17:52
|
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
Минус, да, я и не спорю.
omercury, Ваш кусочек кода мне понравился, но он всегда выдаёт нули. Оставил по старому, сейчас всё работает.
|
PHP код:
|
#include ‹pic.h›
#define FOSC 10240000
#define vbod 9600
#define serial_error() OERR
#define nostop() FERR
#define serial_fix() {CREN = 0; CREN = 1;}
#define SPBRG_ ((FOSC/vbod) -16)/16
__CONFIG(0x03F72);
unsigned char a=0, b=0;
volatile char c=0, send=0, k=0, e=0;
unsigned long int counter=0;
interrupt void tajm(void)
{
//------------------------------------------
// if (TMR0IF& TMR0IE)
// {
// T0IF=0;
// counter++;
// ADGO=1; //Запуск АЦП
// }
//------------------------------------------
// if (ADIF & ADIE) // окончание преобразования АЦП (не работает)
// {
// a=ADRESL;
// b=ADRESH;
// ADIF=0;
// }
//------------------------------------------
if (TMR0IF& TMR0IE)
{
T0IF=0;
counter++;
if (e==1)
{
ADGO=1;
while(ADGO==1)
{
}
a=ADRESL;
b=ADRESH;
e=0;
}
}
//------------------------------------------
// if (TMR0IF& TMR0IE)
// {
// T0IF=0;
// counter++;
// ADGO=1;
// }
//------------------------------------------
// if (ADIF && ADIE) // окончание преобразования АЦП (не работает)
// {
// while(ADGO==1)
// {
// }
// a=ADRESL;
// b=ADRESH;
// ADIF=0;
// }
//------------------------------------------
if (RCIF && RCIE) // чтение из порта
{
if(serial_error()) serial_fix();
if (nostop()) RCREG;
c=RCREG;
send=1;
RCIF=0;
}
//------------------------------------------
}
void pauza(long unsigned int Pause)
{
counter = 0;
while (counter ‹ Pause)
{
}
}
void main(void)
{
TMR0=0;
OPTION= 0b11010000; //таймер 1:2
T0IE=1; //разрешаем прерывания от таймера
GIE=1;
TRISB=0;
PORTB=200;
ADCON1=0b10001110;
ADCON0=0b10000001;
SPEN=1;//разрешение работы последовательного порта
SYNC =0;//включение асинхронного режима работы
TX9=0; // выбираем 8 - битовую передачу
RX9=0; // выбираем 8 - битовый прием
BRGH =1;//включаем высокоскоростной режим
SPBRG=SPBRG_;// устанавливаем скорость обмена
TXEN=1;// не люблю я ножек в 3 состоянии....
TXIE=0;//запрещаем прерывания от передатчика
CREN =1; // разрешаем прерывания от приемника
RCIE=1;
TRISD=1;
PORTD=0;
while(1==1)
{
if(send)
{
send=0;
if (c==1 && k==1)
{
k=0;
PORTB=0;
pauza(40);
PORTB=200;
e=1; //Запуск АЦП
//ADGO=1; //Запуск АЦП
}
if (c==2 && k==1)
{
k=0;
e=1; //Запуск АЦП
//ADGO=1; //Запуск АЦП
}
if (c==3 && k==1)
{
k=0;
TXREG=a;
}
if (c==4 && k==1)
{
k=0;
TXREG=b;
}
if (c==5)
{
k=1;
}
if (c==6 && k==1)
{
k=0;
TXREG=10;
}
}
}
}
|
|
|
|
|
18.03.2011, 19:58
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
Сообщение от Slava-martyn
|
|
Оставил по старому, сейчас всё работает.
|
это Вам так кажется. Код очень небезопасный, мягко говоря. Я уже не говорю о том, что плавает задержка между командой и измерением. Что не интегрируются показания АЦП.
Только по безопасности - что будет, если я пошлю 100000 байт на ком порт сразу ?
Что будет, когда во время Вашей выдачи в ком порт придет команда выдачи другого байта ?
while(!TRMT);//пока полный сдвиговый регистр
Вы не делаете, а ведь там нет буфера...
----------------------------------------------------------------
Лирическое отступление, или офтоп...-------------------------------------------
Когда я после - так скажем - высшего учебного заведения попал на вычислительный центр, я поразился тому, что 40% аппаратуры ничего не делают, именно по своему прямому назначению - ничего не вычисляют, в общем. Формируют контрольные точки, всякие тестовые дела и все.
Сейчас в программировании та же картина - очень много кода используется для тестовой выдачи - в любом учебнике по программированию - записать файл на диск, скажем - вначале идет проверка возможности записи на диск, потом все остальное.
как бы подразумевается в Вашем конкретном случае проверка готовности контроллера к обмену, проверка состояния контроллера,сделайте возможность перезагрузки с компа и пр...
Пользуйтесь !
|
Цитата:
|
*Зачем он это сделал?
–*Послушай, он жил в Убервальде в старом замке на скале. Такие люди не нуждаются в других причинах кроме «потому что могу». Им сняться кошмары, и они претворяют их в жизнь.
|
(С) Терри Пратчетт
|
|
|
|
18.03.2011, 20:31
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: АЦП COM порт и управление нагрузкой на PIC16F877
Всё правильно. Программа - это в основном обработка ошибок. И, если ошибок чудом не произошло, обработка чего либо. Иначе неизвестно как работать будет...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:24.
|
|