Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
26.05.2011, 15:54
|
|
Частый гость
Регистрация: 15.11.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Подключение принтера к микроконтроллеру 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;
} |
|
|
|
|
27.05.2011, 04:13
|
|
Прописка
Регистрация: 17.10.2010
Сообщений: 113
Сказал спасибо: 2
Сказали Спасибо 20 раз(а) в 12 сообщении(ях)
|
Re: подключение принтера к микроконтроллеру. Centronics
Несмотря на стандартный порт - Centronics - принтер принтеру рознь. Нодо знать, что принтер хочет получить - его систему команд...
С Вашим примером - сильно не разбирался, но на первый взгляд должно работать. Надо искать доки на принтер с описанием чего ему по Centronics отправлять.
ЗЫ
В ранние времена, например, было выражение "Эпсон совместимый принтер" это относилось именно к его системе команд.
|
|
|
|
27.05.2011, 07:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,528
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
|
Re: подключение принтера к микроконтроллеру. Centronics
вся эта лабуда с будет работать только для матричного принтера (насколько я знаю, сейчас только LQ300 продается, из узких). На струйнике и лазернике (кроме самых древних HP) не должно работать - необходим драйвер. Проверьте Ваш принтер - может он печатать напрямую из под DOS (чистого, не эмуляции командной строки windows)? Типа того "echo test ›prn".
Лазерники HP работают с языком PCL. Подробные маны прилагались раньше к принтерам.
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
|
|
|
|
27.05.2011, 08:51
|
|
Частый гость
Регистрация: 15.11.2007
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: подключение принтера к микроконтроллеру. Centronics
у меня матричный принтер. Epson lx-800.
Уряяя! Задышал
Последний раз редактировалось der_student; 27.05.2011 в 10:10.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:51.
|
|