Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 19.12.2013, 16:59   #1
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию АЦП на PIC18F2550

Привет участникам форума!
Возникли затруднения при работе с АЦП. Отлаживаемая плата сопряжена с компьютером по СОМ-порту. СОМ работает, т.к. удаётся послать сообщение в Hyper Terminal (см. вложение). Чтобы убедиться в работоспособности АЦП, хочу оцифровать значение напряжения на терморезисторе и передать на компьютер по СОМ-порту.
В результате получаю какие-то каракули. Подскажите, в каком направлении мне стоит копать.



Код, ответственный за СОМ и АЦП:
Код:
/** CONFIGURATION **************************************************/
 
#pragma config USBDIV = 2 // 
#pragma config CPUDIV = OSC1_PLL2 //
#pragma config PLLDIV = 5 // 
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config FOSC = HS // 
#pragma config VREGEN = OFF //USB Voltage Regulator is off
#pragma config BORV = 3
#pragma config BOR = OFF // 
#pragma config PWRT = OFF // !!! при включении BOD (BOR)
#pragma config WDTPS = 32768
#pragma config WDT = OFF
#pragma config MCLRE = OFF // 
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF // 
#pragma config CCP2MX = ON // 
#pragma config XINST = OFF // Extended Instruction Set
// #pragma config ICPRT = OFF // 
#pragma config LVP = OFF
#pragma config STVREN = OFF // 
// #pragma config CP3 = OFF // ЗАЩИТА БЛОКОВ ПАМЯТИ
// #pragma config CP2 = OFF 
#pragma config CP1 = OFF
#pragma config CP0 = OFF //
//#pragma config CPD = OFF
#pragma config CPB = OFF
// #pragma config WRT3 = OFF
// #pragma config WRT2 = OFF
#pragma config WRT1 = OFF
#pragma config WRT0 = OFF
// #pragma config WRTD = OFF
#pragma config WRTB = OFF // Boot Block Write Protection
#pragma config WRTC = OFF
// #pragma config EBTR3 = OFF
// #pragma config EBTR2 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR0 = OFF
#pragma config EBTRB = OFF
 
/** INCLUDES *******************************************************/
#include <p18cxxx.h>
#include <delays.h>
#include <timers.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <GenericTypeDefs.h> //
#include <usart.h>
//#include <sw_uart.h>
 
#define Ready PORTAbits.RA4 //светодиод ГОТОВ
#define trisReady TRISAbits.TRISA4
#define Avaria PORTAbits.RA5 //светодиод АВАРИЯ
#define trisAvaria TRISAbits.TRISA5
 
volatile unsigned int RTC=0;
unsigned int ADCValue; // 
float fADCValue; // 
 
char ADCConvert[];
char Message[]={"Передача через функцию с параметром"};
void Delay (unsigned int secs);
void low_isr ();
unsigned int ReadADC(void);
void Print_menu(char *menu);
 
void main () // 
{
OSCCON=0b10001100; // внешний генератор
TRISA=0b0001101;
TRISB=0b11100000; // 
TRISC=0b10000001;
TMR0H=0xEC; // прерывание примерно через 1 мс
TMR0L=0x78; // 
 
RCONbits.IPEN=1;
 
T0CON=0b10001111; // 
INTCON=0b11100000; // 
INTCON2bits.TMR0IP=0; // прерывания таймера0 - низкий приоритет
trisReady=0;
Ready=1;
trisAvaria=1;
Avaria=1;
  
 
//_________КОНФИГУРИРОВАНИЕ ПЕРЕДАТЧИКА EUSART______________
SPBRG=129; // скорость 38400 бод
BAUDCON=0b01001010; // 16-разрядный генератор, ожидание приёма
TXSTA=0b00101110; // 8-битный асинхр режим, передача разрешена
RCSTA=0b10010000; // приёмник и последовательный порт включены
PIE1bits.TXIE=0; // нет прерывания при опустошении TXREG
//____________________________________________________________
 
 
 
//_________________КОНФИГУРИРОВАНИЕ АЦП_____________________
ADCON1=0x0B; // опорные напряжения Vss и Vdd; A0-A3 аналоговые
ADCON2=0x8A; // выравнивание вправо, время захвата 2Tad, 
// частота преобразования Fosc/32
ADCON0=0x00; // модуль ОТКЛ (бит 0), измеряем на А0
 
 
while(1)
{
Delay(10000); 
trisReady=~trisReady;
trisAvaria=~trisAvaria;
 
ADCValue=ReadADC();
ADCConvert[0]=ADCValue; // отобразится в двоичной форме
Print_menu(ADCConvert[0]); // w.2054 - Suspicious pointer conversion
}
}
 
 
#pragma interruptlow low_isr //
void low_isr () // 
{
if(INTCONbits.TMR0IF)
{
INTCONbits.TMR0IF=0;
TMR0H=0xEC; // перезагрузка таймера для прерывания через 1 мс
TMR0L=0x78;
RTC++;
}
}
 
