Четверг, 28.03.2024, 17:56
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по МК » Обработка сигнала и передача его на ЖКИ и ПК (помогите с программой пожалуйста.)
Обработка сигнала и передача его на ЖКИ и ПК
ЛайтДата: Пятница, 09.04.2010, 08:22 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Добрый день, вообщем суть такая: имееться АЦП ADS7816 на него потупает сигнал который нужно обработать,после обработки сигнал поступает в МК (мега16) с которого передаеться на ЖКИ (16х1) и ПК (rs-232) через UART. Опыта програмирования небыло столкнулся с этим впервые, попытки были сделать на примерах из книги М.Б. Лебедев "CodeVisionAVR" но из этого мало что получаеться ,максимум чегоя добился это вывода информации на ЖКИ с этим проблем вроде небыло, сейчас более мение смог вывести на uart но в терминале какие то кракозябры,пытаюсь разобраться. Помогите кто может, с написанием, или с примерами работы другими.Спасибо.
ps.не понял как тут картинку вставить, хотел выложить схему из протеуса.

Добавлено (09.04.2010, 06:48)
---------------------------------------------
/*
Chip: ATmega16
Memory Model: SMALL
Data Stack Size: 128 bytes
Clock frequency: 3.6864 MHz

[AD7816] [PORTB header]
1 Vin
2 Vref=5V 10 VTG
3 AGND - GND
4 DCLOCK - SCK
5 Dout - MISO
6 DGND - GND
7 CS/SHDH - SS

Use an 1x16 alphanumeric LCD connected
to PORTC as follows:

[LCD] [PORTC header]
1 GND- 9 GND
2 +5V- 10 VTG
3 VLC- LCD contrast control voltage 0..1V
4 RS - 1 PA0
5 RD - 2 PA1
6 EN - 3 PA2
11 D4 - 5 PA4
12 D5 - 6 PA5
13 D6 - 7 PA6
14 D7 - 8 PA7

*/

#asm
.equ __lcd_port=0x1B
#endasm

#include <lcd.h> // LCD driver routines
#include <spi.h> // SPI driver routine
#include <mega16.h>
#include <stdio.h>
#include <delay.h>

// AD7816 reference voltage [mV]
#define VREF 5000L

// AD7816 control signals PORTB bit allocation
#define DCLOCK PINB.8
#define CS/SHDH PORTB.4

// LCD display buffer
char lcd_buffer[33];

unsigned read_adc(void)
{
unsigned result;
// start conversion in mode 1
// (high sampling performance)
CS/SHDH=0;
CS/SHDH=1;
// wait for the conversion to complete
while (CS/SHDH);
// read the MSB using SPI
result=(unsigned) spi(0)<<8;
// read the LSB using SPI and combine with MSB
result|=spi(0);
// calculate the voltage in [mV]
result=(unsigned) (((unsigned long) result*VREF)/4096L);
// return the measured voltage
return result;
}

void main(void)
{
DDRB=0x92;
// initialize the SPI in master mode
// no interrupts, MSB first, clock phase negative
// SCK low when idle, clock phase=0
// SCK=fxtal/4
SPCR=0x54;
SPSR=0x00;
// the AD7816 will work in mode 1
// (high sampling performance)
// /CS/SHDH=1, SCLK=0
PORTB=2;
// initialize the LCD
lcd_init(16);

//initialize the UART
UCR=0x08;
UBRR=23;
SPCR=0x50;

// read and display the ADC input voltage
while (1)
{
sprintf(lcd_buffer,"Uadc=%4umV",read_adc());
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(100);
};
}

вот привел пример того что я набрал исходя из примеров , можно ли это привести в рабочее состояние ?

