|
char + char = int как такое сделать, Сделать из двух байт целое |
|
|
|
Aug 27 2009, 17:10
|
Участник

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

|
Ситуатция известная - - результат АЦП их двух байт в разных банках. - работает три канала. - есть массив из трех int. Надо младший и старший байты результата АЦП обьединить в три целых переменных в массиве.
Чегото не получается никак - уже который раз пытаюсь. В AVR наких проблем нету, а на PIC редко пишу - направьте где посмотреть как это делается? Надо на СИ.
|
|
|
|
|
 |
Ответов
|
Aug 27 2009, 19:17
|
Участник

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

|
...
Сообщение отредактировал *antzol* - Aug 27 2009, 19:23
|
|
|
|
|
Aug 27 2009, 19:50
|
Местный
  
Группа: Участник
Сообщений: 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; // допустим так... /* и т.д. для остальных каналов АЦП */ Я есесно в пиках и хитеке ни гугу. Это, так сказать, лишь идея....
|
|
|
|
|
Aug 28 2009, 07:35
|
Участник

Группа: Участник
Сообщений: 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 Правил форума.
|
|
|
|
|
Aug 28 2009, 08:13
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 10-02-06
Пользователь №: 14 185

|
Вот на что обратил внимание: Цитата(bugor @ Aug 28 2009, 11:35)  Код while(1) { ei(); asm("nop"); di(); } Зачем в цикле запрещаете прерывания и снова разрешаете (если я правильно угадал смысл ei() и di())? Цитата(bugor @ Aug 28 2009, 11:35)  Код *(pU) = ADRESH; //старший байт в первый элемент массива *(pU++) = ADRESL; //младший байт во второй элемент массива //точно также в 3-4 и в 5-6 элементы по циклу в этом куске младший байт всегда будет перетираться старшим байтом.
|
|
|
|
|
Aug 28 2009, 08:46
|
Участник

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

|
Цитата(Kane @ Aug 28 2009, 12:13)  Вот на что обратил внимание:
Зачем в цикле запрещаете прерывания и снова разрешаете (если я правильно угадал смысл ei() и di())?
в этом куске младший байт всегда будет перетираться старшим байтом. После запрещения прерывания будут вычисления и чтобы в момент вычислений не изменились данные по прерыванию АЦП так сделано. Я уже посмотрел по листингу что происходит затирка, а как сделать чтобы этого небыло не знаю. Но дело еще в том, что код не работает не в смысле неправильного формирования данных а в том смысле что преобразования АЦП не производятся - то есть на выходе индикатора должен быть что то подобие меандра, а ничего не происходит - висит 1 - то есть в прерывание вход есть, а выхода нет  Причем это наблюдается если начинаю использовать указатели - если без них то циклическое преобразование есть - но с данными непонятно что происходит.
Сообщение отредактировал bugor - Aug 28 2009, 08:47
|
|
|
|
Сообщений в этой теме
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   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 bugor Ну вот собственно заработало.
Проиллюстрирую попод... Sep 6 2009, 14:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|