+- +-

Nuorodos



+-Narystė

Welcome, Guest.
Please login or register.
 
 
 
Forgot your password?

Varžybos


REGISTRUOTIS 
»

  

+-Statistika

Members
Total Members: 1305
Latest: Donatas
New This Month: 1
New This Week: 0
New Today: 0
Stats
Total Posts: 182057
Total Topics: 5329
Most Online Today: 96
Most Online Ever: 566
(2023.01.14-11:40:47)
Users Online
Members: 0
Guests: 76
Total: 76

Autorius Tema: Quick Chrono pasidaryk pats + PIC16F84A HEX & ASM  (Skaityta 104059 kartus)

quicker

  • Svečias
Quick Chrono pasidaryk pats + PIC16F84A HEX & ASM
« Įrašytas: 2007.09.23-17:50:45 »
Senąjame forume buvau viską aprašes, tai dabar pamėginsiu viską po truputi perkelti čia. Naujiena ta, kad ryšium su tuo, jog pats nebegaminu chronografų pardavimui - paskelbsiu ir HEX kodą ir ASM programą mikrokontroleriui PIC16F84A.

Nuo ko viskas prasidėjo (bandomoji versija):



Į ką viskas išsivystė (pardavinėta versija):


quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX
« Atsakymas #1 Įrašytas: 2007.09.23-17:52:57 »
Schema:



[2007-05-30 patikslinimas]: C1 geriau naudoti 220uF/6.3V (įtampa gali būti didesnė, talpa kuo didesnė tuo geriau), o R2 parinkti bandymų keliu nuo 130R iki 180R.

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX
« Atsakymas #2 Įrašytas: 2007.09.23-17:55:55 »
HEX kodas mikrokontroleriui:

:020000040000FA
:020000000528D1
:08000800792800306500850134
:10001000013066009201C330970050309800752877
:1000200083160113811283128B178B160B110B167B
:100030008B109201A3200C0886008514C82085101F
:100040000D0886000515C82005110E0886008515C7
:10005000C820851112182D201B28910A031D38284D
:1000600031280C308C000E308D000B308E0045286E
:1000700091038C018D018E011708990018089A00D0
:10008000502092184528602040280C08B7208C008A
:100090000D08B7208D000E08B7208E001210080042
:1000A000921010089A020318592801309902031C73
:1000B0005E2811089902031C5E28080092140800AB
:1000C0008E0A0E08093C0318080000308E008D0AC5
:1000D0000D08093C0318080000308D008C0A0C083C
:1000E000093C031808008C03080006181028AD20EE
:1000F0001B281610831A1614930083160108950006
:10010000831216188316030894008B1890280B1975
:1001100089288F0A031D8E28FF308F000B11992824
:100120000F089100010890008F01810112148B10BB
:100130009928140883001508831681001308831278
:100140001618831609000B30B7208C000D30B7202D
:100150008D000E30B7208E0008000C30B7208C00C8
:100160000E30B7208D000530B7208E0008008207C2
:100170008034F23448346034323424340434F0347B
:10018000003420347E348C340C3416345E34FE3427
:0A01900080309B009B0BCA2808007A
:02400E000200AE
:00000001FF

PS. Atstumas tarp daviklių = 50 mm.

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX
« Atsakymas #3 Įrašytas: 2007.09.23-18:00:38 »
Spausdintinės plokštės maketas (300dpi):


quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX
« Atsakymas #4 Įrašytas: 2007.09.23-18:16:45 »
Asemblerinė mikrokontrolerio programa


; Quick Chrono v1.7 ; Copyright Romas Pumpalavičius www.sprendimai.com 2007 ;

; CONFIGURE

                 processor      16f84a
                 include            <p16f84a.inc>
                 __config      _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_ON

; SET PROGRAM VECTORS

                 org                  0x00                              ; Reset vector
                 goto            Initialization

                 org                  0x04                              ; Interrupt vector
                 goto            Interrupts

; INITIALIZATION

Initialization

; Initialization of ports

                 movlw            B'00000000'                        ; PortA -> output
                 tris            PORTA
                 clrf            PORTA                              ; Clear PortA (turn off display)

                 movlw            B'00000001'                        ; PortB -> Pin0 - input, Pin1-Pin7 - output
                 tris            PORTB

; Set up variables

Char1            equ                  0x0C                              ; 7 segment indicator character 1
Char2            equ                  0x0D                              ; 7 segment indicator character 2
Char3            equ                  0x0E                              ; 7 segment indicator character 3

TimerH            equ                  0x0F                              ; Timer high byte

TimeEL            equ                  0x10                              ; Time Elapsed low byte
TimeEH            equ                  0x11                              ; Time Elapsed high byte

Flags            equ                  0x12                              ; Program flags:
                                                                       ; bit0=1 -> needs calculation of speed
                                                                       ; bit1=1 -> impossible to subtract fully
                 clrf            Flags                              ; Initial clear flags

IntW            equ                  0x13                              ; Temporary interrupt variable for W
IntSTATUS      equ                  0x14                              ; Temporary interrupt variable for STATUS
IntOPTION      equ                  0x15                              ; Temporary interrupt variable for OPTION
IntBANK            equ                  0x16                              ; Temporary interrupt variable for BANK

SensDistH      equ                  0x17                              ; Distance between sensors milimeters * 1000 (for 4MHz clock) higher byte
SensDistL      equ                  0x18                              ; Distance between sensors milimeters * 1000 (for 4MHz clock) lower byte
                 movlw            0xC3                              ; Set up 50000 for distance bytes
                 movwf            SensDistH
                 movlw            0x50
                 movwf            SensDistL

CalcDistH      equ                  0x19                              ; Calculation distance variable higher byte
CalcDistL      equ                  0x1A                              ; Calculation distance variable lower byte

Contrast      equ                  0x1B                              ; Starting pause low byte

; Test sensors

                 goto            Test_sensors

; Start normal program flow

Start_normal

; Initialization of interrupts

                 bsf                  STATUS,                  RP0            ; Select Bank 1
                 bcf                  OPTION_REG,            INTEDG      ; Select INT edge low
                 bcf                  OPTION_REG,            T0CS      ; Select internal timer
                 bcf                  STATUS,                  RP0            ; Select Bank 0

                 bsf                  INTCON,                  GIE            ; Enable all interrupts
                 bsf                  INTCON,                  T0IE      ; Timer0 interrupt Enable
                 bcf                  INTCON,                  T0IF      ; Clear Timer0 interrupt flag
                 bsf                  INTCON,                  INTE      ; INT interrupt Enable
                 bcf                  INTCON,                  INTF      ; Clear INT interrupt flag

; Clear program flags (very important to do it after interrupt initialisation)

                 clrf            Flags

; MAIN PROGRAM

; Print "Chrono Ready" code

                 call            Chrono_Ready

; Main output

Main_output

                 movfw            Char1                              ; Get Char1 to W
                 movwf            PORTB                              ; Move W (Char1) to PortB
                 bsf                  PORTA,                  1            ; Turn on Char1
                 call            contrast                        ; Pause output
                 bcf                  PORTA,                  1            ; Turn off Char1

                 movfw            Char2                              ; Get Char2 to W
                 movwf            PORTB                              ; Move W (Char2) to PortB
                 bsf                  PORTA,                  2            ; Turn on Char2
                 call            contrast                        ; Pause output
                 bcf                  PORTA,                  2            ; Turn off Char2

                 movfw            Char3                              ; Get Char3 to W
                 movwf            PORTB                              ; Move W (Char3) to PortB
                 bsf                  PORTA,                  3            ; Turn on Char3
                 call            contrast                        ; Pause output
                 bcf                  PORTA,                  3            ; Turn off Char3

                 btfsc            Flags,                  0            ; Check if calculation of speed is needed
                 call            Calculate                        ; If needed (Flag0 = 1) call calculation subroutine
                 goto            Main_output

; CALCULATE SPEED

Calculate
; Check if no error occurred
                 incf            TimeEH,                  f            ; Increase time elapsed higher byte (TimerEH)
                 btfss            STATUS,                  Z            ; Test for higher byte overflow
                 goto            DoCalc                              ; If overflow did not occurred (STATUS Carry = 0) goto "DoCalc"
                 goto            ErrorCalc                        ; If overflow occurred (STATUS Carry = 0) goto "ErrorCalc"

; Error in calculation
ErrorCalc
                 movlw            0x0C                              ; "E" -> Char1
                 movwf            Char1

                 movlw            0x0E                              ; "r" -> Char2
                 movwf            Char2

                 movlw            0x0B                              ; "C" -> Char3
                 movwf            Char3

                 goto            FinishCalc

; Do calculation
DoCalc
                 decf            TimeEH,                  f            ; Decrease time elapsed higher byte (TimerEH) after checking
                 clrf            Char1                              ; Clear display character 1
                 clrf            Char2                              ; Clear display character 2
                 clrf            Char3                              ; Clear display character 3
                 
                 movfw            SensDistH                        ; Set distance to calculation variable
                 movwf            CalcDistH
                 movfw            SensDistL
                 movwf            CalcDistL
                 
DivisionCalc
                 call             SubtractCalc
                 btfsc            Flags,                  1
                 goto             FinishCalc
                 call             IncreaseDEC
                 goto            DivisionCalc

FinishCalc
; Get Characters to display
                 movfw            Char1
                 call            Get_char
                 movwf            Char1

                 movfw            Char2
                 call            Get_char
                 movwf            Char2

                 movfw            Char3
                 call            Get_char
                 movwf            Char3
;
                 bcf                  Flags,                  0            ; Clear flag to calculate speed
                 return                                                ; Return from calculation

; Increase decimal counter

SubtractCalc
                 bcf                  Flags,                  1
                 ; subtract lower byte
                 movfw            TimeEL
                 subwf            CalcDistL,            f
                 btfsc            STATUS,                  C
                 goto            SubtractHigh

                 ; borrow from higher byte
                 movlw            .1
                 subwf            CalcDistH,            f
                 btfss            STATUS,                  C
                 goto            SubtractImpossible
                 
SubtractHigh
                 ; subtract higher byte
                 movfw            TimeEH
                 subwf            CalcDistH,            f
                 btfss            STATUS,                  C
                 goto            SubtractImpossible
                 return

SubtractImpossible
                 bsf                  Flags,                  1
                 return

IncreaseDEC
                 incf            Char3,                  f
                 movfw            Char3
                 sublw            .9
                 btfsc            STATUS,                  C
                 return
                 movlw            .0
                 movwf            Char3
                 
                 incf            Char2,                  f
                 movfw            Char2
                 sublw            .9
                 btfsc            STATUS,                  C
                 return
                 movlw            .0
                 movwf            Char2
                 
                 incf            Char1,                  f
                 movfw            Char1
                 sublw            .9
                 btfsc            STATUS,                  C
                 return
                 decf            Char1,                  f
                 return                  

; TEST SENSORS

Test_sensors
                 btfsc            PORTB,                  0            ; Test RB0 for high level
                 goto            Start_normal                  ; If RB0=1 go to "Start_normal"
                 call            Error_sensors                  ; If RB0=0 call "Error_sensors"
                 goto            Main_output                        ; and go to "Main output"

; INTERRUPTS

; Test for which interrupt

Interrupts

; Push
                 bcf                  IntBANK,            0            ; Clear temp BANK
                 btfsc            STATUS,                  RP0            ; Check real BANK
                 bsf                  IntBANK,            0            ; Store BANK if RP0=1
                 movwf            IntW                              ; Save W
                 bsf                  STATUS,                  RP0            ; Set BANK 1
                 movfw            OPTION_REG                        ; Get OPTION_REG
                 movwf            IntOPTION                        ; Save OPTION
                 bcf                  STATUS,                  RP0            ; Clear BANK
                 btfsc            IntBANK,            0            ; Check temp BANK
                 bsf                  STATUS,                  RP0            ; Restore BANK if temp BANK = 1
                 movfw            STATUS                              ; Get STATUS
                 movwf            IntSTATUS                        ; Save STATUS
;
                 btfsc            INTCON,                  INTF      ; Test for INT interrupt
                 goto            Sensor_interrupt            ; If INTF=1 goto "Sensor_interrupt"
                 btfsc            INTCON,                  T0IF      ; Test for TMR0 interrupt
                 goto            Timer_interrupt                  ; If T0IF=1 goto "Timer_interrupt"

; Timer interrupt

Timer_interrupt
                 incf            TimerH,                  f            ; Increase timer higher byte (TimerH)
                 btfss            STATUS,                  Z            ; Test for higher byte overflow
                 goto            Time_left                        ; If overflow did not occurred (STATUS Carry = 0) goto "Time_left"
                 movlw            0xFF                              ; If overflow occurred (STATUS Carry = 1) set FF => W ...
                 movwf            TimerH                              ; ... W => TimerH (= FF [maximum counter value, no reason to count further])

Time_left
                 bcf                  INTCON,                  T0IF
                 goto             Interrupts_end

; Sensor interrupt

Sensor_interrupt
                 movfw            TimerH                              ; Move TimerH to TimeEH (time elapsed high)
                 movwf            TimeEH
                 movfw            TMR0                              ; Move TMR0 to TimeEL (time elapsed low)
                 movwf            TimeEL
                 
                 clrf            TimerH                              ; Clear timer high byte
                 clrf            TMR0                              ; Clear timer low byte
                 
                 bsf                  Flags,                  0            ; Set flag to calculate speed

                 bcf                  INTCON,                  INTF
                 goto             Interrupts_end

; End of interrupt

Interrupts_end

; Pop
                 movfw            IntSTATUS                        ; Get STATUS
                 movwf            STATUS                              ; Save STATUS
                 movfw            IntOPTION                        ; Get OPTION_REG
                 bsf                  STATUS,                  RP0            ; Set BANK 1
                 movwf            OPTION_REG                        ; Save OPTION
                 movfw            IntW                              ; Save W
                 bcf                  STATUS,                  RP0            ; Clear BANK
                 btfsc            IntBANK,            0            ; Check temp BANK
                 bsf                  STATUS,                  RP0            ; Restore BANK if temp BANK = 1
;
                 retfie                                                ; Return from interrupts and set INTCON GIE bit

; SUBROUTINES

; Chrono ready

Chrono_Ready                                                      ; "Chr" to display
                 movlw            0x0B                              ; "C" -> Char1
                 call            Get_char
                 movwf            Char1

                 movlw            0x0D                              ; "h" -> Char2
                 call            Get_char
                 movwf            Char2

                 movlw            0x0E                              ; "r" -> Char3
                 call            Get_char
                 movwf            Char3

                 return

; Error sensors

Error_sensors                                                      ; "ErS" to display
                 movlw            0x0C                              ; "E" -> Char1
                 call            Get_char
                 movwf            Char1

                 movlw            0x0E                              ; "r" -> Char2
                 call            Get_char
                 movwf            Char2

                 movlw            0x05                              ; "S"/"5" -> Char3
                 call            Get_char
                 movwf            Char3

                 return
                 
; Get character code
;       charcter No => W
;       call Get_char
;       character Code => W

Get_char
                 addwf            PCL,                  f            ; Increase program counter in W steps
                 retlw            B'10000000'                        ; "0"
                 retlw            B'11110010'                        ; "1"
                 retlw            B'01001000'                        ; "2"
                 retlw            B'01100000'                        ; "3"
                 retlw            B'00110010'                        ; "4"
                 retlw            B'00100100'                        ; "5"
                 retlw            B'00000100'                        ; "6"
                 retlw            B'11110000'                        ; "7"
                 retlw            B'00000000'                        ; "8"
                 retlw            B'00100000'                        ; "9"
                 retlw            B'01111110'                        ; "-"
                 retlw            B'10001100'                        ; "C"
                 retlw            B'00001100'                        ; "E"
                 retlw            B'00010110'                        ; "h"
                 retlw            B'01011110'                        ; "r"
                 retlw            B'11111110'                        ; " "

contrast
                 movlw            0x80
                 movwf            Contrast
set_contr
                 decfsz            Contrast,      f
                 goto             set_contr
                 return

; CODE END

                 end


zalias7

  • Administrator
  • Hero Member
  • *****
  • Įrašai: 2620
  • Karma: +51/-20
    • Žiūrėti profilį
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #5 Įrašytas: 2007.09.23-18:29:39 »
opensourcas veza :) quicker  pagarba :beer:

kas_nepatinka

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #6 Įrašytas: 2007.09.23-18:46:59 »
Būtų pora klausimėlių.
1. Kas per vamzdelis? Ar bet koks?
2. Ka naudojai mikrokontrolerio programavimui? Kažkokį programatorių (koki?) ar dariaisi chemute pajungimui prie kompo?

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #7 Įrašytas: 2007.09.23-18:51:57 »
Vamzdelis is senuku PVC, nuo vandentiekio, belekoks. Ale geriau vistik butu pilkas, o dar geriau is vidaus dazyti juodais matiniais dazais pries statant IR diodus ir fototranzus, bet ir taip veikia. Programatoriaus schema tuoj surasiu, ten labai paprasta pasirinkau, bet veikia gerai...

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #8 Įrašytas: 2007.09.23-18:54:58 »
Programatorius: RCD programmer http://feng3.cool.ne.jp/en/rcd.html

Softas: IC-prog http://www.ic-prog.com/

kas_nepatinka

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #9 Įrašytas: 2007.09.23-18:59:05 »
Gana nesudetinga, tik kaip reiks plokštę išėsdint?
O pats ėsdinai plokštes ar uzsakinėjai kur ?

zalias7

  • Administrator
  • Hero Member
  • *****
  • Įrašai: 2620
  • Karma: +51/-20
    • Žiūrėti profilį
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #10 Įrašytas: 2007.09.23-19:00:50 »

Citata
kas_nepatinka rašė:
Gana nesudetinga, tik kaip reiks plokštę išėsdint?
O pats ėsdinai plokštes ar uzsakinėjai kur ?


yra forume tox Povilas jis kur tai prie ploksciu dirba, koperuokites ir kankinkit :)

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #11 Įrašytas: 2007.09.23-19:03:44 »
Tuoj parasysiu kaip plokste daryt :))

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #12 Įrašytas: 2007.09.23-19:05:02 »
SPAUSDINTINES PLOKSHTES GAMYBA NAMU SALYGOMIS

Variantas numeris 1

Plokshtes gaminti nereikia!

Perkate universalia spausdintine plokshte (pvz. Lemonoje, detales kodas - H25PRO50), sudedate detales i skylutes mazhdaug pagal pateikta ishdestymo schema ir sulituojate. Reikalingas detaliu kojytes sujungiate laidais arba uzhlituodami tarpus tarp skyluchiu.

Variantas numeris 2 (neturintiems lazerinio printerio)

1. Atsispausdiname iprasta spausdintines plokshtes varianta betkokiu printeriu.
2. Lipnios, permatomos juostos pagalba priklijuojame atspausdinta maketa prie vienpusio getinakso ar stiklotekstolito (pvz. Lemonoje, detales kodas - CEM1.5/100X160V)
3. Apvaliu kaltu ir plaktuku (arba yla) pasizhymime visas skylutes.
4. Atklijuojame spausdinta maketa ir pasidedame shalia.
5. Paimame vandeniui atsparu PLONA markeri ir ranka perpieshiame visus takelius.
6. Pamerkiame i gelezhies chlorido (Lemona - GEL/CHL/125) tirpala ir laukiam kol ishsiesdins nereikalingas varis.
7. Gelezhies chlorida ishpilame arba pasiliekame kitam kartui puses litro talpoje (stiklainyje).
8. Plokshte nuplauname ir nuvalome markeri acetonu ar kitu skiedikliu/valikliu.
9. 1mm (arba plonesniu) grazhteliu pragrezhiame visas skylutes.
10. Lituojame  

Variantas numeris 3 (turintiems lazerini printeri)

1. Atsispausdinate plokshtes maketa parengta lazeriniam printeriui (veidrodinis atvaizdas) ant blizgaus popieriaus, geriausia imanoma kokybe. Puikiai tinka RASHALINIO printerio fotopopierius (ash net neturejau po ranka blizgaus, tad spausdinau ant matinio - tiesiog paskui ilgiau reikejo mirkyti ir krapshtyti).
2. Pridedame atspausdintaja puse prie getinakso/stiklotekstolito variuotos puses (pvz. Lemonoje, detales kodas - CEM1.5/100X160V) ir prispaudzhiame karshtu (maksimalus lygis) lygintuvu. Palaikome 10s, kad priliptu, tuomet uzhdedam taip, kad tikrai gerai prisispaustu ir palaikom dar kokia minute. Tuomet dar galiuku lygintuvo gerai prasieinam per visa plokshte. Viso taip kankinames kokias 2-3 minutes.
3. Plokshte kartu su popieriu dedam i kambario temp. vandeni ir paliekame mirkti valandai ar porai valandu.
4. Po vandens srove nulupinejam popieriu (labai kruopshchiai, kad jo neliktu, galima stipriai trinti pirshtu, bet ne nagu).
5. Jei koks takelis ar 2 pratruko - pataisom tas vietas vandeniui atspariu markeriu.
6. Pamerkiame i gelezhies chlorido (Lemona - GEL/CHL/125) tirpala ir laukiam kol ishsiesdins nereikalingas varis.
7. Gelezhies chlorida ishpilame arba pasiliekame kitam kartui puses litro talpoje (stiklainyje).
8. Plokshte nuplauname ir nuvalome toneri acetonu ar kitu skiedikliu/valikliu.
9. 1mm (arba plonesniu) grazhteliu pragrezhiame visas skylutes.
10. Lituojame  

Variantas numeris 4 (fotografinis metodas)

Tie kas turite viska ko reikia - ir taip mokate :) Jei nemokate - aprashyma rasite Google. Procesas beveik atitinka nuotrauku daryma pozityviuoju kontaktiniu budu (plokshtes maketas spausdinamas ant permatomos pleveles).

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #13 Įrašytas: 2007.09.23-19:07:13 »
Ash dariau su lazeriniu printeriu... bet ankschiau ir kitus variantus bandzhiau ishskyrus fotografini, tai ka zhinau - tuom pasidalinau.

quicker

  • Svečias
Re: Quick Chrono pasidaryk pats + PIC16F84A HEX &a
« Atsakymas #14 Įrašytas: 2007.09.23-19:09:23 »
Tiesa, jei kam labai reikes, tai mikrokontroleri galiu uzprogramuot viena kita ir perduot per kokias varzybas ar pan.

 

+-Naujausi įrašai

Europos HFT čempionatas, 6-8 September 2024 / Hungary / Debrecen by Aidas
2024.04.16-22:16:19

Optikos pirkimas iš JAV by Kalibrgun.
2024.04.14-08:41:26

Varžybos Lenkijoje by Andzhejka
2024.04.12-23:39:27

Gamo CFX.4,5mm.PARDUOTAS by valakas
2024.04.12-19:56:29

Ieškau laikiklio 35mm diametro by Darenas
2024.04.09-09:25:47

Šaudykla Kaišiadoryse by www.vaidodazasvydis.lt
2024.04.07-19:00:50

Weihrauch 97k su Leapers 8-32 56 optika by liova
2024.04.05-11:51:32

HW 97K by Nikas
2024.04.04-11:05:52

Kova su kenkėjais by liova
2024.04.03-04:38:34

Lietuvos FT ir HFT šaudymo į lauko taikinius varžybos(treniruočių formatu)bal.28 by SergoT
2024.03.31-20:04:47

Powered by EzPortal