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

 
 
> 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
сообщение Aug 28 2009, 15:45
Сообщение #2


Участник
*

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



Ну вот что получилось - ацп работает но результата по прежнему толком нет.
В ацп есть какоето число но какое так и не смог выяснить.
Уже голову сломал не могу найти ошибку.
CODE
//;---------------------------------------
//; Процессор PIC12C672 или PIC12F675
//; Fosc = 4MHz Генератор RC-внутренний
//;---------------------------------------

#include <pic.h>

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

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

unsigned char Temp, Count, Channel;
unsigned int U[3]; //массив данных с 3х каналов

union{
unsigned int Vin;
struct{
unsigned char UL:8;
unsigned char UH:8;
} byte;
}volt;

#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 преобразования (ADCON1 после сброса уже установлен)
//================================
void InitAD() {
ADIE = 1; //Разрешить прерывания от АЦП
ADCON0 = Channel; //Генегатор внутр RC + номер канала
ADIF = 0; //очистить флаг прерывания от АЦП
PEIE = 1; //Разрешить переферийные прерывания
}
//==========================================================================
// MAIN
//==========================================================================
void main(void) {

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

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 =0b00010111; // F/8 и три канала аналоговый вход
warm_out = 1; // вкл выход

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

while(1) { //бесконечный цикл

#asm
nop
nop
nop
nop
nop
nop
#endasm

if(U[0] < 2900 ) { //вот тут не работает при напряжении на ацп 3,8 вольт
sound_out = 1; //результат должен быть в районе 3114 а его нет
}else {
sound_out = 0;
}
}
}

//================================
//Обработка прерываний
//================================
void interrupt ADC() {

// sound_out = 1;

volt.byte.UL=ADRESL;
volt.byte.UH=ADRESH;
U[Count]=volt.Vin;

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

// sound_out=0;

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


Раньше писал для этого же процессора на асме и все работало - правда были мучения с вычислениями, а сейдас даже результата преобразования получить не могу - а ведь хотелось как быстрее и красивее smile.gif

Модератор. В очередной раз фиксирую нарушение Вами п.3.4 Правил форума. Либо упаковывайте цитаты исходников в тэги [ codebox ] самостоятельно, либо прилагайте их к сообщению в виде архива так, как это рекомендуют Правила форума.
С уважением, rezident.
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
Student Pupkin
сообщение Aug 28 2009, 18:45
Сообщение #3


Местный
***

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



Цитата(bugor @ Aug 28 2009, 19:45) *
Ну вот что получилось - ацп работает но результата по прежнему толком нет.

1) Есть предложение попробовать "unsigned unt U[3]" переобозвать в "volatile unsigned int U[3]".
2) (это так... мелочь.... smile.gif ) В функции ADDelay() к переменной-счетчику "static unsigned char i" тоже наверное желательно "volatile" присовокупить. А еще - зачем вы ее static сделали?
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
- - 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 Текстовая версия Сейчас: 19th July 2025 - 22:43
Рейтинг@Mail.ru


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