Добавлено (09.04.2010, 08:22)
---------------------------------------------
Вот код с примера скаченого в инете, прощу прощения за плагиат у автора, но имя его не помню =(. Эта версия программы работает отлично одно но,тут используеться внетрунний ацп меги, мне же нужно использовать внешний, помогите пожалуйста его довести до ума,т.е. отключить внутренний ацп и подключить ADS7816.

#include <mega16.h>
#include <delay.h>
#include <stdio.h>

#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

#define button_ddr DDRD
#define button_port PORTD
#define button_pin PIND
//кнопки
#define but_start 2
#define but_stop 3
#define odin_raz 4
#define ch_plus 5
#define ch_minus 6

#define ADC_VREF_TYPE 0x00;

char lcd_buffer[31];
unsigned int result;
unsigned char num_ch=1;
unsigned char buf;
unsigned char vikl=1;

interrupt [ADC_INT] void adc_isr(void){

result=ADCW*5-ADCW/10; //умножаем чтобы получить мВ и немного учитываем погрешности
printf("result=%dmv ",result); // печатаем в УАРТ значение
printf("number of channel=%d",num_ch); // теперь канал
putchar(0x0D); // на новую строку УАРТА
sprintf(lcd_buffer,"ADC=%4umV num_ch=%1u",result,num_ch);// записываем в буфер вторые 2 параметра
lcd_clear(); // очищаем жки
lcd_puts(lcd_buffer); // теперь выводим в него
delay_ms(1);
if (vikl==0) ADCSRA=0b11011111;

}

interrupt [EXT_INT0] void ext_int0_isr(void)
{
//старт кнопка
vikl=0;
ADCSRA=0b11011111;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
//стоп кнопка
ADCSRA=0;
vikl=1;
}

void init(void){

ADCSRA=0b10011111;
ADMUX=0;
button_ddr=0x00;
button_port=0xFC;
PORTB=0x00;
MCUCR = 0x0A;
GICR = 0xC0;
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

#asm ("sei");
lcd_init(16); // инициализация экрана
}

void main(void)
{
init(); // инициализация всего

lcd_gotoxy(0,0); // идем в нулевую точку
lcd_putsf("-=ADC&UART&LCD=-"); // печатаем
lcd_gotoxy(3,1); // идем в точку
lcd_putsf("-=Aliens=-"); // печатаем

printf("Nagmi 0 dlya spravki"); //
putchar(0x0D);

while(1){

if (!(button_pin.odin_raz)){
ADCSRA=0b11011111;
//button_port=0xFC;
}
if (button_pin.ch_plus) num_ch++;

if (button_pin.ch_minus) num_ch--;

buf=getchar();

if (buf==0x39){
ADCSRA=0;
vikl=1;
}
if (buf==0x38)
ADCSRA=0b11011111;
if (buf==0x37){
vikl=0;
ADCSRA=0b11011111;
}

if (buf==0x30){
printf("Opisanie klavish:");
putchar(0x0D);
printf("1-6 - vibor kanala");
putchar(0x0D);
printf("9 - vikluchit");
putchar(0x0D);
printf("8 - odno preobrazovanie");
putchar(0x0D);
}

if (buf==0x31){
ADMUX=0;
num_ch=1;
}
if (buf==0x32){
ADMUX=1;
num_ch=2;
}
if (buf==0x33){
ADMUX=2;
num_ch=3;
}
if (buf==0x34){
ADMUX=3;
num_ch=4;
}
if (buf==0x35){
ADMUX=4;
num_ch=5;
}
if (buf==0x36){
ADMUX=5;
num_ch=6;
}

}
}

 
HiSERДата: Пятница, 09.04.2010, 18:50 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
А не так?
Code

unsigned int read_adc() {
unsigned int result;
CS/SHDH=0;
result=(unsigned int)(spi(0)&0x1f)<<7;
result|=spi(0)>>1;
CS/SHDH=1;
return (unsigned int)(((unsigned long)result*VREF)/4096L);
}  
 
ЛайтДата: Суббота, 10.04.2010, 02:53 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
попробуйю скажу, сейчас читаю описание команд а то не все ясно.
 
Форум » Микроконтроллеры » Вопросы по МК » Обработка сигнала и передача его на ЖКИ и ПК (помогите с программой пожалуйста.)
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz