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

 
 
> 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
Ответов
*antzol*
сообщение Aug 27 2009, 19:17
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 6-11-07
Пользователь №: 32 085



...

Сообщение отредактировал *antzol* - Aug 27 2009, 19:23
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Aug 27 2009, 19:50
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



А нельзя типа такого?
Код
short int adc_mass[3];  // или int16_t в духе С99 ???
char *adc_byte;           // или int8_t в духе С99 ???
adc_byte = (char*)adc_mass;
*(adc_byte++) = LOW_BYTE_ADC1;    // не знаю как называются, но
*(adc_byte++) = HIGH_BYTE_ADC1;  // допустим так...
/*
и т.д. для остальных каналов АЦП
*/

Я есесно в пиках и хитеке ни гугу. Это, так сказать, лишь идея.... laughing.gif
Go to the top of the page
 
+Quote Post
bugor
сообщение Aug 28 2009, 07:35
Сообщение #4


Участник
*

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



Цитата(Student Pupkin @ Aug 27 2009, 23:50) *
А нельзя типа такого?


Не работает - преобразование вешается, я с указателями пробовал и не работает с ними у меня этот компилятор - не пойму почему.
Судя по листингу он сам активно использует косвенную адресацию и гдето там и происходит глюк, а как найти не знаю.
Вот полный код который компилируется но не работает - подскажите где ошибка.
CODE
//---------------------------------------
// Процессор PIC12F675
// Fosc = 4MHz Генератор RC-внутренний
// HI-TECH 8.05LP1
//---------------------------------------

#include <pic.h>
#include <math.h>

__CONFIG(WDTDIS & INTIO & UNPROTECT & MCLRDIS & PWRTEN & BOREN );

#define warm_out GPIO5 //выход нагревателя
#define sound_out GPIO4 //выход pреле звука
#define start_out GPIO3 //вход выключателя нагрева

volatile unsigned char Temp, Count, Channel;
volatile unsigned int U[3];// @ 0x20; //массив из трех двухбайтных элементов
volatile unsigned char *pU =(char*)U; //указатель на адрес 1го элемента массива

//МАКРОСЫ
//-----------------------------------------
#define TESTBIT(ADRESS,BIT) (ADRESS & (1<<BIT))
#define SETBIT(ADRESS,BIT) (ADRESS |= (1<<BIT))
#define CLEARBIT(ADRESS,BIT) (ADRESS &= ~(1<<BIT))
//================================
//задержка для A/D преобразования
//================================
void ADDelay() { //задержка 10uS
static unsigned char i;
i = 3; //Генератор 4Mhz, период 3uS,
while(i > 0) { //переменная равна 3 плюс смещение
i--;
}
}
//================================
//Инициализация A/D преобразования
//================================
void InitAD() {
ADIE = 1; //Разрешить прерывания от АЦП
ADCON0 = Channel; //Генегатор внутр RC + номер канала
ADIF = 0; //очистить флаг прерывания от АЦП
PEIE = 1; //Разрешить переферийные прерывания
asm("nop");
}
//==========================================================================
// MAIN
//==========================================================================
void main(void) {

GPIO = 0b00000000; // порты в ноль
TRISIO = 0b10001111; // GP4-5 на выход
OPTION = 0b00000110; // R-up выкл, делитель 1:128 к TMR0
VRCON = 0x00; // выключить источнок опорного напряжения
WPU = 0b00000000; // gp0 gp5 подтягивающие резисторы выключены
IOCB = 0x00; // запрет прерываний по входам
CMCON = 0b00000111; // компаратор выключен
INTCON =0b10000000; // разреш прерывания
ANSEL =0b01010111;
warm_out = 1;

Count = 0; //первый запуск ацп
Channel = 129; //канал ацп 0
InitAD();
ADDelay();
SETBIT(ADCON0,1);

while(1) {
ei();
asm("nop");
di();
}
}
//================================
//Обработка прерываний
//================================
void interrupt ADC() {

sound_out = 1; //индикатор работы ацп

*(pU) = ADRESH; //старший байт в первый элемент массива
*(pU++) = ADRESL; //младший байт во второй элемент массива
//точно также в 3-4 и в 5-6 элементы по циклу
if(Count++ < 3) {
Channel = Channel + 8; //загрузить другой канал
}else {
Channel = 129; //10000001b загрузка канала АЦП 0
Count = 0; //перезагрузить счетчик каналов
*pU = U[0]; //перегружаем адрес первого элемента массива
}

InitAD();
ADDelay(); //задержка на 2xTad для восстановления

sound_out=0;

ADDelay();
SETBIT(ADCON0,1); //Запуск A/D преобразования
}


По посту №4 работает АЦП и даже есть результат но понятно это по изменению младшего байта результата, а вот когда пытаюсь запихать два байта в целое то сравнения не работают то есть не получается нормальног INT из двух CHAR.
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
tag
сообщение Aug 28 2009, 09:57
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Код
  *(pU) = ADRESH;             //старший байт в первый элемент массива
      *(pU++) = ADRESL;           //младший байт во второй элемент массива


не понятно где и как инициализируется pU?
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
|- - Kane   Вот на что обратил внимание: Цитата(bugor @ ...   Aug 28 2009, 08:13
||- - bugor   Цитата(Kane @ Aug 28 2009, 12:13) Вот на ...   Aug 28 2009, 08:46
|- - 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
- - bugor   Ну вот собственно заработало. Проиллюстрирую попод...   Sep 6 2009, 14:41


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:31
Рейтинг@Mail.ru


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