PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Digitaluhr mit Segmentanzeigen



Superfreak
10.03.2008, 09:37
hi leute

habe eine frage, wollte eine digital uhr bauen mit dem IC4026, aber habe keine genaue idee wie ich das realisieren soll.(bin sozusagen noch anfänge in dem Gebiet)
Oder ich wollte dies mit einem µC aufbauen
hat jemand einen schaltplan oder ähnliches bzw Links

BurningWave
10.03.2008, 17:42
Hallo Superfreak,

ich würde die Uhr mit einem Microcontroller zb. mit einem AtMega8 von ATMEL bauen. Als Anzeige könnte man auch ein LCD-Display mit 1X8 Zeichen verwenden. Das ist einfacher, wie wenn man eine 7-Segment-Anzeige nimmt, weil man bei der noch einen Decoder-IC braucht. Zudem kann man mit einem LCD-Display noch andere Sachen, wie nur Zahlen anzeigen. Also die Uhr kann noch erweitert werden.

mfg _R2D2

karlmonster
10.03.2008, 18:33
ich würde noch gerne wissen:
welche genauigkeit ? mit oder ohne sekunden ?
ansonsten empfehle ich die uhr mit einem DCF77 Empfängermodul verbinden ansonsten kommst du in teufelsküche. Hier vll noch ein nützlicher link.
http://www.sprut.de/electronic/pic/programm/lcduhr/lcduhr.html
hier zwar für PIC µC aber .....
naja da gehts dann los mit angleichen etc. (ohne DCF77) sonst kann man einfach das decodierte DCF77 verwenden ansonsten muss dass ein uhrenquarz übernehmen =)

hoffe geholfen zu habe

greetz

Besserwessi
10.03.2008, 18:36
Wenn man ohnehin schon einen Controller nimmt, braucht man keinen Decoder mehr, das kann der Controller übernehmen. Eine Uhr rein mit Logicbausteinen ist nicht mehr zeitgemäß.

LCDs brauchten aber normalerweise deutlich weniger Strom als LEDs.

BurningWave
10.03.2008, 19:47
Wenn man den Controller mit externem Quarz betreibt, sind die Warte-Funktionen schon ziemlich genau.

izaseba
10.03.2008, 19:56
Wenn man den Controller mit externem Quarz betreibt, sind die Warte-Funktionen schon ziemlich genau.

Kannst Du das mal erklären?

karlmonster
10.03.2008, 20:09
auch wenn ich nicht gemeint bin:

mittels externem quarz wird die uhr genauer als mit rc-glied takt oder mit internem taktgeber (gibts sowas bei AVR ich bevorzuge PIC)

der quarz wird zumeist soweit kein quarzoszillator mittels 2er Kondensatoren angeschlossen. der eine ist ein drehkondi um eine abweichung von der normfrequenz kompensieren zu können. ich denke mit einem normalen qaurz dürften 10 Sek abweichung pro Tag kein seltener wert sein. eher mehr .
mit warte ist folgendes gemeint:
ein uhrenprogramm wird folgendermasen aufgebaut
z.B.

stunde=0
minute=0
sekunde=0

dann warte 1 Sek

dann erhöhe sekunde um 1

usw
usw

so geht das im grunde
und es geht um diese sekunde warten die ja entscheidend über die genauigkeit der uhr ist.

eine sekunde wird meistens folgendermassen realisiert:
beim PIC µC gibt es einen befehl namens NOP (no operation) = 1 µSec garnix tun ==> sooft bis eine Sekunde vergangen ist. bei 4,0000 Mhz Quarz dauert eine nop genau 1µSec bei 4,032 Mhz ein bisschen länger. und im programm sagt mann wiederhole xxx mal nop ==> 1Sek vergangen
wenn aber nop xxx mal wiederholt wird eine nop jedoch 1,34µSec dauert wird die sekunde die gewartet wird länger !
ok sehr verwirrend aber das is das geheimnis der warte-funktionen

greetz

FuX
10.03.2008, 20:10
Nimm doch einen Microcontroller und das RN DigiBoard

https://www.roboternetz.de/phpBB2/viewtopic.php?t=3234

