针式打印机设计的 firmware简要说明

in #steempress5 years ago

市面上有很多便携式热敏打印机,我之前也设计过。热敏打印机最大的优点是除了打印纸,没有别的耗材;缺点是热敏打印纸上记录的内容,没有办法长期保存,大约几个月后,热敏材料就会失效。

鉴于消费者有长期保存记录数据的需求,因此,需要设计一款针式打印机,它使用的就是普通的打印纸,利用微型的针撞击纸张表面的色带,将颜色印在纸上,这样的记录可以长期保存,只是定期要更换色带。

针式打印机外观如图:
image.png

内部是这样的:
image.png

image.png

这个就是打印机的耗材,色带:
image.png

该项目的软件主要包括这几个模块:打印,红外接收,串口接收,按键扫描。其中打印的执行,数据接收和按键扫描均在中断中完成,因此主程序主要是打印缓存的计算,以及按键的处理等。

主程序流程如下:

image.png
图1: 主程序流程

一.打印缓存的计算:

因为该产品使用epson的针式打印头M-190,它的8个打印通道(A~H)排列与热敏打印头不同,为横向排列,每一个打印通道的打印区域也不同,其排列如下:
image.png
图2

它的每一个dotline可打印144个dot,若打印5×7点阵,则可打印24个字符/行:
image.png
图3

若每接收到一个字符信息就立即计算其打印点阵,则程序处理将变得非常复杂:如在一行当中文字、图形交错,出现展宽或下划线等。

因此现在定在计算完一行应打印的内容后再开始该行的打印。这样做所有的情况都无需再进行单独处理,程序大大简化。

所以打印缓存需要144个内存单元。这144字节每一个字节相同的位(bit)都对应着打印点阵的一个dotline,共8个dotline,8×144点。在程序中,144个字节的bit0位对应打印点阵的第8个dotline(和发射的图形格式相吻合),bit7位对应打印点阵第1个dotline。

打印缓存的计算包括行缓存的计算和TG打印内容的计算。

1)行缓存的计算:

每次打印前先计算完毕该行(144×8dotline)的打印内容再开马达(该计算由IrBuf2printbuff(void)完成)。
IrBuf2printbuff(void)主要有三个分支处理:
1》控制字符的处理:
image.png

2》行结束及进纸处理:
10,4:根据具体情况决定是换行还是进纸,详见程序。在执行IrBuf2printbuff(void)时,当Irbuf中的4或10连续时,每次只转换一个,若前面有打印内容,则为换行,反之为进纸。

3》字符打印点阵的计算:
根据字体标志查相应的字体表格。然后根据其他的标志进行相应的处理。

2)TG打印内容的计算:

主程序在每一个TG信号来之前就计算好该TG应打印的内容。
根据TG信号的个数确定dotline,查print_buff[144]。

行缓存计算的流程图如图4所示:
image.png
图4 行缓存计算流程图


二.打印的执行:

计算完毕print_buff[144]后,置相应标志,开打印头马达。在打印一个字行(8个dotline)时,只在第一个dotline处开HS中断,中间屏蔽HS中断,以免HS中断时影响TG信号的时序。Dotline用TG的个数来计算。

1)MCU工作主频的确定:

在主程序中有一个预TG信号,比TG信号大一。因此是在上一个TG信号计算这一个TG应打印的内容。因此计算时间不能超过一个TG的时间。

一般TG信号的宽度为0。48ms,而计算TG打印内容所需的时间约800个机器周期。对MSP430而言,即800个指令周期。当DCO=4M时,计算时间约为160us,基本可满足以上要求,因此主频定在4M左右。打印的所有动作均在HS和TG中断中完成。

2)打印头的保护:

用TIME_B实现打印头出现异常情况时的保护。

据datasheet,TG在开马达100ms以后若有大于2。5ms的情况时为异常,因此需加超时保护。每一个TG来时清保护定时器,若定时器溢出保护时,关马达,关打印通道,CPU进入休眠状态。

3)连续图形的打印:

1》连续打印时的停马达:
在按照datasheet的时序关马达后,打印头还会滑行40个TG左右的距离。

而在每打印一行之前必须停下马达进行行缓存的计算(红外接收时接收一行的速度要比打印一行的速度慢)这样在打印时两个字行(wordline)会有一个dotline的空行,在图形打印时很不美观。

因此,在连续打印时,必须让打印头停在第8个dotline的回程,才能使两个wordline连续。这里在第8个dotline开始时关MOTO_ON,在第8个dotline回程开始时开MOTO_BREAK,可使打印头停在回程中。

而当电压不同时,打印头滑行的距离是不一样的,因此在关MOTO_ON的时间应该和电压有关,才能使打印头既不会停在第8个dotline的正程,也不会超出第9个dotline的HS。

2》一次打印完成后马达的归位:
但这样停马达刚好使手动进纸机构不能正常工作,因此在打印完成后还必须使打印头正常归位,使用户能手动进纸。当接收缓存为0且在两秒钟内没有接收,则认为此次打印结束,开马达,使之归位(在HS刚为低电平时停马达)。

3》注意事项:
要想获得连续的图象打印,信号发射端每一行之间的发射间隔不能大于2S,否则两个wordline中间会有一个dotline的空行。

4)打印起始的判定:

