Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 26.05.2011, 15:54  
der_student
Частый гость
 
Регистрация: 15.11.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
der_student на пути к лучшему
По умолчанию Подключение принтера к микроконтроллеру Centronics

Доброго времени суток! Никак не вкурю этот centronics. Может у кого есть примерчик? Пробовал вот это - нольэмоций. Принтер уходит в ступор. Буду признателен за любые идеи
Код:
#include ‹avr/io.h› 
#include ‹string.h›
#include ‹stdio.h›
#include ‹util/delay.h›
#include ‹stdlib.h›
#include ‹avr/interrupt.h›

#define USE_INTERRUPTS	

#define DATA_PORT 	PORTC // DO..D7 принтера
#define DATA_DDR  	DDRC

#define STATE_PORT	PORTD // линии управления принтера
#define STATE_PIN	PIND
#define STATE_DDR	DDRD

#define BUSY_PIN		2 //INT0
#define ACK_PIN		3 //INT1

#define PAPER_OUT_PIN	4
#define ERROR_PIN		5
#define INIT_PIN		6
#define STROBE_PIN		7

#ifndef BUFFER_SIZE
#define BUFFER_SIZE 32
#endif

#define BUFFER_MASK ( BUFFER_SIZE - 1)

#if ( BUFFER_SIZE & BUFFER_MASK )
#error Buffer size is not a power of 2
#endif

volatile uint8_t Buf[BUFFER_SIZE];
volatile uint8_t Head;
volatile uint8_t Tail;
volatile uint8_t printer_state = 0;  

void LPT_init(void)
{
        DATA_DDR = 0xFF; 
	STATE_PORT |= (1‹‹INIT_PIN) | (1‹‹STROBE_PIN);  
	STATE_DDR |= (1‹‹INIT_PIN) | (1‹‹STROBE_PIN); //Output pins
	STATE_DDR &= ~((1‹‹BUSY_PIN) | (1‹‹ACK_PIN) | (1‹‹PAPER_OUT_PIN) | (1‹‹ERROR_PIN)); //Input pins
	Head = 0;
	Tail = 0;
#ifdef USE_INTERRUPTS
    MCUCR = (1‹‹ISC01) | (1‹ISC11); //interrupts on falling edge
	GICR |= (1‹‹INT0) | (1‹‹INT1); 
	sei();
#endif
}

void init_printer(void)
{
	STATE_PORT &= ~(1‹‹INIT_PIN); 
	_delay_us(5);
	STATE_PORT &= ~(1‹‹INIT_PIN); 
	_delay_us(100);
}

uint8_t LPT_state(void)
{
	uint8_t state = 0;
	if(STATE_PIN & (1‹‹BUSY_PIN)) state |= 1; //Printer busy
	if(STATE_PIN & (1‹‹PAPER_OUT_PIN)) state |= 2; //Paper out
	if(!(STATE_PIN & (1‹‹ERROR_PIN))) state |= 4; //Internal printer error
	return state;
}

uint8_t LPT_transmit(void)
{
	uint8_t tmp;
    
    if(Head == Tail) return 0; //Buffer empty, nothing to send
    printer_state = LPT_state();	if(printer_state) return printer_state; // printer not redy 
	tmp = (Tail + 1) & BUFFER_MASK; // calculate and store new buffer index
	Tail = tmp;
	DATA_PORT = Buf[tmp];  // get one byte from buffer and write it to out port
	// do STROBE pulse
    _delay_us(1);
	STATE_PORT &= ~(1‹‹STROBE_PIN);  
    _delay_us(1);
	STATE_PORT |= (1‹‹STROBE_PIN);  
	_delay_us(1);
	return 0; //succes
}

void LPT_BSR(void)
{
	do
	{
		printer_state = LPT_transmit();
	} while((printer_state==0)&&(Head!=Tail)); //try transmission 
}


#ifdef USE_INTERRUPTS