#pragma code interrupt_vector_low=0x18 // 
void interrupt_vector_low (void) // 
{
_asm goto low_isr _endasm
}
#pragma code
 
 
void Delay (unsigned int secs)
{
unsigned int DelayEnd=RTC+secs; //
while (DelayEnd!=RTC);
}
 
 
//_____________ ФУНКЦИЯ ПЕРЕДАЧИ ПО COM-ПОРТУ_______________
void Print_menu(char *menu)
{
while (*menu!=0)
{
putcUSART(*menu);
menu++;
Delay10TCYx(250);
}
putcUSART('\r');
}
 
unsigned int ReadADC(void)
{
unsigned int Voltage;
ADCON0bits.ADON=1; // ВКЛ АЦП
ADCON0bits.GO=1;
while(ADCON0bits.GO); // (преобразование завершилось - ^DONE=0)
Voltage=ADRESH;
Voltage=((Voltage<<8)|ADRESL);
return Voltage;
}
Миниатюры
HyperTerminal.GIF  

Последний раз редактировалось IceS; 19.12.2013 в 17:04. Причина: используйте тег CODE http://www.microchip.su/showthread.php?t=149
_Alexandr_ вне форума   Ответить с цитированием
Старый 19.12.2013, 17:08   #2
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 39
Сообщений: 3,251
Вес репутации: 3684/110
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
Привет участникам форума!
Возникли затруднения при работе с АЦП. Отлаживаемая плата сопряжена с компьютером по СОМ-порту. СОМ работает, т.к. удаётся послать сообщение в Hyper Terminal (см. вложение). Чтобы убедиться в работоспособности АЦП, хочу оцифровать значение напряжения на терморезисторе и передать на компьютер по СОМ-порту.
В результате получаю какие-то каракули. Подскажите, в каком направлении мне стоит копать.
Данные полученные от АЦП надо преобразовать в строку. Сделать это можно, к примеру, командой sprintf() - на форуме уже много про неё писали.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 19.12.2013, 17:27   #3
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от IceS Посмотреть сообщение
Сделать это можно, к примеру, командой sprintf()
А ещё какие способы есть? И как команда sprintf() завязана с СОМ-портом?
_Alexandr_ вне форума   Ответить с цитированием
Старый 19.12.2013, 17:46   #4
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 39
Сообщений: 3,251
Вес репутации: 3684/110
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
А ещё какие способы есть? И как команда sprintf() завязана с СОМ-портом?
1. Самостоятельно написать процедуру преобразования числа в текстовую строку. Или пройтись поиском - я давал пример такой процедуры.
2. Нет, не связанна. Открываем википедию и читаем что делает sprintf.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 19.12.2013, 17:49   #5
Sash
Senior Member
 
