Ik was al een tijdje van plan om een weerstanden decade box te maken. Nu vond ik de draaischakelaars nogal duur, en wat ouderwets. Daarom heb ik beslist het instellen met een rotary encoder te gaan doen.
Nu moest er nog een manier gevonden worden om de weerstand te maken. Weerstanden schakelen met transistoren of mosfets geeft een te hoge schakelweerstand en kan geen wisselspanning aan. Daarom is de keuze gevallen op relais. Aangezien er maar kleine stromen geschakeld moeten worden voldoen kleine relais. De relais print wordt 2 keer gebruikt met andere waardes weerstanden.
Relais print:
Onderdelenlijst:
Print laag ohmig
3 | 1K | R22, R23, R24 |
1 | 1K8 | R26 |
3 | 1R | R1, R2, R3 |
1 | 1R8 | R5 |
1 | 2K2 | R25 |
1 | 2R2 | R4 |
1 | 3K3 | R28 |
1 | 3R3 | R7 |
1 | 4K7 | R27 |
1 | 4R7 | R6 |
3 | 10R | R8, R9, R10 |
1 | 18R | R12 |
1 | 22R | R11 |
1 | 33R | R14 |
1 | 47R | R13 |
3 | 100R | R15, R16, R17 |
1 | 180R | R19 |
1 | 220R | R18 |
1 | 330R | R21 |
1 | 470R | R20 |
2 | 100nF | C1, C2 |
2 | 74HCT595 | IC1, IC3 |
2 | ULN2803 | IC2, IC4 |
16 | TQ2-24V | K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14, K15, K16 |
Print Hoogohmig
3 | 10K | R1, R2, R3 |
1 | 18K | R5 |
1 | 22K | R4 |
1 | 33K | R7 |
1 | 47K | R6 |
3 | 100K | R8, R9, R10 |
1 | 180K | R12 |
1 | 220K | R11 |
1 | 330K | R14 |
1 | 470K | R13 |
3 | 1M | R15, R16, R17 |
1 | 1M8 | R19 |
1 | 2M2 | R18 |
1 | 3M3 | R21 |
1 | 4M7 | R20 |
2 | 100nF | C1, C2 |
2 | 74HCT595 | IC1, IC3 |
2 | ULN2803 | IC2, IC4 |
12 | TQ2-24V | K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12 |
Aanstuur print:
Onderdelenlijst:
2 | 1µF | C3, C4 |
1 | 10K | R2 |
1 | 10K | R1 |
1 | 16F648A (Geprogrammeerd) | IC1 |
2 | 100nF | C1, C2 |
1 | Drukknop | S1 |
1 | Rotary encoder | S1 |
1 | REG1117-5V | IC2 |
Met frontpaneel:
Voeding
Dit deel is op experimenteerprint opgebouwd, hierdoor zijn er geen printlay-outs beschikbaar. de print bestaat uit een 18V transformator, gelijkrichter en een elco.
Printen ingebouwd in de behuizing:
Klaar:
Code in de microcontroller:
Device = 16F648A Config FOSC_INTOSCIO, WDTE_OFF, PWRTE_ON, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF All_Digital = true Xtal = 4 Declare PortB_Pullups On Declare LCD_DTPin PORTB.4 Declare LCD_ENPin PORTB.2 Declare LCD_RSPin PORTB.3 Declare LCD_Interface 4 Declare LCD_Lines 2 Symbol RotEncoderA = PORTB.1 Symbol RotEncoderB = PORTB.0 Symbol RotSwitch = PORTA.2 Symbol PushSwitch = PORTA.4 Dim PushSwitchBit As Bit TRISB = %00000011 TRISA = %01111100 OPTION_REG = %01000000 INTCON = %10010000 Symbol INTF = INTCON.1 Symbol klok = PORTA.0 Symbol Data_Pin = PORTA.7 Symbol ZetVast = PORTA.1 Dim DispWaarde[7] As Byte Dim SetWaarde[7] As Byte Dim DispTeller As Byte Dim CursorTeller As Byte Dim UitHex As Byte Dim UitDig As Byte Dim UitCount As Byte Dim ArrayTeller As Byte Dim Warning As Bit 'dim teller as byte On_Hardware_Interrupt GoTo IrInterrupt GoTo Init '**************************************************************** IrInterrupt: Context Save If INTF = 1 Then 'Flaggen resetten INTF = 0 If RotEncoderA = 1 Then 'Aftellen If DispWaarde[6 - DispTeller] > 0 Then Dec DispWaarde[6 - DispTeller] EndIf Else 'Optellen If DispWaarde[6 - DispTeller] < 9 Then Inc DispWaarde[6 - DispTeller] EndIf EndIf EndIf Context Restore '**************************************************************** Init: Cls UitDig = DispWaarde[3] UitHex = UitDig << 4 UitDig = DispWaarde[2] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] UitDig = DispWaarde[1] UitHex = UitDig << 4 UitDig = DispWaarde[0] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] UitHex = 0 UitDig = DispWaarde[6] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] UitDig = DispWaarde[5] UitHex = UitDig << 4 UitDig = DispWaarde[4] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] High ZetVast DelayUS 20 Low ZetVast '12345678 Print At 1, 1, "E-Stynus" Print At 2, 1, " 2014 " DelayMS 750 Cls Print At 1,1, "Set:" DispTeller = 0 'Ohm teken in lcd steken Print $FE,$40,$00,$0E,$11,$11,$11,$0A,$1B,$00 '**************************************************************** Main: While 1 = 1 'Relais aansturen bij rotary encoder button druk If RotSwitch = 0 Then For ArrayTeller = 0 To 6 SetWaarde[ArrayTeller] = DispWaarde[ArrayTeller] If SetWaarde[ArrayTeller] > 9 Then SetWaarde[ArrayTeller] = 0 DispWaarde[ArrayTeller] = 0 EndIf Next UitDig = DispWaarde[3] UitHex = UitDig << 4 UitDig = DispWaarde[2] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] UitDig = DispWaarde[1] UitHex = UitDig << 4 UitDig = DispWaarde[0] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] UitHex = 0 UitDig = DispWaarde[6] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] UitDig = DispWaarde[5] UitHex = UitDig << 4 UitDig = DispWaarde[4] UitHex = UitHex + UitDig UitHex = ~UitHex SHOut Data_Pin, klok, MsbFirst, [UitHex \ 8] High ZetVast DelayUS 20 Low ZetVast DelayMS 100 While RotSwitch = 0 DelayMS 100 Wend EndIf 'Warning teken Warning = 0 For ArrayTeller = 0 To 6 If DispWaarde[ArrayTeller] <> SetWaarde[ArrayTeller] Then Warning = 1 EndIf Next If Warning = 1 Then Print At 1, 8, "!" Else Print At 1, 8, " " EndIf 'Decade positie If PushSwitch = 0 And PushSwitchBit = 0 Then PushSwitchBit = 1 DelayMS 100 If DispTeller < 6 Then Inc DispTeller Else DispTeller = 0 EndIf EndIf If PushSwitch = 1 Then PushSwitchBit = 0 EndIf For ArrayTeller = 0 To 6 If DispWaarde[ArrayTeller] > 9 Then DispWaarde[ArrayTeller] = 0 EndIf Print At 2, 7 - ArrayTeller, Dec1 DispWaarde[ArrayTeller] Next Print At 2,8, 0 '(Print At 1,4, Dec DispTeller Print $FE, $0E 'Underline cursor on Print $FE, $C0 'Move cursor to beginning of second line CursorTeller = 0 While CursorTeller < DispTeller Print $FE, $14 'Move cursor right one position Inc CursorTeller Wend DelayMS 100 Wend End
Bestanden:
- Code file: Download
- Hex file: Download
- Front PCB: Silkscreen, top, bottom
- Relais PCB: Silkscreen, bottom