ISR(INT0_vect)
{
	//Busy signal go down, wakeup
	LPT_BSR();
}

ISR(INT1_vect)
{
	//ACK signal arrived
	LPT_BSR();
}

#endif

void LPT_putc(unsigned char data)
{
    uint8_t tmp;
    
    tmp = (Head + 1) & BUFFER_MASK;
    
    while ( tmp == Tail ){
        ;// wait for free space in buffer
    }
    
    Buf[tmp] = data;
    Head = tmp;
	LPT_BSR();
}



static int lpt_putchar(char c, FILE *stream)
{
	if (c == '\n') LPT_putc('\r'); // insert CR before LF 
	LPT_putc(с);
	return 0;
}

FILE lptf = FDEV_SETUP_STREAM(lpt_putchar, NULL, _FDEV_SETUP_WRITE);



int main( void )
{
	int test_value = 315;

	LPT_init(); // driver init
	init_printer(); // необязательно
        _delay_ms(1000); // для некоторых старых принтеров может потребоваться задержка после сброса и больше (2-3 секунды), если что, подправьте

	stdout = &lptf; // назначаем STDOUT на принтер

	printf("Hello printer!\n");
	printf("Value = %d\n", test_value);

	return 0;
}
Реклама:
der_student вне форума  
Непрочитано 27.05.2011, 04:13  
avtoneru
Прописка
 
Регистрация: 17.10.2010
Сообщений: 113
Сказал спасибо: 2
Сказали Спасибо 20 раз(а) в 12 сообщении(ях)
avtoneru на пути к лучшему
По умолчанию Re: подключение принтера к микроконтроллеру. Centronics

Несмотря на стандартный порт - Centronics - принтер принтеру рознь. Нодо знать, что принтер хочет получить - его систему команд...
С Вашим примером - сильно не разбирался, но на первый взгляд должно работать. Надо искать доки на принтер с описанием чего ему по Centronics отправлять.

ЗЫ
В ранние времена, например, было выражение "Эпсон совместимый принтер" это относилось именно к его системе команд.
avtoneru вне форума  
Непрочитано 27.05.2011, 07:37  
DK
Почётный гражданин KAZUS.RU
 
Аватар для DK
 
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,528
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
DK на пути к лучшему
По умолчанию Re: подключение принтера к микроконтроллеру. Centronics

вся эта лабуда с будет работать только для матричного принтера (насколько я знаю, сейчас только LQ300 продается, из узких). На струйнике и лазернике (кроме самых древних HP) не должно работать - необходим драйвер. Проверьте Ваш принтер - может он печатать напрямую из под DOS (чистого, не эмуляции командной строки windows)? Типа того "echo test ›prn".

Лазерники HP работают с языком PCL. Подробные маны прилагались раньше к принтерам.
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
DK вне форума  
Непрочитано 27.05.2011, 08:51  
der_student
Частый гость
 
Регистрация: 15.11.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
der_student на пути к лучшему
По умолчанию Re: подключение принтера к микроконтроллеру. Centronics

у меня матричный принтер. Epson lx-800.
Уряяя! Задышал

Последний раз редактировалось der_student; 27.05.2011 в 10:10.
der_student вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите опознать дисплей от принтера CANON demanik Информация по радиокомпонентам 5 20.04.2011 10:56
Подключение клавиатуры к микроконтроллеру rocky7 Микроконтроллеры, АЦП, память и т.д 10 09.06.2010 01:04
Подключение двигателя к микроконтроллеру toxxinus Микроконтроллеры, АЦП, память и т.д 27 11.12.2009 21:51
Подключение PS/2 клавиатуры к микроконтроллеру hostel6psu Коллекция глюков 1 21.05.2009 05:24
подключение IDE устройств к микроконтроллеру int4880053 Микроконтроллеры, АЦП, память и т.д 3 13.12.2008 03:07


Часовой пояс GMT +4, время: 03:51.


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