Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбор микроконтроллера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
vvs157
Цитата(Kannikkiy @ Jan 13 2009, 23:07) *
Если можете, раз вы пробовали это делать, скажите, пожалуйста, как же все-таки коммутировать этот цифровой интерфейс?
Что-то вроде этого. За 100% не ручаюсь, так как надергано из старого файла и уверенности, что он был окончательный нет
PaulB
а прошивки для МК нет?
vvs157
Цитата(PaulB @ Jan 16 2009, 18:51) *
а прошивки для МК нет?
Неотлаженная и непроверянная на железе
Добавлено: Нашел опечатки
Kannikkiy
Доброго времени суток!

Всем кто еще не потерял интерес к этому вопросу! smile.gif

Итак, прошло уже больше года. Мы за это время изучили микроконтроллеры, попутно собрав много полезных устройств smile.gif. И вот только вчера мы смогли одолеть наконец этот Щ300. наличие некоторых неточностей в схеме, предложенной vvs157 вызвали некоторые затруднения, которые мы, наконец преодолели. Была написана прошивка на си, разработана печатная плата и уже прошли первые успешные испытания. Сейчас мы проведем некоторые последние штрихи, после чего выложим все материалы в эту тему. Так что это реальность 5 знаков за 200 р smile.gif
Kannikkiy
Доброго времени суток!

Как и было обещано выкладываю поправленную схему, прошивку и фотографии готовой платы.

Но сначала немного о том, как это работает. Щ300 работает, как многие другие советские приборы на интерфейсе 1-2-4-8. Среди данных, которые он передает 5 значащих цифр (причем первая из них может быть только 0 или 1), знак, положение запятой (таких положений всего 3) и тип измеряемой величины (для Щ300 опытным путем определено наличие трех типов - А, Ом и мВ, В). Цифры считываются из числовых регистров: 1-ая из 11С, 21С, 41С и 81С; 2-ая из регистров 21С, 22С, 42С и 82С и т.д. Пределы, знак и тип измерения передаются по соответствующим регистрам П (см. схему). Для поочередного считывания этих данных используются селекторы-мультиплексоры КР1533КП15 или 74НС595N. Очередность обеспечивается изменением входных регистров селекторов (А0-А2). Для синхронизации прибор выдает сигнал на пин ТоП. По руководству по эксплуатации прибор может выполнять до 12.5 изм/с. Поэтому скорости передачи в порт достаточно 9600 (хотя мы используем большую).

Первый эксперимент на аттини2313 был неудачным. Второй вариант был собран на атмеге 16 (фотография этой платы прилагается), с которой прибор наконец заработал. Но вследствие ошибки при разводке платы (перепутана последовательность опроса регистров селекторов мультиплексоров).

Нажмите для просмотра прикрепленного файла

CODE


// ***********************************************************
// Project: Щ300
// Author: Крючков А.С. Дунаев А.М.
// Module description:
// ***********************************************************

#include <avr\io.h> // Most basic include files
// Add the necessary ones
#include <avr\signal.h>
#include <avr\pgmspace.h>
#include <stdio.h>
#include <avr\iotn2313.h>
#include <avr\interrupt.h>

// Function prototypes
//
int UART_putchar(char c);
int UART_getchar(void);
void UART_first_init(void);
void send_data(int dts);
void get_data(void);
// Define here the global static variables
// Buffer sizes must be 2^n
//
#define TBUFSIZE 32
#define RBUFSIZE 32

#define TMASK (TBUFSIZE-1)
#define RMASK (RBUFSIZE-1)

// Static variables
//
volatile unsigned char tbuf[TBUFSIZE]; // TX buffer
volatile unsigned char rbuf[RBUFSIZE]; // RX buffer

volatile unsigned char t_in; // TX buffer in index
volatile unsigned char t_out; // TX buffer out index

volatile unsigned char r_in; // RX buffer in index
volatile unsigned char r_out; // RX buffer out index
int i,j;

SIGNAL(SIG_INTERRUPT1) { /* signal handler for external interrupt int0 */
get_data();
}

void UART_first_init(void) {
//***********************
// The function fdevopen(..) must contain as parameters the
// corresponding ..putchar() and ..getchar() functions, defined before.
//
UBRRL = 12; // 115200 BPS
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); // 8 Databits, receive and transmit enabled, receive and transmit complete interrupt enabled
}

void get_data(void) {
//чтение данных идет слева направо для удобства представления в посылке
PORTB = 32; //знаки и 5-я цифра
j = PINB;
i = j&4;
if (i==4) send_data(45);// = '-'; //45 -
else send_data(43); //UDR = '+'; //43 +
i = j&1;
send_data(i+'0');//UDR = i;

PORTB = 64; //4 цифра
j = PINB;
j = j & 0xf;
j = j + '0';
send_data(j);

PORTB = 96; //3 цифра
j = PINB;
j = j & 0xf;
j = j + '0';
send_data(j);

PORTB = 128; //2 цифра
j = PINB;
j = j & 0xf;
j = j + '0';
send_data(j);

PORTB = 160; //1 цифра
j = PINB;
j = j & 0xf;
j = j + '0';
send_data(j);

PORTB = 192;
j = PINB;
j = j & 0xf;
j = j + '0';
send_data(j);//UDR = j;//измеряемая вел-на В, Ом, А*/

PORTB = 224;
j = PINB;
j = j & 0x3;
j = j + '0';
send_data(j);//UDR = j;//положение запятой*/

send_data(13);//UDR = 13;
}
//
void send_data(int dts) {
UDR = dts;
while ( !( UCSRA & (1<<UDRE)) );
}

void io_init(void) {
//io ports init
DDRB = 240; // три последних пина - на выход, остальные - на вход
asm ("nop");
PORTB = 0;
GIMSK = (1<<INT0)|(1<<INT1); /* enable external int0, int1 */
MCUCR = (1<<ISC01)|(1<<ISC10)|(1<<ISC11);/* falling egde: int0, rising edge: int 1 */
sei(); /* enable interrupts */
}

// ***********************************************************
// Main program
//
int main(void) {
UART_first_init();
io_init();
while(1)
{
asm ("nop");
// в коментариях принудительный опрос прибора, если не использовать прерывания
//for (i=0;i<20000;i++){}
//get_data();
}
}



На фото неприпаянный провод - это прерывание идущее на вывод ТоП (устанавливается опционально)

Благодарим всех участвующих в дискуссии, особенно vvs157. Спасибо всем! Тема закрыта! smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.