karlmonster
10.03.2008, 20:11
uups wenn die frequenz höher ist dauert die µSec natürlich nicht länger sondern ist kürzer

izaseba
10.03.2008, 20:18
eine sekunde wird meistens folgendermassen realisiert:
beim PIC µC gibt es einen befehl namens NOP (no operation) = 1 µSec garnix tun ==> sooft bis eine Sekunde vergangen ist. bei 4,0000 Mhz Quarz dauert eine nop genau 1µSec bei 4,032 Mhz ein bisschen länger. und im programm sagt mann wiederhole xxx mal nop ==> 1Sek vergangen
wenn aber nop xxx mal wiederholt wird eine nop jedoch 1,34µSec dauert wird die sekunde die gewartet wird länger !
ok sehr verwirrend aber das is das geheimnis der warte-funktionen


Und wann soll die Zeit ausgegeben werden, wenn Du nur noch wartest ?

Superfreak
10.03.2008, 20:39
das ist ja super danke =)
hätte nmicht gedacht das soviele posten

ja mit dem pic kenn ich mich wa saus und auch mit atmegas

aber ich sollte das via Segmentanzeige machen...
da muss man doch irgendwas mit dem übernahme takt beachten und man kann doch auch dden internen ad/da wandler benutzen?

aber kann mir das immer noch nciht so genau vorstellen wie ich das machen kann.

hoffe ihr könnt mir auch hier helfen

woltle das dann schon mit 6 Segmentanzeigen machen, sprich mit Sekunden

karlmonster
10.03.2008, 20:43
@izaseba: das muss man halt in seine nop schleifen einrechen die zeit die benötigt wird. das dürfte das geringst problem sein
wöfür denn AD/DA verwenden welches signal willst du in mindestens 255 abstufung einlesen? kapier ich ned sry

Superfreak
10.03.2008, 20:47
wie gesagt habe noch keine große ahnung davon..

wollte das am besten einfach un simple aufbauen =)

izaseba
10.03.2008, 20:55
@izaseba: das muss man halt in seine nop schleifen einrechen die zeit die benötigt wird. das dürfte das geringst problem sein
wöfür denn AD/DA verwenden welches signal willst du in mindestens 255 abstufung einlesen? kapier ich ned sry

Was gibt es hier nicht zu kapieren ?
Mittels Warteschleifen die Zeit zu berechnen ist die blödeste Idee, die ich je in diesem Forum gelesen habe...
Wie willst Du alles in deine nops einrechnen ?
Was ist, wenn ich Sekunden inkrementtieren will, wieviele nops muß ich weglassen ? und wenn es 60 Sekunden geworden sind muß ich die Minuten hochzählen, wieviele nops weg ? und bei Stunden ? und die Anzeige ? womöglich multiplexen, na immer noch so eine einfache Rechnung ?

Denk mal drüber nach ;-)

Gruß Sebastian

Superfreak
10.03.2008, 21:01
ja danke stimmt, aber wie kann ich die zeit einstellen?

wenn man zum beispiel 18:45 hat... wie kann ich die einstellen?

izaseba
10.03.2008, 21:13
Superfreak,
hier (http://www.sprut.de/electronic/pic/programm/led.htm) hättest Du z.B. ein Beispiel, wie man 7 Segment Anzeigen an einem µC anschließen kann.

Wie stellt man die Zeit ? lass mal Dein Phantasie entscheiden, ein paar Tasten, UART, Fernbedienung ?

Gruß Sebastian

karlmonster
10.03.2008, 21:21
ich kapier ned was der mit nem AD machen will.

verrat mir was besseres als nop schleifen ? ich bin gespannt. arbeite seit über 10 jahren mit PICs.
übrigens die zeiten die befehle in anspruch nehmen stehen immer im datenblatt.
bei 4,00 Mhz braucht jeder befehl genau 1µSec nur bestimmte skip und goto/call befehle 2µSec. => kuckstu in datenblatt dann du finden ;)
und was willst du multiplexen? du weisst schon was multiplexen ist oder ?
als mathematische anwendun kommt nur dynaminsches multiplexen in frage und davon hab ich nie geredet:
http://de.wikipedia.org/wiki/Dynamisches_Multiplexen
wovon ich rede:
http://de.wikipedia.org/wiki/Multiplextechnik
hier geht es darum, dass viele pins verschwendet werden bzw garnicht vorhanden sind um ein uhr mit mind 4 7-segmentanzeigen anzusteuern:
4*7 = 28 pins. bei gutem multiplexing kommt man auch mit 2 pins aus ;D

