;******************************************************** ;* Laser pcb printer * ;* For Attiny13 * ;* Mark Lerman * ;* Version 1.10 - Start 7/11/2014 * ;* 8/8/2014 * ;* Programmed via usb programmer * ;* 9.6 MHz /8 fuse=1.2MHz clock * ;* uses X button on operator panel as mfps * ;* Using 1 reflective sensor as pis * ;******************************************************** ;ver 1.10 .Include "tn13def.inc" .DEF rmp0 =R16 ;multipurpose register .DEF ticks =R17 ;interrupts counter` ; ; bit definitions .EQU mfps =1 ;to manual feed paper sensor .EQU pis =4 ;to paper in sensor .EQU es =2 ;to exit sensor .EQU sw =3 ;X switch on operator panel .EQU npis =0 ;optical pis .CSEG .Org $0000 ;interrupt vectors are 1 byte in attiny13 rjmp start ; Reset Handler reti ; IRQ0 Handler reti ; PCINT0 Handler reti ; Timer0 Overflow Handler reti ; EEPROM Ready Handler reti ; Analog Comparator Handler rjmp timint ; Timer0 CompareA Handler reti ; Timer0 CompareB Handler reti ; Watchdog Interrupt Handler reti ; ADC Conversion Handler ; start: ldi rmp0, low(RAMEND) ; Set Stack Pointer to top of RAM out SPL,rmp0 ; main program start ;initializes with mfps, pis and es hi rcall set_ports ;set up ports rcall set_ticks ;set up 25 msec interrupts ;************************************************************************************ ;************************************************************************************ ;using X switch on front of printer as load switch ;seems to give 2 low pulses each time pressed and released (on release) ;This runs input rollers for a second or so to insert carrier with pcb ;can repeat by pressing and releasing releasing sw again ;new pis is reflective sensor, picks up end of tape on bottom of leading edge carrier ;new pis goes lo when activated Main: sbic pinb,sw ;loop till switch released rjmp main main00: sei ;start interrupts clr ticks main0: cpi ticks,40 ;kill approx 1 second brne main0 cbi portb,mfps ;tell printer to move input rollers ;loop till either npis goes lo or sw pressed and released again ;npis sees shiny bottom of carrier main1: cli ;no ints since timing important sbis pinb,npis ;if carrier hits npis start printing rjmp main10 ;start printing sbic pinb,sw rjmp main1 ;keep looping sbi portb,mfps ;sw pressed so reset mpfs rjmp main00 ;and repeat carrier insert ;14 inch carrier ;carrier is now moving, printer is getting ready to print ;actual start of physical printing is fixed time from PIS hi->lo ;must reset the 3 sensors at correct time, ;11" paper takes 2.84 seconds to traverse each sensor ;.258 sec/inch=3.873 inches/sec; ;7.07" pis to es * .257=1.825 sec /.025 =73 ints ;3.2" mfps to pis * .257=.8224 sec /.025 = 33 ints ;3.2" mfps to pis, so when pis goes lo, (14-3.2=10.8") left til mfps goes hi ;10.8*.258= 2.7864 sec = 111.4 ints ;14" * .258 sec/inch =3.612 sec=144.48 ints for 14" carrier to pass ;33 ints mfps to pis ;73 ints pis to es ;when pis goes lo is 10.8" to trailing edge carrier=111.4 ints ;when es goes lo is 3.73 inches between mfps and trailing edge of carrier ;3.73 inches*.258 ips = .96234 seconds /.025=38.49 interrupts main10: cbi portb,pis ;pis lo, signal printer we are moving sei ;start timer clr ticks ;start timing main11: cpi ticks,73 ;1.825 sec to reach exit sensor=7.07 inches brne main11 cbi portb,es ;exit sensor lo ;all sensors lo at this point ;now have to reset them clr ticks main12: cpi ticks,38 ;3.73 inches brne main12 sbi portb,mfps ;mpfs reset main13: cpi ticks,71 brne main13 sbi portb,pis ;reset pis main14: cpi ticks,144 brne main14 sbi portb,es ;reset es rjmp main ;and do again ;************************** ;25 msec interrupts set_ticks: ldi rmp0,0x02 ;ctc on ocr0a out tccr0a,rmp0 ldi rmp0,0x04 ;prescale by 256, =.256msec/ct out tccr0b,rmp0 ldi rmp0,117 ;117*.2133=24.9561 msec/int out ocr0a,rmp0 ldi rmp0,0x04 ;0a output compare enabled out timsk0,rmp0 ret ;init ports - all sensors hi ;b0,b3 input, rest output set_ports: ldi rmp0,0x16 ;0 in, rest out out ddrb,rmp0 ldi rmp0,0xf6 ;outputs hi, inputy pullup off out portb,rmp0 ret Timint: inc ticks reti