Регистрация: 14.04.2007
Адрес: Не очень далеко от Питера (Новосибирск)
Возраст: 41
Сообщений: 977
Вес репутации: 1741/68
Sash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant future
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
А ещё какие способы есть? И как команда sprintf() завязана с СОМ-портом?
Способов более чем один, Вам указали на самый простой.
Sprintf() никак не завязана с ком портом. Просто гипер терминал не умеет выводит данные. Он выводит строковые символы в формате ASCII. Где например 0х20 = пробел. А 0х31 символ "1", и т.д. Sprintf() и позволит Вам преобразовать данные в строку.
Sash вне форума   Ответить с цитированием
Старый 19.12.2013, 17:52   #6
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 39
Сообщений: 3,251
Вес репутации: 3684/110
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от Sash Посмотреть сообщение
Способов более чем один, Вам указали на самый простой.
Sprintf() никак не завязана с ком портом. Просто гипер терминал не умеет выводит данные. Он выводит строковые символы в формате ASCII. Где например 0х20 = пробел. А 0х31 символ "1", и т.д. Sprintf() и позволит Вам преобразовать данные в строку.
не Sprintf, а sprintf - Си язык регистрозависимый.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 19.12.2013, 19:40   #7
Sash
Senior Member
 
Регистрация: 14.04.2007
Адрес: Не очень далеко от Питера (Новосибирск)
Возраст: 41
Сообщений: 977
Вес репутации: 1741/68
Sash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant futureSash has a brilliant future
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от IceS Посмотреть сообщение
не Sprintf, а sprintf - Си язык регистрозависимый.
Блин... Ну лень мне было сбрасывать автоматически выставленный shift, с планшета пишу.
Sash вне форума   Ответить с цитированием
Старый 19.12.2013, 21:00   #8
Vovka
Senior Member
 
Аватар для Vovka
 
Регистрация: 27.12.2007
Адрес: недалеко от г.Белгорода
Возраст: 50
Сообщений: 1,877
Вес репутации: 2862/85
Vovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond reputeVovka has a reputation beyond repute
Отправить сообщение для Vovka с помощью ICQ
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
А ещё какие способы есть? И как команда sprintf() завязана с СОМ-портом?
Можно без преобразований - воспользоваться вместо терминала, например, программой rs232. У нее для отладки много вкусненького...
Vovka вне форума   Ответить с цитированием
Старый 20.12.2013, 06:42   #9
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Небольшой оффтоп

А как передать по СОМу двумерный массив с помощью встроенных функций компилятора? Использую MPLAB C18 v.3.44. Есть ли функция для определения числа строк массива? Охота написать функцию и передавать в неё массивы в виде параметров, чтобы реализовать меню.
_Alexandr_ вне форума   Ответить с цитированием
Старый 20.12.2013, 07:52   #10
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: Небольшой оффтоп

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
А как передать по СОМу двумерный массив с помощью встроенных функций компилятора? Использую MPLAB C18 v.3.44. Есть ли функция для определения числа строк массива? Охота написать функцию и передавать в неё массивы в виде параметров, чтобы реализовать меню.
А почитать про массивы в Си, не пробовали? Какие-такие встроенные функции компилятора?
SSH вне форума   Ответить с цитированием
Старый 20.12.2013, 08:37   #11
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию

Про массивы в Си читал. Пробовал даже писать функцию для передачи строки. Для массива ненамного сложнее: задать счётчик символов в строке, с помощью внутреннего цикла for посимвольно передать её, с помощью внешнего цикла for инкрементировать счётчик строк и повторить внутренний цикл.

Просто в MPLAB C18 есть встроенные функции, например для подсчёта числа символов в строке (произвольной) есть функция strlen. Есть функции для смены регистра символов строки, сравнения длин двух строк и т.д. и т.п.
_Alexandr_ вне форума   Ответить с цитированием
Старый 20.12.2013, 09:11   #12
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
Про массивы в Си читал. Пробовал даже писать функцию для передачи строки. Для массива ненамного сложнее: задать счётчик символов в строке, с помощью внутреннего цикла for посимвольно передать её, с помощью внешнего цикла for инкрементировать счётчик строк и повторить внутренний цикл.