denk mal drüber nach ;D

karlmonster
10.03.2008, 21:24
@superfreak:
per interrupt. wenn der auslöst werden die taster zum erhöhen/erniedrigen der variablen abgerufen und die variablen neu gesezt.
übrigend die vergangene zeit während der interrupt ausgelöst wurde muss mitgespeichert werden und später einberechnet werden

izaseba
10.03.2008, 21:35
verrat mir was besseres als nop schleifen ? ich bin gespannt.
Das magische Wort lautet Timerinterupt im asynchronem Modus mit einem Uhrenquarz als Taktgeber...

Sollte man vielleicht was von gehört haben, wenn man 10 Jahre mit einem µC arbeitet.


und was willst du multiplexen? du weisst schon was multiplexen ist oder ?

Ich weiß was Multiplexen heißt, zumindest bei Diesem Thema, wir reden immernoch von einer Uhr mit 7 Segment Anzeigen, oder ?

Und Dattenblatt lesen kann ich, brauchst Dir keine Gedanken machen,
mach Dich nicht lächerlich...


Gruß Sebastian

Superfreak
10.03.2008, 21:36
hmm .. ich weiß nicht...

muss mich mal rein arbeiten... wie das geht... jemand ein beispiel^^

wiegesagt bin ein anfänger^^

Superfreak
11.03.2008, 13:13
kann mir jemand das programm posten den rest, hardware mäßig schafe ich schon

karlmonster
11.03.2008, 13:45
hmm ich kann dir das nur für n PIC und LCD geben. aber im anschluss dran ist noch was fürs multiplexen:



list p=16f628
;************************************************* *************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 -
;* 1 -
;* 2 -
;* 3 -
;* 4 -
;* 5 -
;* 6 -
;* 7 -
;*
;* PORTB: 0 > LCD Display E
;* 1 < Rücksetz_Taster für Uhrzeit
;* 2 > LCD Display RS
;* 3 > LCD Display R/W
;* 4 - LCD Display D4
;* 5 - LCD Display D5
;* 6 - LCD Display D6
;* 7 - LCD Display D7
;*
;************************************************* *************
;
; sprut (zero) Bredendiek 02/2004 mod 06/2005
;
; Uhr mit LCD-Display
; Anzeige hh:mm:ss
; Takt : 32768Hz
;
;
;************************************************* *************
; Includedatei für den 16F84 einbinden

#include <P16f628.INC>

ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES

; Configuration festlegen
; 32768Hz: Power on Timer, kein Watchdog, LP-Oscillator

__CONFIG _PWRTE_ON & _WDT_OFF & _LP_OSC & _BODEN_OFF & _LVP_OFF

;************************************************* *************
; Konstanten

; Variablennamen vergeben

w_copy Equ 0x20 ; Backup für Akkuregister
s_copy Equ 0x21 ; Backup für Statusregister

Flags Equ 0x22
loops equ 0x23 ; timer für wait
LcdStatus equ 0x24 ;
LcdDaten equ 0x25 ;
ES equ 0x26 ; Einer Sekunden
ZS equ 0x27 ; Zehner Sekunden
EM equ 0x28 ; Einer Minuten
ZM equ 0x29 ; Zehner Minuten
EH equ 0x2A ; Einer Stunden
ZH equ 0x2B ; Zehner Stunden

; für LCD-Pins
#define LcdE PORTB,0 ; enable Lcd
#define LcdRw PORTB,3 ; read Lcd
#define LcdRs PORTB,2 ; Daten Lcd (nicht control)
#define LcdPort PORTB ; Datenbus des LCD (obere 4 Bit)

#define neu Flags,0

Ini_con Equ B'00000000' ; TMR0 -> Interupt disable
Ini_opt Equ B'00000010' ; pull-up

;************************************************* *************
; los gehts mit dem Programm

org 0
goto Init

;************************************************* *************
; die Interuptserviceroutine

org 4
intvec
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
bcf STATUS, RP0 ; Bank 0
movwf s_copy ;

; Intrupt servic routine
Int_serv
bsf neu

incf ES, f ; 1 Sekunden erhöhen
movlw D'10'
subwf ES, w
btfss STATUS, Z
goto Int_end ; 1 Sekunden <> 10

clrf ES
incf ZS, f ; 10 Sekunden erhöhen
movlw D'6'
subwf ZS, w
btfss STATUS, Z
goto Int_end ; 10 Sekunden <> 6

clrf ZS
incf EM, f ; 1 Minuten erhöhen
movlw D'10'
subwf EM, w
btfss STATUS, Z
goto Int_end ; 1 Minuten <> 10

clrf EM
incf ZM, f ; 10 Minuten erhöhen
movlw D'6'
subwf ZM, w
btfss STATUS, Z
goto Int_end ; 10 Minuten <> 6

clrf ZM
incf EH, f ; 1 Stunden erhöhen
movlw D'10'
subwf EH, w
btfss STATUS, Z
goto Test24 ; 1 Stunden <> 10

clrf EH
incf ZH, f ; 10 Stunden erhöhen
goto Int_end

Test24
movlw D'2'
subwf ZH, w
btfss STATUS, Z
goto Int_end ; 10 Stunden <> 2
movlw D'4'
subwf EH, w
btfss STATUS, Z
goto Int_end ; 1 Stunden <> 4
clrf EH ; Mitternacht
clrf ZH
goto Int_end

Int_end
bcf INTCON, T0IF ; Interupt-Flag löschen

swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
retfie

;************************************************* *************

; Port B auf Ausgabe stellen

Init bsf STATUS, RP0 ; Bank 1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'00000010' ; PortB alle outputs außer RB1
movwf TRISB
bcf STATUS, RP0 ; Bank 0
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON

;Display initialisieren
call InitLcd

clrf Flags

; Zeit 0 einstellen
call Zeit_Null

; 1 Hz-Timer-Interupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10000100' ; internen Takt zählen, Vorteiler zum Timer0, 32:1
movwf OPTION_REG
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf TMR0 ; ((32,768 kHz : 32 ): 256 = 1 Hz)

bsf INTCON, T0IE ; Timer0 interupt erlauben
bsf INTCON, GIE ; Interupt erlauben

loop
btfss PORTB,1
call Zeit_Null ; wenn Taste gedrückt, dann Zeit=0
btfss neu
goto loop ; eine Endlosschleife

; Kursor home
movlw B'10000000' ; 1. Zeile
call OutLcdControl

movfw ZH
iorlw '0' ;wandeln in ASCCI
call OutLcdDaten
movfw EH
iorlw '0' ;wandeln in ASCCI
call OutLcdDaten

movlw ':' ; Lücke
call OutLcdDaten

movfw ZM
iorlw '0' ;wandeln in ASCCI
call OutLcdDaten
movfw EM
iorlw '0' ;wandeln in ASCCI
call OutLcdDaten

movlw ':' ; Lücke
call OutLcdDaten

movfw ZS
iorlw '0' ;wandeln in ASCCI
call OutLcdDaten
movfw ES
iorlw '0' ;wandeln in ASCCI
call OutLcdDaten

bcf neu
goto loop ; eine Endlosschleife

Zeit_Null
clrf TMR0
bsf neu
clrf ES
clrf ZS
clrf EM
clrf ZM
clrf EH
clrf ZH
return


;************************************************* ****
;+++LCD-Routinen**************************************
;************************************************* ****
;LCD initialisieren

InitLcd
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf loops
call WAIT

movlw B'00110000' ; 1
movwf LcdPort
bsf LcdE
nop
bcf LcdE

movlw D'50' ; 50 ms Pause
movwf loops
call WAIT

movlw B'00110000' ; 2
call Control8Bit
movlw B'00110000' ; 3
call Control8Bit
movlw B'00100000' ; 4
call Control8Bit

