Go Back   Home > Forums > Design & Build > Construction Tips

Construction Tips Construction techniques and tips

Please consider donating to help us continue to serve you.

Ads on/off / Custom Title / More PMs / More album space / Advanced printing & mass image saving
Reply
 
Thread Tools Search this Thread
Old 26th August 2010, 11:56 PM   #11
Banned
 
Join Date: Jan 2008
Blog Entries: 2
Default The code

; To display 0-999 on 3 * 7-seg displays

#include <p16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
cblock 0x20
BUF_LO
BUF_HI
BUF2HI
BUF2LO
BUF3HI
BUF3LO
THOUS
HUNS
TENS
UNITS
TH_DISP
HU_DISP
TE_DISP
UN_DISP
CTR
CTR2
CTR3
FLAGS
S_FLAG
C_FLAG
F_FLAG
endc

ZERO equ B'10001000'
ONE equ B'11101011'
TWO equ B'01001100'
THREE equ B'01001001'
FOUR equ B'00101011'
FIVE equ B'00011001'
SIX equ B'00011000'
SEVEN equ B'11001011'
EIGHT equ B'00001000'
NINE equ B'00001011'
DECIMAL equ B'00000011'

org 0
start:
banksel TRISE
clrf TRISE ; Make PortE all output
bcf TRISE,0 ; Set RE0 to output
bsf TRISE,1 ; Set RE1 to input
bsf TRISE,2 ; Set RE2 to input

bcf STATUS,RP0 ; select Register Page 0
bcf STATUS,RP1 ; select Register Page 0
clrf PORTA
bsf STATUS,RP0 ; select Register Page 1
clrf TRISA ; Make PortA all output
clrf TRISB ; Make PortB all output
clrf TRISC ; Make PortC all output
clrf TRISD ; Make PortD all output
movlw 0x80 ; right justify, Vdd and Vss as Vref
movwf ADCON1
bsf TRISA,0 ; Set RA0 to input
bsf STATUS,RP1 ; select Register Page 3
clrf ANSEL
bcf STATUS,RP1 ; select Register Page 1
bcf STATUS,RP0 ; select Register Page 0
movlw 0xFF
movwf PORTB ; turn off all outputs
movwf PORTC
movwf PORTD
clrf BUF_LO
clrf BUF_HI
clrf BUF2LO
clrf BUF2HI
clrf BUF3LO
clrf BUF3HI
clrf FLAGS
clrf S_FLAG

mainloop:
btfsc C_FLAG,0 ; test the count flag
goto main2 ; execute count
btfsc PORTE,2 ; else test down bit
goto sw2
btfsc PORTE,1 ; test up bit
goto sw1
btfsc PORTA,0 ; test start bit
goto sw0
clrf FLAGS ; if no button pressed
clrf S_FLAG ; clear the short delay flag and counter
goto main2_done
sw2:
btfsc FLAGS,0 ; if short count flag set
goto main1 ; else count down
incf S_FLAG ; else count to 5
btfss S_FLAG,2 ; check for 4
goto main1 ; else count down
btfss S_FLAG,0 ; 4+1=5, so skip to set short count flag
goto main1 ; else count down
bsf FLAGS,0 ; set short count flag
goto main1 ; and count down
sw1:
btfsc FLAGS,0 ; same as down count, but up
goto main0
incf S_FLAG
btfss S_FLAG,2
goto main0
btfss S_FLAG,0
goto main0
bsf FLAGS,0
goto main0 ; and count up
sw0:
bsf C_FLAG,0 ; continuous count
bsf PORTE,0 ; turn on relay
movfw BUF2HI ; store count for future reference
movwf BUF3HI
movfw BUF2LO
movwf BUF3LO
goto main2 ; start count
main0:

movlw 0x01 ; upcount under button control
addwf BUF2LO,1 ; increment buffer memoryy
btfsc STATUS,Z
incf BUF2HI,1
btfss BUF2HI,1 ; check for 1000
goto main2_done
btfss BUF2HI,0
goto main2_done
btfss BUF2LO,7
goto main2_done
btfss BUF2LO,6
goto main2_done
btfss BUF2LO,5
goto main2_done
btfss BUF2LO,3 ; not 1000, continue
goto main2_done
clrf BUF2LO ; else set buffer to 0
clrf BUF2HI
goto main2_done
main1:
movlw 0x01 ; downcount under button control without switching on relay
subwf BUF2LO,1 ; decrement buffer memory
btfsc STATUS,C ; carry bit is UNSET on borrow when decrementing
goto main2_done
subwf BUF2HI,1
btfsc STATUS,C ; check for 000
goto main2_done
movlw 0x03
movwf BUF2HI
movlw 0xE7
movwf BUF2LO
goto main2_done
main2:
movlw 0x01 ; downcount continuously with relay turned on
subwf BUF2LO,1 ; decrement buffer memory
btfsc STATUS,C ; carry bit is UNSET on borrow when decrementing
goto main2_done
subwf BUF2HI,1
btfsc STATUS,C ; check for 000
goto main2_done
movfw BUF3HI
movwf BUF2HI
movfw BUF3LO
movwf BUF2LO
clrf C_FLAG ; discontinue count
bcf PORTE,0 ; turn off relay
main2_done:
movfw BUF2HI ; transfer counting buffer to main register
movwf BUF_HI
movfw BUF2LO
movwf BUF_LO

clrf TH_DISP ; clear display registers
clrf HU_DISP
clrf TE_DISP
clrf UN_DISP
clrf THOUS ; clear BCD registers
clrf HUNS
clrf TENS
clrf UNITS
btfss BUF_HI,1 ; test buffer bits and distribute values to BCD registers
goto bitnine
movlw 5
addwf HUNS,f
movlw 1
addwf TENS,f
movlw 2
addwf UNITS,f
bitnine:
btfss BUF_HI,0
goto biteight
movlw 2
addwf HUNS,f
movlw 5
addwf TENS,f
movlw 6
addwf UNITS,f
biteight:
btfss BUF_LO,7
goto bitseven
movlw 1
addwf HUNS,f
movlw 2
addwf TENS,f
movlw 8
addwf UNITS,f
bitseven:
btfss BUF_LO,6
goto bitsix
movlw 6
addwf TENS,f
movlw 4
addwf UNITS,f
bitsix:
btfss BUF_LO,5
goto bitfive
movlw 3
addwf TENS,f
movlw 2
addwf UNITS,f
bitfive:
btfss BUF_LO,4
goto bitfour
movlw 1
addwf TENS,f
movlw 6
addwf UNITS,f
bitfour:
btfss BUF_LO,3
goto bitthree
movlw 8
addwf UNITS,f
bitthree:
btfss BUF_LO,2
goto bittwo
movlw 4
addwf UNITS,f
bittwo:
btfss BUF_LO,1
goto bitone
movlw 2
addwf UNITS,f
bitone:
btfss BUF_LO,0
goto bitzero
movlw 1
addwf UNITS,f
bitzero:
movlw D'10' ; move any tens to tens register
subwf UNITS,f
btfsc STATUS,Z
goto units_zero
btfss STATUS,C
goto units_carry
incf TENS,f
goto bitzero
units_carry:
movlw D'10'
addwf UNITS,f
goto units_done
units_zero:
incf TENS,f
units_done:
movlw D'10' ; move any hundredss to hundreds register
subwf TENS,f
btfsc STATUS,Z
goto tens_zero
btfss STATUS,C
goto tens_carry
incf HUNS,f
goto units_done
tens_carry:
movlw D'10'
addwf TENS,f
goto tens_done
tens_zero:
incf HUNS,f
tens_done:
movlw D'10'
subwf HUNS,f
btfsc STATUS,Z
goto huns_zero
btfss STATUS,C
goto huns_carry
incf THOUS,f
goto tens_done
huns_carry:
movlw D'10' ; move any thous to thous register
addwf HUNS,f
goto huns_done
huns_zero:
incf THOUS,f
huns_done:

movlw 1 ; test value in BCD units and set display registers
subwf UNITS,f
btfsc STATUS,C
goto units_1
movlw ZERO ; move '0' to UN_DISP
movwf UN_DISP
goto tens_0
units_1:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_2
movlw ONE ; move '1' to UN_DISP
movwf UN_DISP
goto tens_0
units_2:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_3
movlw TWO ; move '2' to UN_DISP
movwf UN_DISP
goto tens_0
units_3:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_4
movlw THREE ; move '3' to UN_DISP
movwf UN_DISP
goto tens_0
units_4:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_5
movlw FOUR ; move '4' to UN_DISP
movwf UN_DISP
goto tens_0
units_5:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_6
movlw FIVE ; move '5' to UN_DISP
movwf UN_DISP
goto tens_0
units_6:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_7
movlw SIX ; move '6' to UN_DISP
movwf UN_DISP
goto tens_0
units_7:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_8
movlw SEVEN ; move '7' to UN_DISP
movwf UN_DISP
goto tens_0
units_8:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto units_9
movlw EIGHT ; move '8' to UN_DISP
movwf UN_DISP
goto tens_0
units_9:
movlw 1
subwf UNITS,f
btfsc STATUS,C
goto tens_0
movlw NINE ; move '9' to UN_DISP
movwf UN_DISP
tens_0:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_1
movlw ZERO ; move '0' to TE_DISP
movwf TE_DISP
goto huns_0
tens_1:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_2
movlw ONE ; move '1' to TE_DISP
movwf TE_DISP
goto huns_0
tens_2:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_3
movlw TWO ; move '2' to TE_DISP
movwf TE_DISP
goto huns_0
tens_3:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_4
movlw THREE ; move '3' to TE_DISP
movwf TE_DISP
goto huns_0
tens_4:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_5
movlw FOUR ; move 4 to TE_DISP
movwf TE_DISP
goto huns_0
tens_5:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_6
movlw FIVE ; move '5' to TE_DISP
movwf TE_DISP
goto huns_0
tens_6:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_7
movlw SIX ; move 6 to TE_DISP
movwf TE_DISP
goto huns_0
tens_7:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_8
movlw SEVEN ; move '7' to TE_DISP
movwf TE_DISP
goto huns_0
tens_8:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto tens_9
movlw EIGHT ; move 8 to TE_DISP
movwf TE_DISP
goto huns_0
tens_9:
movlw 1
subwf TENS,f
btfsc STATUS,C
goto huns_0
movlw NINE ; move '9' to TE_DISP
movwf TE_DISP
huns_0:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_1
movlw ZERO ; move '0' to HU_DISP
movwf HU_DISP
goto thous_0
huns_1:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_2
movlw ONE ; move '1' to HU_DISP
movwf HU_DISP
goto thous_0
huns_2:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_3
movlw TWO ; move '2' to HU_DISP
movwf HU_DISP
goto thous_0
huns_3:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_4
movlw THREE ; move '3' to HU_DISP
movwf HU_DISP
goto thous_0
huns_4:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_5
movlw FOUR ; move '4' to HU_DISP
movwf HU_DISP
goto thous_0
huns_5:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_6
movlw FIVE ; move '5' to HU_DISP
movwf HU_DISP
goto thous_0
huns_6:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_7
movlw SIX ; move '6' to HU_DISP
movwf HU_DISP
goto thous_0
huns_7:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_8
movlw SEVEN ; move '7' to HU_DISP
movwf HU_DISP
goto thous_0
huns_8:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto huns_9
movlw EIGHT ; move '8' to HU_DISP
movwf HU_DISP
goto thous_0
huns_9:
movlw 1
subwf HUNS,f
btfsc STATUS,C
goto thous_0
movlw NINE ; move '9' to HU_DISP
movwf HU_DISP
thous_0:
movlw 1
subwf THOUS,f
btfsc STATUS,C
goto thous_1
movlw ZERO ; move '0' to TH_DISP
movwf TH_DISP
goto thous_2
thous_1:
movlw 1
subwf THOUS,f
btfsc STATUS,C
goto thous_2
movlw ONE ; move '1' to TH_DISP
movwf TH_DISP
thous_2:
movf UN_DISP,0 ; paint display registers onto 7-segment displays
movwf PORTC
movf TE_DISP,0
movwf PORTD
movf HU_DISP,0
movwf PORTB
btfsc FLAGS,0 ; fast/slow count switch
goto short2delay
call secdelay
goto mainloop
short2delay:
call shortdelay
goto mainloop
secdelay:
movlw 0x05
movwf CTR3
decfsz CTR,1
goto $-1
decfsz CTR2,1
goto $-3
decfsz CTR3,1
goto $-5
return
shortdelay:
movlw 0x3F
movwf CTR2
decfsz CTR,1
goto $-1
decfsz CTR2,1
goto $-3
return
end

Damn, the forum has truncated the spacing for the comments, it makes it a bit harder to read.

This code is tested and works on the hardware circuit shown previously.

w

Last edited by wakibaki; 27th August 2010 at 12:00 AM.
  Reply With Quote
Old 27th August 2010, 12:02 AM   #12
Banned
 
Join Date: Jan 2008
Blog Entries: 2
Default Bill of Materials

Resistors

24 R2-R25 470R
1 R27 1k
2 R28,R29,R30 10k

Capacitors

3 C2-C4 100n
2 C9,C10 2.2uF

Integrated Circuits

1 U2 PIC16F887A-PT
3 U3-U5 7SEGBLUE
1 U7 78S05

Transistors

1 Q1 BC108

Diodes

3 D5-D7 DIODE 1N4001
90 D8-D97 LED UV

Miscellaneous

1 TR1 TRANS-12V-20VA
1 J1 PIC_ICSP_HDR
1 J2 CONN-H4
1 J5 TBLOCK-I2
1 RL1 G2R-14-DC12
1 Large Veroboard

w
  Reply With Quote
Old 6th September 2010, 04:47 PM   #13
qusp is offline qusp  Australia
diyAudio Member
 
qusp's Avatar
 
Join Date: Oct 2009
Location: Brisbane, Australia
thanks for the thread mate!! really handy for me, as I have been tyhinking on buying my first round of materials for building some prototype PCBs before I get the full small run done. I also cannot do anything with the current components I have chosen for my regulator PCB without having a PCB to place them on (very small DFN package linear tech bipolar LDOs) so this thread will come in very handy I think. do you have any recommendations for oven 'profiles' for toaster oven reflow/soldering work? I read of using a marker of sorts (crayon or something from memory) to give a visual indication of when to turn the oven off, do you have a technique for this? how do you adhere the parts to the PCB while placing before baking?

thanks very much
  Reply With Quote
Old 7th September 2010, 06:30 PM   #14
Banned
 
Join Date: Jan 2008
Blog Entries: 2
I don't have a toaster oven at home, I used one at work. The time taken to heat to reflow point was about 5 minutes. I believe it was an 800W oven, it had a radiant bar (like out of a radiant fire, silica tube outside) top and bottom. I used both simultaneously.

Since I only used the oven infrequently, it was generally at room temperature (70F) to start with. I didn't have a 'profile', I put the boards in the oven, spread out to pretty much fill the area, but avoiding the edges and corners by about 2cm. These were maybe 9 off 2*1.5in boards. I found pretty quickly that just over 5 minutes by the built-in mechanical timer was generally required. The oven had a glass panel in the door, so it was pretty easy to see when the solder had gone off, you can see it change from grey to bright silver, and all the components 'sit down' and align to the pads. The heating was not uniform, but from start to all joints done only took maybe 60 seconds, less in most cases. This was enough to melt DIL sockets though, but not seriously deform them, they were used as surface mount anyway, which meant that they were closer to the heating element, and more exposed.

It's mostly about skill and experimentation, rather than prescribed solutions. You need to be able to do a few trials without caring about whether you destroy a chip, or a board for that matter.

