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

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

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

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

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

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

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

 
Опции темы

Подключение принтера к микроконтроллеру Centronics

Непрочитано 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.RUN
 
Аватар для DK
 
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,480
Сказал спасибо: 734
Сказали Спасибо 1,899 раз(а) в 777 сообщении(ях)
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:43.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.