Просто в MPLAB C18 есть встроенные функции, например для подсчёта числа символов в строке (произвольной) есть функция strlen. Есть функции для смены регистра символов строки, сравнения длин двух строк и т.д. и т.п.
Невнимательно читали. Нет в Си никаких встроенных функций ( используемых в виде функции ), кроме sizeof и MCC не исключение. А библиотечные функции работы со строками, подразумевают наличие '\0' в конце строки ( strlen, strcpy ). Во всех других случаях ( strncpy ) однозначно указывается размер. Двумерный массив располагается в памяти точно так-же, как одномерный и трёхмерный, размерность - лишь логическое понятие. Так-что в любом случае размерность массива нужно либо передавать, либо как-то по-другому обозначать ( как в строках нулём, например ). И место под этот массив тоже должно быть подготовлено заранее.
SSH вне форума   Ответить с цитированием
Старый 14.01.2014, 13:25   #13
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Число измерений не совпадает с заданным

Для большей достоверности провожу серию из 10 измерений и вычисляю среднее значение. Между измерениями выдерживаю необходимую паузу (не менее 3Тad). Но происходит только 5 измерений (для i=0,2,4,6,8) - проверял в отладчике. Пробовал отключать Таймер2 (отвечает за ШИМ), но ситуация повторялась. Подскажите, в чём может быть дело.
Код:
#pragma config USBDIV = 2 
#pragma config CPUDIV = OSC1_PLL2 
#pragma config PLLDIV = 5 
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config FOSC = HS 
#pragma config VREGEN = OFF 
#pragma config BORV = 3
#pragma config BOR = ON // !!! 
#pragma config PWRT = ON // !!! 
#pragma config WDTPS = 32768
#pragma config WDT = OFF
#pragma config MCLRE = ON 
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF 
#pragma config CCP2MX = ON 
#pragma config XINST = OFF 
// #pragma config ICPRT = OFF 
#pragma config LVP = OFF
#pragma config STVREN = OFF 
// #pragma config CP3 = OFF 
// #pragma config CP2 = OFF 
#pragma config CP1 = OFF
#pragma config CP0 = OFF 
// #pragma config CPD = OFF
#pragma config CPB = OFF
// #pragma config WRT3 = OFF
// #pragma config WRT2 = OFF
#pragma config WRT1 = OFF
#pragma config WRT0 = OFF
// #pragma config WRTD = OFF
#pragma config WRTB = OFF 
#pragma config WRTC = OFF
// #pragma config EBTR3 = OFF
// #pragma config EBTR2 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR0 = OFF
#pragma config EBTRB = OFF


#include <p18cxxx.h>
#include <delays.h>
#include <timers.h>
#include <GenericTypeDefs.h> 


#define Ready PORTAbits.RA4 //светодиод ГОТОВ
#define trisReady TRISAbits.TRISA4
#define Avaria PORTAbits.RA5 //светодиод АВАРИЯ
#define trisAvaria TRISAbits.TRISA5

int i;
volatile unsigned int RTC=0;
void Delay (unsigned int secs);
void low_isr ();
void high_isr(void);
unsigned int Voltage;
unsigned int ReadADC(void);

