PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Existiert ein timer Interrupt?



Aileron
11.08.2007, 13:21
Hi leute,

ich programmiere schon etwas länger Assambler (mit dem 486 Befehlssatz) da gibt es so einen schönen Timer - Interrupt 8h, der wurde in schöner regelmäßigkeit ausgeführt, je nach wunsch 1 bis x mal in der Sekunde.

Jetzt will ich eine art Uhr basteln.
also der Atmel soll sich im normalen Geschäft darum kümmern das eine 4 mal 8 Segmentanzeige die aktuelle Uhrzeit anzeigt, aber einmal in der Sekunde (oder von mir aus auch öfters) will ich das der Chip einen Interrupt auslöst der dann die Zeit ein weiterstellt. (Währe höllisch praktisch, wie unter DOS)

Oder geht das nur klassich das ich selber die arbeitsschritte zählen muss und die Schleifen manuell einstellen muss?
Das Probelm ist, das ich diese Schleifen nie exakt eingestellt bekomme da ich nicht weiß welcher der Befehle 1 Tick brauch, welcher 2 Ticks braucht und ob der chip nicht einige Befehle zusammen ausführen kann.

Den Quarz kenne ich (16 MHz) aber muss ich Zeit wirklich manuell justieren oder kann ich nicht wirklich einen Timer interrupt einstellen.

Ich habe dazu im Netz leider nichts gefunden.

Währe nett wenn ihr mir einen Quelltextbeispiel geben könntet in dem ein Timer configuriert wird, so das ich weis wie oft er in einer Sekunde ausgeführt wird, das ich also anfangen kann zu zählen, um dann zum richtigen zeitpunkt die Sekunden vorzustellen.

mfg
Aileron

JanB
11.08.2007, 13:35
ich programmiere schon etwas länger Assambler
Dann bist du bestimmt auch gewohnt Datenblätter zu lesen...

Es gibt je nach AVR-Typ eine ganze Menge von Timer-Interupts,
und einen 1Hz-Int zu erzeugen ist kein Problem.

Ein Quelltextbeispiel macht ohne Angabe des konkreten AVR-Typs wenig Sinn.
Du findest jedoch im Datenblatt deines AVR auch Beispiele für die Timer-Programmierung.

www.atmel.com

Gruß Jan

PicNick
11.08.2007, 18:07
@aileron: Interessanter Nickname. Flieger ?

Aileron
11.08.2007, 22:02
@PicNick: Nein... ich habe selber keine Ahnung wie ich darauf kam (ist schon lange her) so hieß auf jeden Fall mein erste Shadowrun Chara...
Aber wieso Flieger?

@JanB: Danke für den Hinweis :) ich hatte gehoft mir das lesen des 380 Seiten langen "DatenBLATTES" ersparen zu können XD
Ausserdem kann man sich die Protected Mode Programmierung des 486 (eigendlich 286 XD) auch gut ohne des Intel-Datenblattes mit Hilfe von Foren und Tutorials aneigenen :)
Ich habe viele Anleitungen gelsen, und ich werde wohl was rumpribieren.
Vielleicht arbeite ich auch in C weiter, da habe ich sogar in dieser Wiki einen Timer gefunden.

Wenn du mir vielleicht doch ein Beispiel geben könntest wie ich auf dem Atmel Mega8-16 bei 16 MHz einen timer (von z.B. 2 Hz) einrichte währe ich dir SEHR dankbar :)

mfg Aileron

izaseba
11.08.2007, 22:08
@JanB: Danke für den Hinweis ich hatte gehoft mir das lesen des 380 Seiten langen "DatenBLATTES" ersparen zu können XD

Tja, dann mußt Du wohl Basic nehmen, dort weigern sich auch 99% der Leute Datenblätter zu lesen ;-)

Schau mal hier : http://www.izaseba.roboterbastler.de/

Dort habe ich etwas über Timer geschrieben...

Gruß Sebastian

