Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

АЦП COM порт и управление нагрузкой на PIC16F877

Непрочитано 18.03.2011, 10:56  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию 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; - это сколько - лонг или инт ?
Реклама:
__________________
warez

Последний раз редактировалось urry; 18.03.2011 в 11:00. Причина: правильнописание хромает
urry вне форума  
Непрочитано 18.03.2011, 11:42  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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.
omercury вне форума  
Непрочитано 18.03.2011, 12:33  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию 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
__________________
warez

Последний раз редактировалось urry; 18.03.2011 в 13:07.
urry вне форума  
Непрочитано 18.03.2011, 13:33  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: АЦП COM порт и управление нагрузкой на PIC16F877

Это я пошутил так неудачно...
Почему-то подумал, что тип long Int пишется по-человечески - в одно слово. Проверил себя - нет, раздельно...
omercury вне форума  
Непрочитано 18.03.2011, 14:27  
Slava-martyn
Вид на жительство
 
Аватар для Slava-martyn
 
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
Slava-martyn на пути к лучшему
По умолчанию Re: АЦП COM порт и управление нагрузкой на PIC16F877

Цитата:
Но пекаря меньше всего заботит тот факт, что краска на внешних панелях печи начала немного желтеть. Качество выпекаемого печью хлеба осталось превосходным.
У всех своё понятие о чистоте, но на первом месте качество.
Код не работает - вот где проблема (на данный момент). Ваши наставления учту, да так удобнее будет. Просто я на C++ почти не писал.
Slava-martyn вне форума  
Непрочитано 18.03.2011, 14:57  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: АЦП COM порт и управление нагрузкой на PIC16F877

Ну так это минус вам, по любому, а не тем кто вам пытался помочь.
st_1 вне форума  
Непрочитано 18.03.2011, 17:52  
Slava-martyn
Вид на жительство
 
Аватар для Slava-martyn
 
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
Slava-martyn на пути к лучшему
По умолчанию 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;
            }
        }
    }
} 
Slava-martyn вне форума  
Непрочитано 18.03.2011, 19:58  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: АЦП COM порт и управление нагрузкой на PIC16F877

Сообщение от Slava-martyn Посмотреть сообщение
Оставил по старому, сейчас всё работает.
это Вам так кажется. Код очень небезопасный, мягко говоря. Я уже не говорю о том, что плавает задержка между командой и измерением. Что не интегрируются показания АЦП.
Только по безопасности - что будет, если я пошлю 100000 байт на ком порт сразу ?
Что будет, когда во время Вашей выдачи в ком порт придет команда выдачи другого байта ?
while(!TRMT);//пока полный сдвиговый регистр
Вы не делаете, а ведь там нет буфера...
----------------------------------------------------------------
Лирическое отступление, или офтоп...-------------------------------------------
Когда я после - так скажем - высшего учебного заведения попал на вычислительный центр, я поразился тому, что 40% аппаратуры ничего не делают, именно по своему прямому назначению - ничего не вычисляют, в общем. Формируют контрольные точки, всякие тестовые дела и все.
Сейчас в программировании та же картина - очень много кода используется для тестовой выдачи - в любом учебнике по программированию - записать файл на диск, скажем - вначале идет проверка возможности записи на диск, потом все остальное.
как бы подразумевается в Вашем конкретном случае проверка готовности контроллера к обмену, проверка состояния контроллера,сделайте возможность перезагрузки с компа и пр...
Пользуйтесь !
Цитата:
*Зачем он это сделал?
–*Послушай, он жил в Убервальде в старом замке на скале. Такие люди не нуждаются в других причинах кроме «потому что могу». Им сняться кошмары, и они претворяют их в жизнь.
(С) Терри Пратчетт
__________________
warez
urry вне форума  
Непрочитано 18.03.2011, 20:31  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: АЦП COM порт и управление нагрузкой на PIC16F877

Всё правильно. Программа - это в основном обработка ошибок. И, если ошибок чудом не произошло, обработка чего либо. Иначе неизвестно как работать будет...
omercury вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Видео уроки dosikus Микроконтроллеры, АЦП, память и т.д 61 23.01.2012 21:06
Конфликт прерываний таймера и АЦП ask_e Микроконтроллеры, АЦП, память и т.д 11 08.08.2010 01:28
Управление нагрузкой через канал ТЧ с помощью DTMF сигнала tezka1 Автоматика и аппаратура связи 22 08.03.2010 21:06
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 15:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.