PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Digitaluhr mit Atmega8 und externem 32768Hz Takt



MiniManDD
19.03.2007, 17:33
Hallo,

ich bin gerade dabei eine Digitaluhr mit Hilfe eines Atmega8 und einem externem 32768Hz Takt zu entwickeln, die Hardware ist schon ferig!!! Sie ist mit 4 Siebensegmentanzeigen ausgestattet und 4 Tastern.
die Hardware ist auch 100% funktionstüchtig.

Soweit so gut,jetzt zu meinem Problem:

Ich soll(muss) dazu ein Programm im AVR Studio entwickeln. Mein Problem dabei ist: Wie bekomme ich den Sekunden Takt zustande????

Wäre toll,wen mir jemand dabei helfen könnte!!!

Danke schon im voraus!!!

MiniMan

SprinterSB
19.03.2007, 18:28
Den Timer 2 kann man mi asynchronen Mode betreiben und extern durch die 32768 Hz takten lassen.

Die 32kHz als Systemtakt zu verwenden ist nicht so sinnig, weil die Anzeige bestimmt geMUXt wird...

Beschreibung für Timer2 findest du im Handbuch und es wird besprochen (allerdings in C)

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=28820

Was die internen Kondensatoren angeht gibt's AKAIK ein Erratum, so daß du evtl. externe nehmen musst.

MiniManDD
19.03.2007, 19:07
Danke erstma für deine Antwort!

Ich muss das aber in Assembler programmieren und nicht mit Borland Builder...

ja ich muss das auch mit dem timer 2 machen... kann mir jemand ein stück quelltext geben für die sekundenerzeugung???



.def temp1=r16
.def temp2=r17
.def Sekunden=r18
.def Minuten=r19
.def Stunden=r20

rjmp Start ;Sprung zum Programmanfang
reti ;Interruptvektortabelle
reti
rjmp timer2_overflow ;Timer Overflow Handler
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
Setup:
ldi temp1, 0b00011110
out DDRC, temp1
ldi temp1, 0b01111111
out DDRD, temp1
in temp1,ASSR
ori temp1,0b00001000
out ASSR,temp1
ret

Start:

ldi temp1, LOW(RAMEND)
out SPL, temp1
ldi temp1, HIGH(RAMEND)
out SPH, temp1

rcall Setup

ldi temp1,0b00000101 ;(32768/128)/256=1 Vorteiler
out TCCR2,temp1

ldi temp1,0b01000000
out TIMSK,temp1

sei

LOOP:

timer2_overflow:

push temp2
inc Sekunden
cpi Sekunden,60



brne Ausgabe
clr Sekunden

inc Minuten
cpi Minuten,60
brne Ausgabe
clr Minuten

inc Stunden
cpi Stunden,24
brne Ausgabe
clr Stunden
Ausgabe:
;ldi temp1, 0b11111111
;out portd, temp1
;com temp1
;reti
mov temp2,Sekunden
lsr temp2
brcs AZE
rcall a
rcall A4

rjmp end_isr
AZE: rcall a
rcall A3


end_isr:
pop temp2
reti
rjmp LOOP

a: ldi temp1, 0b10000001 ;Zeige Ziffer 0
out PortD, temp1
ret

b: ldi temp1, 0b11001111 ;Zeige Ziffer 1
out PortD, temp1
ret

c: ldi temp1, 0b10010010 ;Zeige Ziffer 2
out PortD, temp1
ret

d: ldi temp1, 0b10000110 ;Zeige Ziffer 3
out PortD, temp1
ret

e: ldi temp1, 0b11001100 ;Zeige Ziffer 4
out PortD, temp1
ret

f: ldi temp1, 0b11000100 ;Zeige Ziffer 5
out PortD, temp1
ret

g: ldi temp1, 0b11000000 ;Zeige Ziffer 6
out PortD, temp1
ret

h: ldi temp1, 0b10001111 ;Zeige Ziffer 7
out PortD, temp1
ret

i: ldi temp1, 0b10000000 ;Zeige Ziffer 8
out PortD, temp1
ret

j: ldi temp1, 0b10000100 ;Zeige Ziffer 9
out PortD, temp1
ret

A1: ldi temp1, 0b00000010 ;Anzeige 1 an
out PortC, temp1
ret

A2: ldi temp1, 0b00000100 ;Anzeige 2 an
out PortC, temp1
ret

A3: ldi temp1, 0b00001000 ;Anzeige 3 an
out PortC, temp1
ret

A4: ldi temp1, 0b00010000 ;Anzeige 4 an
out PortC, temp1
ret

delete1:
ldi temp1, 0b11111111 ;Segmente loeschen
out PortD, temp1
ret
delete2:
ldi temp1, 0b00000000 ;Anzeige loeschen
out PortC, temp1
ret

.include "m8def.inc"



soweit bin ich jetzt.... was is falsch oder fehlt noch?????

wär echt ned,wenn mir jemand helfen kann...

THX

wkrug
25.03.2007, 17:32
Ich hab da ein paar unschönheiten und Fehler in deinem Code entdeckt und diesen berichtigt.

