kann mir jemand das programm posten den rest, hardware mäßig schafe ich schon
Druckbare Version
kann mir jemand das programm posten den rest, hardware mäßig schafe ich schon
hmm ich kann dir das nur für n PIC und LCD geben. aber im anschluss dran ist noch was fürs multiplexen:
hier multiplexen:Code: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
ich bezweifle, dasses hilfreich ist aber wie du meinstCode: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
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 ....
Warum nicht ?Zitat:
aber timer interrupts & anfänger ?
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
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
hier ein möglicher schaltplan``??
das Programm funktioniert auch