void main () 
{
OSCCON=0b00001100; // тактируется от внешнего генератора
TRISA=0b0001101;
TRISB=0b11100000; 
TRISC=0b10000001;
TMR0H=0xEC; // прерывание примерно через 1 мс
TMR0L=0x78; // 
RCONbits.IPEN=1;
T0CON=0b10001111; // у таймера0 Кд = 256 (111)
INTCON=0b11100000; // 
INTCON2bits.TMR0IP=0; // прерывания таймера0 - низкий приоритет

Avaria=0;
Ready=1;

PORTBbits.RB0=1;
PORTBbits.RB1=1;
PORTBbits.RB2=1;
PORTBbits.RB3=1;

//***********_КОНФИГУРИРОВАНИЕ ШИМ_************
T2CON=0x07;            // Таймер 2 ВКЛ, предделитель 16
PR2=0xFF;            // частота импульсов 1220 Гц; 0x02 для 100 кГц
CCP2CON=0x3F;        // 0x3F - среднее значение напряжения 8 В,
CCPR2L=0xAA;        // 0xAA, т.е. длительность импульса 2/3 от макс.
CCP1CON=0x0F;
CCPR1L=0x00;

//_______________КОНФИГУРИРОВАНИЕ АЦП
ADCON1=0x0B;
ADCON2=0x8A;

while(1)
{
ADCON0=0x00;
Voltage=0;
i=0;
for(i=0;i<10;i++)
{
Voltage+=ReadADC();
Delay10TCYx(2);
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
i++;
}
i=0;

Voltage/=10;

if((Voltage<100)||(Voltage>500))
{
CCP1CON=0x00;
CCP2CON=0x00;
CCPR1L=0xFF;
CCPR2L=0xFF;
CCP1CON=0x3F;
CCP2CON=0x3F;
Avaria=1;
Ready=0;
}

else
{;}

Delay(60000);
}
_Alexandr_ вне форума   Ответить с цитированием
Старый 14.01.2014, 13:47   #14
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,465
Вес репутации: 2482/74
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: Число измерений не совпадает с заданным

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
Для большей достоверности провожу серию из 10 измерений и вычисляю среднее значение. Между измерениями выдерживаю необходимую паузу (не менее 3Тad). Но происходит только 5 измерений (для i=0,2,4,6,8) - проверял в отладчике. Пробовал отключать Таймер2 (отвечает за ШИМ), но ситуация повторялась. Подскажите, в чём может быть дело.
Код:
#pragma config USBDIV = 2 
#pragma config CPUDIV = OSC1_PLL2 
#pragma config PLLDIV = 5 
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config FOSC = HS 
#pragma config VREGEN = OFF 
#pragma config BORV = 3
#pragma config BOR = ON // !!! 
#pragma config PWRT = ON // !!! 
#pragma config WDTPS = 32768
#pragma config WDT = OFF
#pragma config MCLRE = ON 
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF 
#pragma config CCP2MX = ON 
#pragma config XINST = OFF 
// #pragma config ICPRT = OFF 
#pragma config LVP = OFF
#pragma config STVREN = OFF 
// #pragma config CP3 = OFF 
// #pragma config CP2 = OFF 
#pragma config CP1 = OFF
#pragma config CP0 = OFF 
// #pragma config CPD = OFF
#pragma config CPB = OFF
// #pragma config WRT3 = OFF
// #pragma config WRT2 = OFF
#pragma config WRT1 = OFF
#pragma config WRT0 = OFF
// #pragma config WRTD = OFF
#pragma config WRTB = OFF 
#pragma config WRTC = OFF
// #pragma config EBTR3 = OFF
// #pragma config EBTR2 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR0 = OFF
#pragma config EBTRB = OFF


#include <p18cxxx.h>
#include <delays.h>
#include <timers.h>
#include <GenericTypeDefs.h> 


#define Ready PORTAbits.RA4 //светодиод ГОТОВ
#define trisReady TRISAbits.TRISA4
#define Avaria PORTAbits.RA5 //светодиод АВАРИЯ
#define trisAvaria TRISAbits.TRISA5

int i;
volatile unsigned int RTC=0;
void Delay (unsigned int secs);
void low_isr ();
void high_isr(void);
unsigned int Voltage;
unsigned int ReadADC(void);

void main () 
{
OSCCON=0b00001100; // тактируется от внешнего генератора
TRISA=0b0001101;
TRISB=0b11100000; 
TRISC=0b10000001;
TMR0H=0xEC; // прерывание примерно через 1 мс
TMR0L=0x78; // 
RCONbits.IPEN=1;
T0CON=0b10001111; // у таймера0 Кд = 256 (111)
INTCON=0b11100000; // 
INTCON2bits.TMR0IP=0; // прерывания таймера0 - низкий приоритет

Avaria=0;
Ready=1;

PORTBbits.RB0=1;
PORTBbits.RB1=1;
PORTBbits.RB2=1;
PORTBbits.RB3=1;

//***********_КОНФИГУРИРОВАНИЕ ШИМ_************
T2CON=0x07;            // Таймер 2 ВКЛ, предделитель 16
PR2=0xFF;            // частота импульсов 1220 Гц; 0x02 для 100 кГц
CCP2CON=0x3F;        // 0x3F - среднее значение напряжения 8 В,
CCPR2L=0xAA;        // 0xAA, т.е. длительность импульса 2/3 от макс.
CCP1CON=0x0F;
CCPR1L=0x00;

//_______________КОНФИГУРИРОВАНИЕ АЦП
ADCON1=0x0B;
ADCON2=0x8A;

while(1)
{
ADCON0=0x00;
Voltage=0;
i=0;
for(i=0;i<10;i++)
{
Voltage+=ReadADC();
Delay10TCYx(2);
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
i++;
}
i=0;

Voltage/=10;

if((Voltage<100)||(Voltage>500))
{
CCP1CON=0x00;
CCP2CON=0x00;
CCPR1L=0xFF;
CCPR2L=0xFF;
CCP1CON=0x3F;
CCP2CON=0x3F;
Avaria=1;
Ready=0;
}

else
{;}

Delay(60000);
}
Что написано, то и выполняется, см. красное
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 14.01.2014, 16:29   #15
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Re: Число измерений не совпадает с заданным

Цитата:
Сообщение от pal1222@yandex.ru Посмотреть сообщение
Что написано, то и выполняется, см. красное
Это переход к следующему значению i, иначе преобразование будет происходить бесконечно (т.к. не выполнится условие выхода из цикла, т.е. i всегда будет равно нулю). Или я не прав?
_Alexandr_ вне форума   Ответить с цитированием
Старый 14.01.2014, 16:46   #16
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 38
Сообщений: 858
Вес репутации: 1266/61
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
По умолчанию Re: Число измерений не совпадает с заданным

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
я не прав?
да! простоо уберите эту строчку)))
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 15.01.2014, 08:54   #17
grsfan
Member
 