Die Main Routine läuft in den Interrupt, das kann so nicht sein.
Der Interrupt Vektor für den Timer Overflow ist an der falschen Stelle.
Im Interrupt wurde das SREG nicht gesichert.

So wie ich das sehe muss den Controller auf internen Oszillator gefused sein, oder er läuft auch mit 32kHz.

Simulieren ist hierbei etwas schwierig, du könntest für den Simulator eine Taktfrequenz von 32768 einstellen und lässt den Timer auf der Prozessortaktquelle laufen. Nur für den Simulator natürlich.


.include "m8def.inc"

.def temp1=r16
.def temp2=r17
.def Sekunden=r18
.def Minuten=r19
.def Stunden=r20

.cseg
.org 0
rjmp Start ;Sprung zum Programmanfang
reti ;Interruptvektortabelle
reti
reti
rjmp timer2_overflow ;Timer Overflow Handler
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti


Start:
ldi temp1, LOW(RAMEND)
out SPL, temp1
ldi temp1, HIGH(RAMEND)
out SPH, temp1
clr Sekunden ; Könnten ja Werte >60 drinstehen
clr Minuten
clr Stunden


rcall Setup

ldi temp1,0b00000101 ;(32768/128)/256=1 Vorteiler
out TCCR2,temp1

ldi temp1,0b01000000
out TIMSK,temp1

sei

LOOP:rjmp LOOP



Setup:
ldi temp1, 0b00011110
out DDRC, temp1
ldi temp1, 0b01111111
out DDRD, temp1
in temp1,ASSR
ori temp1,0b00001000
out ASSR,temp1
ret



timer2_overflow:

push temp2
in temp2,SREG
push temp2
inc Sekunden
cpi Sekunden,60



brne Ausgabe
clr Sekunden

inc Minuten
cpi Minuten,60
brne Ausgabe
clr Minuten

inc Stunden
cpi Stunden,24
brne Ausgabe
clr Stunden
Ausgabe:
;ldi temp1, 0b11111111
;out portd, temp1
;com temp1
;reti
mov temp2,Sekunden
lsr temp2
brcs AZE
rcall a
rcall A4

rjmp end_isr
AZE: rcall a
rcall A3


end_isr:
pop temp2
out SREG,temp2
pop temp2
reti


a: ldi temp1, 0b10000001 ;Zeige Ziffer 0
out PortD, temp1
ret

b: ldi temp1, 0b11001111 ;Zeige Ziffer 1
out PortD, temp1
ret

c: ldi temp1, 0b10010010 ;Zeige Ziffer 2
out PortD, temp1
ret

d: ldi temp1, 0b10000110 ;Zeige Ziffer 3
out PortD, temp1
ret

e: ldi temp1, 0b11001100 ;Zeige Ziffer 4
out PortD, temp1
ret

f: ldi temp1, 0b11000100 ;Zeige Ziffer 5
out PortD, temp1
ret

g: ldi temp1, 0b11000000 ;Zeige Ziffer 6
out PortD, temp1
ret

h: ldi temp1, 0b10001111 ;Zeige Ziffer 7
out PortD, temp1
ret

i: ldi temp1, 0b10000000 ;Zeige Ziffer 8
out PortD, temp1
ret

j: ldi temp1, 0b10000100 ;Zeige Ziffer 9
out PortD, temp1
ret

A1: ldi temp1, 0b00000010 ;Anzeige 1 an
out PortC, temp1
ret

A2: ldi temp1, 0b00000100 ;Anzeige 2 an
out PortC, temp1
ret

A3: ldi temp1, 0b00001000 ;Anzeige 3 an
out PortC, temp1
ret

A4: ldi temp1, 0b00010000 ;Anzeige 4 an
out PortC, temp1
ret

delete1:
ldi temp1, 0b11111111 ;Segmente loeschen
out PortD, temp1
ret
delete2:
ldi temp1, 0b00000000 ;Anzeige loeschen
out PortC, temp1
ret

MiniManDD
26.03.2007, 15:33
danke erstmal für deine Hilfe!!!

kann mir jemand noch weiter helfen und mir den quellcode schreiben bzw. geben. am besten nicht nur für den sekunden takt, sondern gleich den quellcode,welcher eine minute oder mehr zählen kann???? das wär echt super nett!!!! DANKE!!!

wkrug
26.03.2007, 19:30
am besten nicht nur für den sekunden takt, sondern gleich den quellcode,welcher eine minute oder mehr zählen kann????
Ähhh, das versteh ich jetzt nicht ?
Die überläufe für Sekunden und Minuten sind doch in deinem Code schon enthalten.
Wenn Du die Sekunden nicht anzeigst, sonder nur weiterzählst hast Du doch genau den Effekt.
Wenn du den Code erweiterst kannst Du auch Tage, Wochen und Monate anzeigen, wenn Du lustig bist.
Das man jemandem bei einem Problem hilft, dafür ist ein Forum da.
Das ein Anderer einem seine Hausaufgaben macht ist meiner Meinung nach nicht Sinn der Sache. Du sollst ja auch was dabei lernen !