реклама на сайте
подробности

 
 
> char + char = int как такое сделать, Сделать из двух байт целое
bugor
сообщение Aug 27 2009, 17:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 26-02-09
Пользователь №: 45 408



Ситуатция известная -
- результат АЦП их двух байт в разных банках.
- работает три канала.
- есть массив из трех int.
Надо младший и старший байты результата АЦП обьединить в три целых переменных в массиве.

Чегото не получается никак - уже который раз пытаюсь. В AVR наких проблем нету, а на PIC редко пишу - направьте где посмотреть как это делается? Надо на СИ.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bugor
сообщение Sep 6 2009, 14:41
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 26-02-09
Пользователь №: 45 408



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

Это переменная куда заносятся байты результата. Главное, чтобы они были именно в этом порядке.
Пока сделал так - потом без структуры попробую.
CODE
union{
volatile unsigned int Vin;
struct{
volatile unsigned char UL:8;
volatile unsigned char UH:8;
} byte;
}volt;

Это программы задержки и переинициализации АЦП
CODE
void ADDelay() { //задержка 10uS
static unsigned char i;
i = 3; //Генератор 4Mhz, период 3uS,
while(i > 0) { //переменная равна 3 плюс смещение
i--;
}
}
void InitAD() {
ADIE = 1; //Разрешить прерывания от АЦП
ADCON0 = Channel; //Генегатор внутр RC + номер канала
ADIF = 0; //очистить флаг прерывания от АЦП
PEIE = 1; //Разрешить переферийные прерывания
}


Это необходимые процедуры для запуска АЦП
CODE
void main(void) {

#asm
bsf status,5 // КАЛИБРОВКА ГЕНЕРАТОРА !!!
call 0X3ff
movwf 0X90
bcf status,5
#endasm

WPU = 0; // все подтягивающие резисторы выключены
ANSEL = 0b01010011; // F/16 для АЦП и 2 канала аналоговых
GPIO = 0b00000000; // порты в ноль
TRISIO = 0b00001111; // GP4-5 на выход
OPTION = 0b10000111; // R-up выкл, делитель 1:256 к TMR0
VRCON = 0x00; // выключить источник опорного напряжения
IOCB = 0x00; // запрет прерываний по входам
CMCON = 0b00000111; // выключить компаратор
INTCON = 0b10000000; // разрешить общее прерывание

Count = 0; //первичная инициализация АЦП
Channel = 129;
InitAD();
ADDelay();
SETBIT(ADCON0,1);

while(1) { //бесконечный цикл
#asm
nop
nop
nop
nop
nop
nop
#endasm
......................................
//основная программа
......................................

}
}

А это обработка прерывания АЦП.
CODE
void interrupt ADC() {

if(ADIF == 1) {

volt.byte.UL=ADRESL; //ВОТ В ЭТИХ ТРЕХ СТРОКА ФОРМИРУЕТСЯ МАССИВ РЕЗУЛЬТАТОВ АЦП
volt.byte.UH=ADRESH; //В ДАННОМ СЛУЧАЕ - ЭТО ДВА ЦЕЛЫХ ЧИСЛА
U[Count]=volt.Vin; //ТУТ ПОЛУЧАЕМ ЦЕЛОЕ С ПРАВИЛЬНЫМ РАСПОЛОЖЕНИЕМ БАЙТОВ
//ПРИ ДАЛЬНЕЙШЕЙ МАТЕМАТИЧЕСКОЙ ОБРАБОТКЕ ВСЕ ПРОИСХОДИТ ПРАВИЛЬНО

if(++Count < 2) {
Channel = Channel + 4; //загрузить другой канал
InitAD();
ADDelay(); //задержка на 2xTad для восстановления
ADDelay();
SETBIT(ADCON0,1);
}else {
Channel = 129; //10000001b загрузка канала АЦП 0
Count = 0; //перезагрузить счетчик каналов
InitAD();
ADDelay();
ADDelay();
SETBIT(ADCON0,1);
}
}

............................
//Тут могут быть обработчики других прерываний
...........................
}


Итого был неправильно оформлен счетчик массива, разрядность АЦП 12 бит вместо десяти ну и обьединение для собственно запихивания байт в целое.
Всем спасибо!
Причина редактирования: Уменьшение горизонального размера цитаты.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- bugor   char + char = int как такое сделать   Aug 27 2009, 17:10
- - *antzol*   Это не подойдёт? int result = ((int)highByte <...   Aug 27 2009, 17:24
|- - bugor   Цитата(*antzol* @ Aug 27 2009, 21:24) Это...   Aug 27 2009, 18:01
|- - rezident   Цитата(bugor @ Aug 28 2009, 00:01) HTEC P...   Aug 27 2009, 19:07
- - *antzol*   За правильность не ручаюсь, т.к. с пиками давно не...   Aug 27 2009, 19:03
|- - bugor   Цитата(*antzol* @ Aug 27 2009, 23:03) За ...   Aug 27 2009, 20:12
- - *antzol*   ...   Aug 27 2009, 19:17
|- - Student Pupkin   А нельзя типа такого? Кодshort int adc_mass[3...   Aug 27 2009, 19:50
|- - bugor   Цитата(Student Pupkin @ Aug 27 2009, 23:5...   Aug 28 2009, 07:35
|- - Kane   Вот на что обратил внимание: Цитата(bugor @ ...   Aug 28 2009, 08:13
||- - bugor   Цитата(Kane @ Aug 28 2009, 12:13) Вот на ...   Aug 28 2009, 08:46
|- - tag   Код *(pU) = ADRESH; //старший байт в п...   Aug 28 2009, 09:57
|- - bugor   Цитата(tag @ Aug 28 2009, 13:57) Код *...   Aug 28 2009, 10:28
|- - Kane   Цитата(tag @ Aug 28 2009, 13:57) Код *...   Aug 28 2009, 10:33
- - DpInRock   char как и int - переменные со знаком. Если не зна...   Aug 27 2009, 22:40
- - DpInRock   ЦитатаПосле запрещения прерывания будут вычисления...   Aug 28 2009, 09:30
|- - bugor   Убрал запрещения и собственно ничего не изменилось...   Aug 28 2009, 09:50
- - bugor   ну так там написано в заголовке что pic12f675 ё...   Aug 28 2009, 10:45
- - Herz   С Хай-теком всё в порядке, Вы сами себя замучили т...   Aug 28 2009, 11:28
- - bugor   Ну вот что получилось - ацп работает но результата...   Aug 28 2009, 15:45
|- - Student Pupkin   Цитата(bugor @ Aug 28 2009, 19:45) Ну вот...   Aug 28 2009, 18:45
- - Herz   Не пойму я, во-первых, зачем Вы структуру сюда при...   Aug 29 2009, 10:55
- - bugor   1. В функции задержки переменная i только для счет...   Aug 29 2009, 17:14
|- - Student Pupkin   Цитата(bugor @ Aug 29 2009, 21:14) 1. В ф...   Aug 29 2009, 18:39
||- - rezident   Цитата(Student Pupkin @ Aug 30 2009, 00:3...   Aug 31 2009, 18:36
|- - Herz   Цитата(bugor @ Aug 29 2009, 19:14) 4. Стр...   Aug 29 2009, 18:47
|- - demiurg_spb   Цитата(bugor @ Aug 29 2009, 21:14) 1. В ф...   Aug 31 2009, 18:28
- - XVR   Вот это if(Count++ < 3) { должно быть так if(++...   Aug 29 2009, 18:18


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 06:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016