movlw B'00000001' ; löschen und cusor home
call OutLcdControl
movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7
call OutLcdControl
movlw B'00001000' ; 6 display off
call OutLcdControl
movlw B'00000110' ; 7 entry mode, increment, disable display-shift
call OutLcdControl
movlw B'00000011' ; 8 cursor home, cursor home
call OutLcdControl
movlw B'00001100' ; 9 display on, Kursor aus , Blinken aus
call OutLcdControl
return

;************************************************* ****
; ein Steuerbyte 8-bittig übertragen
Control8Bit
movwf LcdPort
bsf LcdE
nop
bcf LcdE
movlw D'10'
movwf loops
call WAIT
return

;************************************************* ****
; darauf warten, daß das Display bereit zur Datenannahme ist
LcdBusy
bsf STATUS, RP0 ; make Port B4..7 input
movlw B'11110000'
iorwf TRISB, f
bcf STATUS, RP0
BusyLoop
bcf LcdRs
bsf LcdRw ; Lesen
bsf LcdE
nop
movf LcdPort, w
movwf LcdStatus
bcf LcdE
nop
bsf LcdE ; Enable
nop
bcf LcdE
btfsc LcdStatus, 7 ; teste bit 7
goto BusyLoop
bcf LcdRw
bsf STATUS, RP0 ; make Port B4..7 output
movlw B'00001111'
andwf TRISB, f
bcf STATUS, RP0
return

;************************************************* ****
; aus W ein Byte mit Steuerdaten zum Display übertragen
OutLcdControl
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Hi-teil Daten schreiben
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
swapf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Lo-teil Daten schreiben
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
return

;************************************************* ****
; aus W ein Datenbyte zum Display übertragen
OutLcdDaten
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Hi-teil Daten schreiben
bsf LcdRs ; Daten
bsf LcdE ; Enable LcdBus
nop
bcf LcdE ; Disable LcdBus
swapf LcdDaten, w
andlw H'F0'
movwf LcdPort ; Lo-teil Daten schreiben
bsf LcdRs ; Daten
bsf LcdE
nop
bcf LcdE ; Disable LcdBus
bcf LcdRs ;
return

;************************************************* ****
;Zeitverzögerung um loops * 1 ms
; 32768Hz externer Takt bedeutet ca 8 kHz interner Takt
; also dauert 1 ms etwa 8 Befehle

WAIT
top
nop
nop
nop
nop
nop
decfsz loops, F ; outer loops complete?
goto top ; no, go again
retlw 0 ; yes, return from WAIT

;************************************************* ****

end





hier multiplexen:


list p=16f84
;************************************************* *************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 Ziffer -----------------------------------------------------+
;* 1 Ziffer -------------------------------------+ I
;* 2 Ziffer ---------------------+ I I
;* 3 Ziffer -----+ I I I
;* 4 Eingang I I I I
;* PORTB: 0 Segment B AAAAA AAAAA AAAAA AAAAA
;* 1 Segment F F B F B F B F B
;* 2 Segment A F B F B F B F B
;* 3 Segment G GGGGG GGGGG GGGGG GGGGG
;* 4 Segment H E C E C E C E C
;* 5 Segment C E C E C E C E C
;* 6 Segment E DDDDD HH DDDDD HH DDDDD HH DDDDD HH
;* 7 Segment D
;*
;************************************************* *************
;
; sprut (zero) Bredendiek 06/2000 (mod. 15.01.2002)
;
; 4-stellige LED-Anzeige
;
; Tektquelle: 4 MHz
; es wird probehalber die Zahl "1234" angezeigt
;
;************************************************* *************
; Includedatei für den 16F84 einbinden

#include <P16f84.INC>


; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator

__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC

;************************************************* *************

; Variablennamen vergeben

w_copy Equ 0x20 ; Backup für Akkuregister
s_copy Equ 0x21 ; Backup für Statusregister
Ziffer1 Equ 0x22 ; Wert des LSD
Ziffer2 Equ 0x23 ; Wert der zweitkleinsten Stelle
Ziffer3 Equ 0x24 ; Wert der zweitgrößten Stelle
Ziffer4 Equ 0x25 ; Wert des MSD
Digit Equ 0x26 ; Ziffernzähler
ar Equ 0x27

;************************************************* *************
; los gehts mit dem Programm

org 0
goto Init