JanB
12.08.2007, 09:52
Hallo Aileron,
Du brauchst dazu nicht die ganzen 300 Seiten zu lesen.
Es genügt doch der Abschnitt über die Timer und evtl. der über Interrupts.
Um dich ein wenig zu motivieren hier ein Stückchen Beispielcode,
der einen Mega8-16 dazu bringt mit 2Hz also alle 0,5s
einen Timerinterupt auszulösen.
Die Interruptroutine Int2Hz zählt dann PortC hoch, damit sich auch was tut.

Gruß Jan




;*** Int2Hz ***

.NOLIST
.INCLUDE <m8def.inc>
.LIST

.equ clk=16000000

;Interrupt Vector Table
rjmp RESET ;Reset Handler
rjmp RESET ;EXT_INT0 ; IRQ0 Handler
rjmp RESET ;EXT_INT1 ; IRQ1 Handler
rjmp RESET ;TIM2_COMP ; Timer2 Compare Handler
rjmp RESET ;TIM2_OVF ; Timer2 Overflow Handler
rjmp RESET ;TIM1_CAPT ; Timer1 Capture Handler
rjmp int2hz ;TIM1_COMPA ; Timer1 CompareA Handler
rjmp RESET ;TIM1_COMPB ; Timer1 CompareB Handler
rjmp RESET ;TIM1_OVF ; Timer1 Overflow Handler
rjmp RESET ;TIM0_OVF ; Timer0 Overflow Handler
rjmp RESET ;SPI_STC ; SPI Transfer Complete Handler
rjmp RESET ;USART_RXC ; USART RX Complete Handler
rjmp RESET ;USART_UDRE ; UDR Empty Handler
rjmp RESET ;USART_TXC ; USART TX Complete Handler
rjmp RESET ;ADC_CC ; ADC Conversion Complete Handler
rjmp RESET ;EE_RDY ; EEPROM Ready Handler
rjmp RESET ;ANA_COMP ; Analog Comparator Handler
rjmp RESET ;TWSI ; Two-wire Serial Interface Handler
rjmp RESET ;SPM_RDY ; Store Program Memory Ready Handler


RESET: ldi r16,high(RAMEND) ;SP setzen
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16

;Init PortC = Output
ldi r16,0xff
out ddrc,r16


;Init Timer1
;Mode 4, CTC, TOP=OCR1A, Prescl=256
clr r16
out TCCR1A,r16
ldi r16,(1<<WGM12)|(1<<CS12)
out TCCR1B,r16
ldi r16,high(clk/256/2)
out OCR1AH,r16
ldi r16,low(clk/256/2)
out OCR1AL,r16
;Enable Timer 1 Output Compare A INT
in r16,TIMSK
ori r16,1<<OCIE1A
out TIMSK,r16
sei

main: rjmp main

;Die Interruptroutine
int2hz: inc r16
out portc,r16
reti

PicNick
12.08.2007, 12:23
Ich muß aileron in Schutz nehmen, zum ..486 Programmieren liest man keine HW-Datasheets. Da ist man haupotsächlich mit dem BIOS konfrontiert.

Bei den Controllern is das was anderes, da geht alles zu Fuß, ohne BIOS.

OT: "Aileron" sind die Querruder beim Flugzeug, das weiß üblicherweise keiner, der nicht damit befaßt ist. Daher meine Frage. Aber so oder so, is ok.

Aileron
12.08.2007, 12:34
@izaseba, JanB:

Na ja, ist ja nicht so, das ich mir das Tutorial und die Datenblätter nicht durchlesen würde :), aber ich lerne lieber aus bereits funktionierenden Programmen XD

Sowohl das Programm als auch das Tutorial ist GENAU das was ich gesucht hatte :)

Ansonsten lese ich mir, sobald ich den gesammtzusammenhang kenne auch das Datenbalt durch, das ist sicher.

vielen danke für eure Hilfe:)

mfg Aileron