Регистрация: 14.01.2011
Адрес: Ленинград
Сообщений: 89
Вес репутации: 145/29
grsfan will become famous soon enoughgrsfan will become famous soon enough
По умолчанию Re: АЦП на PIC18F2550

Самый простой способ передачи оцифрованного аналогового сигнала по COM порту тебе описали выше. Сначала делаешь АЦП преобразование и помещаешь результат преобразования в переменную (у тебя вроде это сделано). Далее используешь команду sprintf (). Вот пример её использования
Код:
#include <stdio.h>
void main (void)
{
  int i = 0xA12;
  char buf[20];
  sprintf (buf, "%#010x", i);
  /* buf will contain the string "0x00000a12"
}
Буфер buf будет содержать твое оцифрованное значение. Затем передаешь буфер по UART. Про sprintf() можешь почитать справку в компиляторе папка C:\Program Files\Microchip\MPLABC18\v3.41\doc файл называется hlpC18Lib. Если в чем ошибся знатоки меня поправят
grsfan вне форума   Ответить с цитированием
Старый 15.01.2014, 12:12   #18
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Re: Число измерений не совпадает с заданным

Цитата:
Сообщение от siargy Посмотреть сообщение
да! простоо уберите эту строчку)))
Спасибо за помощь. Давно не писал.
_Alexandr_ вне форума   Ответить с цитированием
Старый 15.01.2014, 12:15   #19
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Re: АЦП на PIC18F2550

Цитата:
Сообщение от grsfan Посмотреть сообщение
Вот пример её использования
А есть пример для вывода массива в СОМ? Хочу сделать что-то типа шаблона (текстовое меню), в который буду вставлять результаты измерений (они, понятно, будут меняться).
_Alexandr_ вне форума   Ответить с цитированием
Старый 15.01.2014, 15:53   #20
grsfan
Member
 
Регистрация: 14.01.2011
Адрес: Ленинград
Сообщений: 89
Вес репутации: 145/29
grsfan will become famous soon enoughgrsfan will become famous soon enough
По умолчанию Re: АЦП на PIC18F2550

Ну массив можно передать как-то так.
Код:
char bytes [4]; /* Создали массив*/
int count;        /* Переменная счетчик элементов массива */
for (count = 0; count < 4; count ++) { /* Transmit bytes array */
    TXREG = bytes [count];
    while(!TXSTAbits.TRMT){}; /* Wait while transmit buffer is full */
}
grsfan вне форума   Ответить с цитированием
Старый 11.02.2014, 13:39   #21
_Alexandr_
Member
 
Регистрация: 28.11.2013
Сообщений: 43
Вес репутации: 100/18
_Alexandr_ will become famous soon enough_Alexandr_ will become famous soon enough
По умолчанию Не могу выдать по СОМу код АЦП

Хочу выдать результат измерения (код АЦП) в СОМ-порт. Результат измерения 10-разрядный (переменная типа unsigned int). Чтобы не возникло проблем, делю её на 4 и присваиваю новой переменной, которую записываю в СОМ, тип char.
При компиляции программа выдаёт мне warning 2054: suspicious pointer conversion (в строке, в которой записываю в СОМ переменную типа char) и ни одной ошибки. В Hyper Terminal вместо цифр вижу закорючки. Настройки порта в прошивке и Hyper Terminal совпадают. Подскажите, в чём может быть причина.
_Alexandr_ вне форума   Ответить с цитированием
Старый 11.02.2014, 13:51   #22
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 42
Сообщений: 2,610
Вес репутации: 2570/93
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: Не могу выдать по СОМу код АЦП

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
Хочу выдать результат измерения (код АЦП) в СОМ-порт. Результат измерения 10-разрядный (переменная типа unsigned int). Чтобы не возникло проблем, делю её на 4 и присваиваю новой переменной, которую записываю в СОМ, тип char.
При компиляции программа выдаёт мне warning 2054: suspicious pointer conversion (в строке, в которой записываю в СОМ переменную типа char) и ни одной ошибки. В Hyper Terminal вместо цифр вижу закорючки. Настройки порта в прошивке и Hyper Terminal совпадают. Подскажите, в чём может быть причина.
Искать причину по слову BCD.
fantom вне форума   Ответить с цитированием
Старый 11.02.2014, 15:06   #23
grsfan
Member
 
Регистрация: 14.01.2011
Адрес: Ленинград
Сообщений: 89
Вес репутации: 145/29
grsfan will become famous soon enoughgrsfan will become famous soon enough
По умолчанию Re: Не могу выдать по СОМу код АЦП

Цитата:
Сообщение от _Alexandr_ Посмотреть сообщение
Хочу выдать результат измерения (код АЦП) в СОМ-порт. Результат измерения 10-разрядный (переменная типа unsigned int). Чтобы не возникло проблем, делю её на 4 и присваиваю новой переменной, которую записываю в СОМ, тип char.
При компиляции программа выдаёт мне warning 2054: suspicious pointer conversion (в строке, в которой записываю в СОМ переменную типа char) и ни одной ошибки. В Hyper Terminal вместо цифр вижу закорючки. Настройки порта в прошивке и Hyper Terminal совпадают. Подскажите, в чём может быть причина.
Ты в гипертерминале в каком виде хочешь получить АЦП результат? Если то, что замерил без всяких преобразований, то можно так.
Код:
unsigned int buf [2];
...	
while (1)
{
	while(ADCON0bits.DONE){};
	buf [0] = ADRESH;
	buf [1] = ADRESL;
	for (count = 0; count < 2; count ++) {  /* Transmit bytes array */
		TXREG = buf [count];
		while(!TXSTAbits.TRMT){}; /* Wait while transmit buffer is full */
	}
}
grsfan вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
АЦП в pic16f877 + LCD rezor Вопросы начинающих 30 11.03.2014 06:48
Помогите написать программу BreAkeR Вопросы начинающих 59 20.12.2009 13:34
AtMega АЦП. Что будет если не подключать LC фильтр на питание АЦП? На сколько упадет точность? Sergik_1900 Микроконтроллеры других производителей 1 05.04.2009 19:06
AN1101-Sensor CERGEI1982 Продукция MICROCHIP 12 04.03.2009 18:15
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


Часовой пояс GMT +3, время: 06:56.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot