PIC16F877A 6 digit klok

Alle vragen m.b.t digitale schakelingen m.b.v. losse i.c's
en oplossingen m.b.v. PIC processoren.
Plaats reactie
captain nguyen
Berichten: 40
Lid geworden op: za 26 jul 2008, 19:45

PIC16F877A 6 digit klok

Bericht door captain nguyen »

Ik ben aan het proberen om met enkele PIC16F877A een klok maken.

Zo'n schema is wat ik in gedachten hebt. (zie attach)
De transistor staan anders dan op schema staat.
En ik gebruik 4MHz krystal.
Ik gebruik 1 extra transistor omdat ik 12V source voor display nodig hebt.
Het is Common Anode 8V 20mA.
Ik gebruik 2N3904 NPN (T1)en 2N3906 PNP (T2). (zie attach)

Maar nu weet ik het subroutine niet om 6 digit aan te sturen, multiplexen, en knopjes die het moet weten waar die ervoor dient.

Deze code heb ik van sample gehaald en is voor LCD en 12 uren mode.

Zou iemand mij iets kunnen helpen of zo hoe dat eigelijk werkt met dit code.

Code: Selecteer alles

Device  16F877A
CONFIG XT_OSC , WDT_OFF , PWRTE_OFF , BODEN_OFF , LVP_OFF , WRTE_ON , CP_OFF , DEBUG_OFF 
ALL_DIGITAL         =   true  

****************************************************************************************
Symbol  Cu          =   PORTA.0
Symbol  noPower     =   PORTA.4
Symbol  digit1      =   PORTC.0 	' eerste digit (seconden)
Symbol  digit2      =   PORTC.1		' tweede digit (10 seconden)
Symbol  digit3      =   PORTC.2		' derde digit (minuten)
Symbol  digit4      =   PORTC.3		' vierde digit (10 minuten)
Symbol  digit5      =   PORTC.4		' vijfde digit (uren)
Symbol  digit6      =   PORTC.5		' zesde digit (10 uren)
Symbol  digita      =   PORTB.0		' segment a
Symbol  digitb      =   PORTB.1		' segment b
Symbol  digitc      =   PORTB.2		' segment c
Symbol  digitd      =   PORTB.3		' segment d
Symbol  digite      =   PORTB.4		' segment e
Symbol  digitf      =   PORTB.5		' segment f
Symbol  digitg      =   PORTB.6		' segment g
Symbol  display     =   PORTB

****************************************************************************************
        TRISA       =   %00111111
        TRISB       =   %00000000

****************************************************************************************
Dim hour    as     byte    		' Define hour variable
Dim dhour   as     byte    		' Define display hour variable
Dim minute  as     byte    		' Define minute variable
Dim second  as     byte    		' Define second variable
Dim ticks   as     byte    		' Define pieces of seconds variable
Dim update  as     byte    		' Define variable to indicate update of Digit
Dim i       as     byte    		' Debounce loop variable

****************************************************************************************
hour = 0        			' zet tijd naar 00:00:00
minute = 0
second = 0
ticks = 0
update = 1      			' forceer de eerste display
****************************************************************************************
mainloop:
        PORTA = 0       				' PORTA knoppen
        TRISB = $F0     				' alle knoppen aan

        ' Check any button pressed to set time
        If PORTA.0 = 0 Then incmin	' stel minuten op
        If PORTA.1 = 0 Then incmin      ' stel uren op

        ' controleer voor tijd om te update