;************************************************* *************
; die Interuptserviceroutine

org 4
intvec bcf INTCON, GIE ; disable Interupt

movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;

movlw D'131' ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
movwf TMR0

; Intrupt servic routine
Int_serv

bsf PORTA, 0 ; Ziffer1 aus
bsf PORTA, 1 ; Ziffer2 aus
bsf PORTA, 2 ; Ziffer3 aus
bsf PORTA, 3 ; Ziffer4 aus

decf Digit,f ; Ziffernzähler verringern
;Digit=4: anzeigen Ziffer 4
;Digit=3: anzeigen Ziffer 3
;Digit=2: anzeigen Ziffer 2
;Digit=1: anzeigen Ziffer 1
;Digit=0: andere Aktionen, keine Anzeige

btfsc STATUS, Z
goto Int_0 ; Z-Flag=1 ergo Digit=0
movfw Digit
movwf ar
decf ar, f
btfsc STATUS, Z
goto Int_1 ; Digit=1
decf ar, f
btfsc STATUS, Z
goto Int_2 ; Digit=2
decf ar, f
btfsc STATUS, Z
goto Int_3 ; Digit=3
goto Int_4 ; Digit=4

Int_0
movlw 5
movwf Digit
goto Int_end

Int_1
movfw Ziffer1 ; Wert der 1. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bcf PORTA, 0 ; 1. Ziffer einschalten
goto Int_end

Int_2
movfw Ziffer2 ; Wert der 2. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bcf PORTA, 1 ; 2. Ziffer einschalten
goto Int_end

Int_3
movfw Ziffer3 ; Wert der 3. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bcf PORTA, 2 ; 3. Ziffer einschalten
goto Int_end

Int_4
movfw Ziffer4 ; Wert der 4. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bcf PORTA, 3 ; 4. Ziffer einschalten
goto Int_end


Int_end swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w

bcf INTCON, T0IF ; Interupt-Flag löschen
bsf INTCON, GIE ; enable Interupt

retfie

; 7-Segment-Tabelle
Segmente
addwf PCL, f
retlw B'00011000' ; 0
retlw B'11011110' ; 1
retlw B'00110010' ; 2
retlw B'01010010' ; 3
retlw B'11010100' ; 4
retlw B'01010001' ; 5
retlw B'00010001' ; 6
retlw B'11011010' ; 7
retlw B'00010000' ; 8
retlw B'01010000' ; 9

;************************************************* *************

; Port A/B auf Ausgabe stellen

Init
movlw B'11111111'
movwf PORTA
movwf PORTB ; Anzeige dunkel
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11110000' ; PortA RA0-RA3 output
movwf TRISA
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten


; eine beliebige Zahl einstellen (hier: 1234)
movlw 4
movwf Ziffer1
movlw 3
movwf Ziffer2
movlw 2
movwf Ziffer3
movlw 1
movwf Ziffer4

movlw 5
movwf Digit

; 250 Hz-Timer-Interupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10000100' ; internen Takt zählen, Vorteiler zum Timer0, 32:1
movwf OPTION_REG
movlw D'131' ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
movwf TMR0
bsf INTCON, T0IE ; Timer0 interupt erlauben
bsf INTCON, GIE ; Interupt erlauben

loop goto loop ; eine Endlosschleife

;************************************************* *********


end




ich bezweifle, dasses hilfreich ist aber wie du meinst

karlmonster
11.03.2008, 13:48
neee du hab auch ned vor dich lächerlich zu machen. aber timer interrupts & anfänger ? naja ok ich muss zugeben damit hab ich noch nie gearbeitet. aber mei ....

izaseba
11.03.2008, 18:49
aber timer interrupts & anfänger ?

Warum nicht ?
Es gibt wohl nichts schlimmeres, als wenn man feststellt, die Uhr geht zwar, läuft aber Täglich 5 Minuten nach oder so.
Besser ist es ja von Anfang an richtig zu machen.

Jetzt stellt sich die Frage, was will Superfreak...

Ich würde das in kleinere Teilaufgaben zerschlagen:
1. 6 7-Segment Anzeigen an einem µC anschliessen und einfach nur eine Zahl darstellen lassen.

