16.03.2008, 11:46
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от pegas19
|
Либо версия 4,038 (CCS PICC).
А проблема собственно в следующем. Прог-му пишу под 16F877 и по превышению програмного кода свыше 26% ROM моя прог-ма работает не коректно!
Вот я и грешу на активацию компилятора.
Спасибо.
|
Предьявляй аргументы и факты. А на словах ...
У меня проект на 877, память и программ и данных используеться на 98 % , но ты же на слово не поверишь!?
|
|
|
|
16.03.2008, 16:29
|
|
Прохожий
Регистрация: 17.06.2005
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Подскажите, как организовать опрос двух АЦП, с разных ног. Цель такова, изменять частоту и ширину импульсов. Проблема в том, что при разных значениях знаменателя у меня регулировка ширины импульса влияет на частоту.
Код:
|
#include ‹16F676.h›
#device ADC=10
#use delay(clock=4000000)
#fuses INTRC, NOWDT
#byte ADCON0 = 0x1F
long int h=1;
long int h1=1;//Ширина импульса
int32 p=1; //пауза
int32 period=1;//Период
void main()
{
while(1)
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
ADCON0 |= 2;
set_adc_channel(2);
period = read_adc() ;
ADCON0 |= 2;
set_adc_channel(0);
h = (read_adc()) ;
output_high(PIN_C5);
h1=h/75;
delay_ms(h1);
output_low(PIN_C5);
p = (period-h1)/4;
delay_ms(p);//Пауза max=(1024-h1)/4
}
} |
|
|
|
|
16.03.2008, 16:33
|
|
Прохожий
Регистрация: 17.06.2005
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Когда в знаменателе ставлю одинаковые числа 4 и 4 или 75 и 75 то все работает отлично. Но мне надо изменять частоту от 20 до 120 герц, а ширину импульсов от 1 до 10 мС.
|
|
|
|
16.03.2008, 20:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от AlexeyGN
|
Когда в знаменателе ставлю одинаковые числа 4 и 4 или 75 и 75 то все работает отлично. Но мне надо изменять частоту от 20 до 120 герц, а ширину импульсов от 1 до 10 мС.
|
Как можно изменять ширину импульсов от 1 до 10 мС ? Это же скважность как я помню,то есть ширина импульса может занимать или весь период(максимальное) или не будет импульса-это мин импульс.
Я понял что ты делаеш ширину импульса и период задержками,к тому же период зависит от разности измереных двумя АЦП.Но сами вычесления я не понял
Код:
|
output_high(PIN_C5);
h1=h/75;
delay_ms(h1);
output_low(PIN_C5);
p = (period-h1)/4;
delay_ms(p);//Пауза max=(1024-h1)/4 |
|
|
|
|
17.03.2008, 22:50
|
|
Прохожий
Регистрация: 16.07.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от pegas19
|
Либо версия 4,038 (CCS PICC).
А проблема собственно в следующем. Прог-му пишу под 16F877 и по превышению програмного кода свыше 26% ROM моя прог-ма работает не коректно!
Вот я и грешу на активацию компилятора.
Спасибо.
|
Нашел решение своей проблемы ! Мне надо было переключать страницы памяти .
#ORG 0x1000,0x17FF //Вот так к примеру.
void function()
{
;
}
До переключая страниц памяти "GOTO PCLATH+0x????"
отправлял прог-му неизвестно куда.
Всем спасибо за отклик.
-- Прилагается рисунок: --
![](https://kazus.ru/nuke/users_images/17032008/6650878.JPG)
|
|
|
|
18.03.2008, 01:41
|
|
Прохожий
Регистрация: 17.06.2005
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
На мой взгляд все довольно просто. Но отчего-то не работает ![Улыбка](images/smilies/icon_smile.gif) . Я мог бы сразу подставлять результат считывания АЦП в переменную для задержки, но так как я хочу получить более высокую частоту то
Код:
|
output_low(PIN_C5);//выставляю 0 после задержки h1
p = (period-h1)/4;// period-это результат оцифровки(частота)
delay_ms(p);//длительность паузы |
|
|
|
|
18.03.2008, 01:52
|
|
Прохожий
Регистрация: 17.06.2005
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
В книге Шпака есть пример использования АЦП через прерывание. Вроде со всем разобрался из примера, а вот как подобным образом считывать из двух каналов не получается. Если не затруднит приведите пример использования.
P.S. Суть программы, правильно, изменять скважность и частоту(я сразу не точно выразился) ![Обижен](images/smilies/icon_beee.gif) . Только ширина импулься мах=10мС, а период примерно 100мС. Т.е. скважность 10.
|
|
|
|
29.03.2008, 20:22
|
|
Прохожий
Регистрация: 08.03.2008
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
подскажите:
в CCS есть драйвер для графического дисплея ks0108 - GLCD,чета он у меня в протеусе не очень.
Линии , прямоуг -какая-то крокозябра получается,
точки:подряд рисую 5 точек(5 раз glcd_pixel(x,y,off))
-первые две -норм,третья и четвертая-не то,пятая опять как надо.
glcd_circle-та же ерунда.
glcd_fillScreen(color) -норм
Мож кто сталкивался? в чем косяк?
Прошу прощения что немного не в тему.
|
|
|
|
12.04.2008, 12:58
|
|
Частый гость
Регистрация: 01.07.2005
Сообщений: 16
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от AlexeyGN
|
В книге Шпака есть пример использования АЦП через прерывание. Вроде со всем разобрался из примера, а вот как подобным образом считывать из двух каналов не получается. Если не затруднит приведите пример использования.
P.S. Суть программы, правильно, изменять скважность и частоту(я сразу не точно выразился) . Только ширина импулься мах=10мС, а период примерно 100мС. Т.е. скважность 10.
|
Хороший вопрос(в смысле для меня тоже и вовремя). Сам собираюсь делать нечто подобное! В компиляторе есть хелп и там(в "Index") есть функция:SET_ADC_CHANNEL( ) и пояснения по ней:
Цитата:
|
Specifies the channel to use for the next READ_ADC call. Be aware that you must wait a short time after changing the channel before you can get a valid read. The time varies depending on the impedance of the input source. In general 10us is good for most applications. You need not change the channel before every read if the channel does not change
|
и пример использования:
Код:
|
set_adc_channel(2);
delay_us(10);
value = read_adc(); |
а в папке "Examples" компилятора есть такой пример работы с АЦП:
Код:
|
// EX_ADMM.C
#if defined(__PCM__)
#include ‹16F877.h›
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#elif defined(__PCH__)
#include ‹18F452.h›
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif
void main() {
int i, value, min, max;
printf("Sampling:");
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
do {
min=255;
max=0;
for(i=0; i‹=30; ++i) {
delay_ms(100);
value = Read_ADC();
if(value‹min)
min=value;
if(value›max)
max=value;
}
printf("
Min: %2X Max: %2X
",min,max);
} while (TRUE);
} |
правда без прерываний, а прямое чтение канала 0 АЦП(см. пример).
|
|
|
|
17.04.2008, 18:03
|
|
Прохожий
Регистрация: 13.11.2007
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
приветствую
по поводу примера из книги шпака попробуйте такой вариант:
Код:
|
#include ‹18F458.h›
#device ADC=10
#use delay(clock=10000000)
#fuses HS, NOWDT
#byte ADCON0 = 0xFC2
int n,x;
#int_AD
AD_isr()
{
if (x==0)
{
n = read_adc() / 102;
output_D(~(2 ‹‹ n - 1));
}
if (x==1)
{
n = read_adc() / 102;
output_C(~(2 ‹‹ n - 1));
}
if (x›=2){x=0;} else {x=x+1;}
set_adc_channel(x);
ADCON0 |= 4;
}
void main()
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
enable_interrupts(INT_AD);
enable_interrupts(global);
set_adc_channel(0);
ADCON0 |= 4;
while(1); |
имеем 2 канала АЦП. AN0 отображается с помощью светодиодов порта D, AN1 - порт C. На 18 серии работает.
Обкатал в протеусе
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:25.
|
|