I generally only reflowed 1 side and hand-soldered the other. The hand-soldered side was designed to be less problematic than the reflow side. Obviously, if you are arranging a PCB then you know the production facilities available to you and this influences the physical layout. If I had to pick off a 44-pin chip or suchlike I'd heat it up with a heat-gun and get a scalpel tip in between the legs and pick or flick it off. Just a regular De Walt DIY heat-gun with plenty of power and a big blast of air available. I didn't use adhesive, just a laser-cut mylar stencil to apply the solder, then hand-place the components, handle the boards with care and reflow them before they could get disturbed. The solder paste is sticky, it certainly sticks to anything you don't want it to, you can push the components down into it like bricks into mortar, in fact this is the one time you'd prefer it stickier, but it works out.

One thing worth knowing is that the green photo-resist on professional supplies of board from is solder-through. You are better not to process hand-etched boards beyond the etching point. The unexposed resist will keep the copper clean and solderable. I used to re-expose and redevelop boards, or strip the etch with emery paper, but this is unnecessary unless the boards are inadvertently heated without tinning taking place, in which case they can become resistant and need scouring.

The solder paste I used had noticeably more aggressive flux than regular multicore wire. I've got some new stuff here, but I haven't bought an oven yet, so I haven't had a chance to evaluate it.

The problem with some of the very small DFN packages with all the contacts underneath is that the pads are so small that they are approaching the maximum resolution usefully produced with regular software and a laser printer.

w
  Reply With Quote
Old 8th September 2010, 04:36 AM   #15
qusp is offline qusp  Australia
diyAudio Member
 
qusp's Avatar
 
Join Date: Oct 2009
Location: Brisbane, Australia
thanks for the reply. yeah I wont be working with a profile at the beginning either, maybe never, but there are a few reflow controller boards that can be built, so perhaps i'll get around to it some day. I plan to do some tests with some cheaper TO52 regs and 0805 resistors etc first to get my head around the use of the oven before I tackle anything I actually need to survive. after watching plenty of youtube vids last night it seems I underestimated the stickiness of the solder paste, so yeah I cant see me needing the adhesive either. I hadnt realized (hadnt really thought about it) that the surface tension would be so friendly and align it so neatly

I enjoy hand soldering and at this stage i'm not planning any large runs or anything, just finding a way to stuff decent size builds and also a way of soldering these components at home, because pick and place for only a couple of boards is crazy expensive.

I could have redesigned with a more diy friendly reg chip, but this is the only package this reg comes in and I dont know that there is another chip like it low noise small very low dropout bipolar linear regs are pretty thin on the ground and it works with my charge pump perfectly too, can be shutdown by the charge monitor when VCC/2 hits 3v

I have a heat gun, but its not really hot enough

luckily WRT the laser printer resolution. luckily in a past life I was a graphic designer and as is my mother. so I personally have a xerox 1200dpi colour laser printer and have access to a docucolour at 3 x that and software isnt an issue, it isnt an overly complex PCB, if needed I could edit the PDF in illustrator and draw in the correct landing patterns. I think i'll be fine though in that regard.

thanks again
  Reply With Quote

Reply


Hide this!Advertise here!
Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
UV Lightbox Timer Dagwood Everything Else 0 27th February 2010 01:32 PM
DIY UV Exposure box with UV LEDs Nordic Parts 54 1st October 2007 09:58 PM
Suggestions for PCB stencils? ezkcdude Digital Source 7 23rd June 2007 12:56 AM
DIY ZV9 boards with Inkjet Photo Paper vdi_nenna Pass Labs 11 12th October 2006 06:46 AM


New To Site? Need Help?

All times are GMT. The time now is 12:14 AM.


vBulletin Optimisation provided by vB Optimise (Pro) - vBulletin Mods & Addons Copyright © 2014 DragonByte Technologies Ltd.
Copyright 1999-2014 diyAudio

Content Relevant URLs by vBSEO 3.3.2