2. Die Zahl einfach mal inkrementieren und darstellen.

3. Eine Uhr implementieren und darstellen

4. Ein paar Tasten mit in das Projekt nehmen um die Uhr zu stellen.

So jetzt die Frage, welchen µC ? AVR oder PIC ?
Bei AVR könnte ich helfen, PIC leider nicht aber karlmonster sicherlich.
Welche Sprache ?

Das sind Sachen, die geklärt werden müssen...

Gruß Sebastian

Superfreak
10.04.2008, 15:44
habejetzt ein programm was ich verstehe

und nun brauch ich den schlatplan, welche ics bräuchte ich dafür am besten???

so habe jetzt ein programm was ich auch verstehe

;************************************************* **********
;* Name : UHR_Binär_BCD (für 4 MHz) Datum: 12.02.2006 *
;* -------- *
;* Funktion : Dimensionierbare Verzögerungsschleifen *
;* - Verzögerung_1s (lang) *
;* - Verzögerung_Xms (mittel), mit X *
;* X = 1,5,10,20,30,50,100,200,500 *
;* - Verzögerung_100us (kurz) *
;* Lernziele : Programmanalyse verschachtelter Algorithmen*
;* Hinleitung zu: -> Modularer Programmaufbau *
;* Autor : *
;************************************************* **********


LIST p=16F877A ; list directive to define processor
#include <p16F877A.inc>; processor specific variable defs
__CONFIG H'3F39' ; _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
ERRORLEVEL -302 ; unterdrücke Warnungen zur Bank-Auswahl
ERRORLEVEL -203

W_Kopie EQU H'35'
STATUS_Kopie EQU H'36'

Speicher EQU H'37'
Speicher_STD EQU H'38'
Speicher_Min EQU H'39'
Speicher_Sek EQU H'3A'


org 0x0000
goto Main_Start

org 0x0004

Interrupt_Beginn

btfss INTCON, T0IF
retfie
movwf W_Kopie
swapf STATUS,W
movwf STATUS_Kopie

Interrupt_Aktion

incf Speicher,F

_sekunden:

movlw D'20'
subwf Speicher,W
btfss STATUS,Z
goto weiter

incf Speicher_Sek,F
clrf Speicher

Abfrage_Sekunden

movlw D'60'
subwf Speicher_Sek,W
btfss STATUS,Z
goto weiter

;----------------------------- Minuten ---------------------------------------------------------

Minuten
clrf Speicher_Sek
incf Speicher_Min,F

Abfrage_Min
movlw D'60'
subwf Speicher_Min,W
btfss STATUS,Z
goto weiter

;----------------------------- Stunden -----------------------------------------------------

Stunden
clrf Speicher_Min
incf Speicher_STD,F
Abfrage_STD
movlw D'24'
subwf Speicher_STD,W
btfss STATUS,Z
goto weiter

clrf Speicher_STD

weiter:
movlw D'61'
movwf TMR0

Interrupt_Ende

bcf INTCON, T0IF
swapf STATUS_Kopie, W
movwf STATUS
swapf W_Kopie,F
swapf W_Kopie,W
retfie

Main_Start

bsf STATUS,RP0

clrf TRISD
clrf TRISC
clrf TRISB

movlw B'00000111'
movwf OPTION_REG

movlw B'10100000'
movwf INTCON


bcf STATUS,RP0

clrf Speicher
clrf Speicher_Sek
clrf Speicher_Min
clrf Speicher_STD
clrf PORTD
clrf PORTC
clrf PORTB

;bsf INTCON, T0IF
;bsf INTCON, GIE
;bsf INTCON, T0IE

movlw D'61'
movwf TMR0

;--------------------------------- Ausgabe -------------------------------------------------------------

Hauptprogramm

movf Speicher_Sek,W
call Hex_2_BCD__8bit
;swapf Zehner,W
;iorwf Einer,W
movwf PORTD

movf Speicher_Min,W
call Hex_2_BCD__8bit
movwf PORTC

movf Speicher_STD,W
call Hex_2_BCD__8bit
movwf PORTB

goto Hauptprogramm




END

Superfreak
10.04.2008, 17:26
hier ein möglicher schaltplan``??

das Programm funktioniert auch