Chkup:  If update = 1 Then
        	Cls   						' Clear screen

       		' Display tijd als hh:mm:ss
       		dhour = hour    			' verander uren 0 naar 23
       		If (hour // 23) = 0 Then
       			dhour = dhour + 23

       		update = 0      			' Screen updated
       	Endif

		Goto mainloop   
				
' Increment minuten
Incmin: minute = minute + 1
        If minute >= 60 Then
			minute = 0
        Endif
        Goto debounce

' Increment hours
Inchr:  hour = hour + 1
        If hour >= 24 Then
			hour = 0
        Endif
        Goto debounce

' Decrement minutes
Decmin: minute = minute - 1
        If minute >= 60 Then
			minute = 59
        Endif
        Goto debounce

' Decrement hours
Dechr:  hour = hour - 1
        If hour >= 24 Then
			hour = 23
        Endif

' Debounce and delay for 250ms
Debounce: 
        For i = 1 to 25
        	Delayms 10        				' 10ms at a time so no interrupts are lost
        Next

        Update = 1      				' Set to update screen

        Goto Chkup
********************************************************************************************************
Bijlagen
CLOCK.jpg
CLOCK.jpg (70.59 KiB) 12268 keer bekeken
lamp_source2.gif
lamp_source2.gif (2.26 KiB) 12268 keer bekeken
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5910
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Ik denk dat je in je tweede schema best pnp torren gebruikt.

Verder heeft picbasic zelf geen multiplex commando. Dit zal je zelf moeten schrijven. Met dig kan je makkelijk 1 digit uit een getal halen. Daarna schrijf je om de beurd alle digits weg.

Dan zou je zoiets kunnen maken:

Code: Selecteer alles

charuit:
        'Uitzoeken uitgangen port B bij bepaalde code
        '     a
        '   ####
        ' f #g # b
        '   ####
        ' e #  # c
        '   ####
        '    d
        'Symbool:   Code:   Bits:       Hex:
        '                   Pabcdefg    
        '0          00      x0000001    01
        '1          01      x1001111    4F
        '2          02      x0010010    12
        '3          03      x0000110    06
        '4          04      x1001100    4C
        '5          05      x0100100    24
        '6          06      x0100000    20
        '7          07      x0001111    0F
        '8          08      x0000000    00
        '9          09      x0000100    04     
        PORTB = LookUp digit , [$01, $4F, $12, $06, $4C, $24, $20, $0F, $00, $04] 
        PORTB.7 = point 
        DelayMS 2
        PORTB = 0       
    Return
    dispuit:
            digit = Dig teller, 0 'Digit 1 uit teller halen
            Digit1 = 0            'Digit 1 op display selecteren
            GoSub charuit         'Waarde naar digit schrijven
            Digit1 = 1            'Digit 1 terug uitzetten
            digit = Dig teller, 1
            Digit2 = 0
            GoSub charuit
            Digit2 = 1
            digit = Dig teller, 2
            Digit3 = 0
            GoSub charuit
            Digit3 = 1
            digit = Dig teller, 3
            Digit4 = 0
            GoSub charuit
            Digit4 = 1
    Return
Wil je dan het display aansturen zet je een getal in teller en doe je gosub dispuit. Die dispuit routine zal je wel min 50 keer per seconde moeten aanroepen. Anders gaat het display knipperren.
JARI NETWORKS
Berichten: 1697
Lid geworden op: zo 23 apr 2006, 19:01
Locatie: Hedalen. .. Noorwegen .. .. .. .. .. .. ...

Bericht door JARI NETWORKS »

zou ik dit niet als klok kunnen gebruiken om het weer te geven op een 4x20 lcd display ?
ik zou graag ook de datum en de maand er bij willen zetten
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5910
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Dat kan, maar met dit schema ga je een paar minuten afwijking per dag hebben.
JARI NETWORKS
Berichten: 1697
Lid geworden op: zo 23 apr 2006, 19:01
Locatie: Hedalen. .. Noorwegen .. .. .. .. .. .. ...

Bericht door JARI NETWORKS »

en dat is niet bij te stellen ?
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5910
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Door een real time clock te gebruiken. Die hun kristal is veel stabieler.
JARI NETWORKS
Berichten: 1697
Lid geworden op: zo 23 apr 2006, 19:01
Locatie: Hedalen. .. Noorwegen .. .. .. .. .. .. ...

Bericht door JARI NETWORKS »

ok, dus toch maar die ds3232 bestellen??
zal dan wel weer problemen krijgen met schema's en programma

maar dat zie ik dan wel weer
Gebruikersavatar
Stynus
Site Admin
Site Admin
Berichten: 5910
Lid geworden op: vr 16 mei 2003, 20:45
Locatie: Overpelt (België)
Contacteer:

Bericht door Stynus »

Die problemen mag je hier altijd op het forum posten (liefst wel in dat andere topic, want hier is het off-topic), we zullen je dan wel proberen verder te helpen.
Laatst gewijzigd door Stynus op ma 31 dec 2012, 11:41, 1 keer totaal gewijzigd.
JARI NETWORKS
Berichten: 1697
Lid geworden op: zo 23 apr 2006, 19:01
Locatie: Hedalen. .. Noorwegen .. .. .. .. .. .. ...

Bericht door JARI NETWORKS »

ok, dank je Stynus, en alvast een heel gelukkig nieuw jaar
Plaats reactie