因为M-190正程为54个TG信号,既HS来后的第一个TG中断就应该进行打印。而打印头基本停在HS之后的正程,因此要有判断,第一TG来时HS一定为高电平,否则为上次停马达后的进纸,不进行打印。

5)打印通道的顺序:

8个打印通道的驱动顺序应该为(A,D,G)---(B,E,H)---(C,F)。
打印中断程序流程图为图5,保护定时器流程图为图6。

image.png
图5 打印中断流程图

image.png
图6: 保护定时器流程


三.按键的处理:

1.开机后按feed键,打印机进纸,支持长按键。在开机之前若先按住feed键,再按power键,则当power键放开时,打印机进行自检(ROMAN 8 字体)。

2.开机后长按mode键(>1S),进入充电模式,开始对电池进行充电。
注:必须AC adapter有连接,否则自动关机。
在开机之前若先按住mode键,再按power键,则当power键放开时,打印机在2400―――》4800―――》9600―――》infrared receive四种接收模式之间切换。

3.Power键直接连接CPU的RESET脚。每复位一次使用一个NO_INIT变量来判断开关机之间的切换。


四.充电的处理:

当电压低于4.8V时,按power键关机或10分钟自动休眠后,开始自动后台充电。

用一个A/D通道测量充电时的电压。在电压到预定值(连续10次)或连续充电14小时后,充电结束,进入休眠。

充电时关闭所有接受中断,不响应进纸键,LED约以1S闪烁。


五.红外接收的上电处理:

开机后红外接收头上的电压会有抖动,从而使输出口有信号,使接收缓存不为0。抖动时间约600~800ms。因此开机1S后再开红外接收中断。


六.红外通讯解码模块:

红外通讯解码模块包括 Port2Int(),TA_CCRx (),IrInit(),IrEnable()四个函数。

IrInit()实现红外通讯解码模块的初始化功能,初始化后模块处于关闭状态。IrEnable()是启动模块函数。Port2Int()实现红外通讯数据帧解码、校验功能。TA_CCRx ()是通讯超时处理。

image.png
红外通讯数据帧协议

红外通讯协议为如上图所示的Redeye协议,每个单元的周期为470us,调制信号的宽度占一个单元的50%。

一个完整的数据帧由帧头START、帧尾STOP、纠错数据和数据DATA组成。帧头为3个有调制信号的单元,帧尾是3个无调制信号的单元,纠错数据和数据都用2个单元来表示每bit,有调制信号的在前无调制信号的在后表示1,无调制信号的在前有调制信号的在后表示0,数据为8bits,纠错数据为4bits的Hamming Code。

经过红外接收硬件电路的解调,上图中黑框表示的调制信号变为高电平信号。

Port2Int()为外部中断函数,当接收到的信号发生上升沿跳变时,Port2Int()就被调用一次。TA_CCRx ()为定时器TA的CCR溢出中断函数。Port2Int()、TA_CCRx ()流程如下图(图中的T为数据帧中一个单元的时间)。

当接收红外通讯信号时,外部中断将捕获解调信号每一次上升沿,用定时器TA计算每个上升沿的间隔时间。从通讯协议可以知道,在正常情况下间隔只能是T、2T、3T(除了停止位)。

帧头一定是连续2个为T的间隔,并且在每个帧里是唯一的。接收数据位时,由间隔和前一位数据值判断当前位的数据值,如果间隔为T且前一位为0,则当前位为1;如果间隔为3T且前一位为1,则当前位为0;如果间隔为2T,则当前位和前一位相同;初始数据位的前一位值为0。所有的帧长度都是固定的30T,因此以通过间隔来求得接收的数据。

在通讯受到干扰的情况下,红外调制脉冲可能丢失或增加,因此加入抗干扰程序来增强通讯的可靠性。

由于数据帧长度是固定的,并且间隔一定是T的倍数,因此可以检测出脉冲丢失或增加。在每个帧里包含4bits的Hamming Code,所以Hamming Code可以检验小于3bits的错误。

image.png
红外通讯数据帧接收流程图


这样,基本上就把整个打印机的软件设计过程讲清楚了。如果各位有疑问,欢迎交流~~


以上内容均由 @patriciaphilip原创,如无授权,请勿引用,谢谢!


Posted from my blog with SteemPress : http://cnstm.org/blog/2019/05/09/impact-printer-firmware/

Sort:  

机哥好有耐心。




This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie and @utopian-io.

If you appreciate the work we are doing, then consider supporting our witness stem.witness. Additional witness support to the curie witness and utopian-io witness would be appreciated as well.

For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!

Please consider setting @steemstem as a beneficiary to your post to get a stronger support.

Please consider using the steemstem.io app to get a stronger support.

Congratulations @patriciaphilip! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You received more than 2000 upvotes. Your next target is to reach 3000 upvotes.

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

SteemitBoard - Witness Update
SteemitBoard to support the german speaking community meetups
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Hi @patriciaphilip!

Your post was upvoted by Utopian.io in cooperation with @steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.

Contribute to Open Source with utopian.io

Learn how to contribute on our website and join the new open source economy.

Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV

Coin Marketplace

STEEM 0.31
TRX 0.11
JST 0.033
BTC 64733.60
ETH 3170.85
USDT 1.00
SBD 4.16