Forum: Mikrocontroller und Digitale Elektronik Zeitmesung mit atmga8 avr


von JAY (Gast)


Lesenswert?

.include<m8def.inc>
.cseg
.org 0x000
  rjmp reset
.org 0x008
  rjmp tim1_ovf
.org 0x009
  rjmp tim0_ovf
;*********************************************************************** 
**
.org 0x020
reset:
  ldi r16,LOW(RAMEND)
  out spl,r16
  ldi r16,HIGH(RAMEND)
  out sph,r16
  ldi r16,0x00
  out ddrc,r16
  ldi r16,0xff
  out ddrb,r16
  out ddrd,r16
  out portc,r16
  ldi r16,0b00000011
  out tccr0,r16    ;interner Takt Timer0 - Frequenz CLK/64
  ldi r16,0000000001
  out tccr1b,r16    ;interner Takt - kein Vorteiler
  ldi r17,0xf1    ;timer highbyte zuerst initialisieren
  ldi r18,0xb4    ;timer lowbyte initialisieren
  out tcnt1h,r17
  out tcnt1l,r18
  ldi r16,0b00000001
  out timsk,r16    ;timer0 interrupt ermöglichen
  ldi zl,0x60      ;zeiger auf ausgabewerte
  ldi zh,0x00
  ldi r16,0x00
  sts stelle,r16    ;stellenzähler
  ldi r16,0x00
  sts einer,r16
  ldi r16,0x00
  sts zehner,r16
  ldi r16,0x00
  sts hunderter,r16
  ldi r16,0x00
  sts tausender,r16
  ldi r20,0x00
  sei

start:
  sbis pinc,0
  rjmp start

st1:
  ldi r16,0x00
  sts stelle,r16    ;  stellenzähler
  sts einer,r16    ; `0` ---> einer
  sts zehner,r16    ; `0` ---> zehner
  sts hunderter,r16  ; `0` ---> hunderter
  sts tausender,r16  ; `0` ---> tausender
  ldi r16,0b00000101  ;  timer 1\0 interrupt ermöglichen
  out timsk,r16
st2:
  ;rcall zeit
  sbic pinc,0
  rjmp st2
st3:
  ldi r16,0b00000001  ;timer0 interuppt ermöglichen
  out timsk,r16
  sbis pinc,0
  ;rcall zeit
  rjmp start

tim0_ovf:
  sei          ;interrupts zulassen
  push r16      ;register retten
  push r17
  push r18
  push r19
  in r16,sreg      ;statusregister sichern
  ld r18,z+      ;ausgabewert holen
  lds r19,stelle    ;stelle holen
  swap r19      ;nibbles tauschen
  out portb,r18    ;wert ausgeben
  out portd,r19    ;stelle ausgeben
  swap r19      ;stelle zurücktauschen
  inc r19
  sts stelle,r19    ;und sichern
  cpi r19,0x04
  brlo t0_1

  ldi zl,0x60
  ldi zh,0x00
  ldi r19,0x00
  sts stelle,r19



t0_1:
  out sreg,r16    ;statusregister wieder herstellen
  pop r19        ;register wieder herstellen
  pop r18
  pop r17
  pop r16
  reti

tim1_ovf:

  push r16
  push r17
  push r18
  in r16,sreg
  lds r16,einer    ;einerstelle holen
  inc r16        ;und inkrementieren
  cpi r16,0x0a
  brsh s2        ;wenn einer > 9
  sts einer,r16    ;sonst einer sichern
  rjmp t1_end      ;und wiederholen
s2:  ldi r16,0x00
  sts einer,r16    ;einer zurücksetzen
  lds r16,zehner
  inc r16        ;zehner inkrementieren
  cpi r16,0x0a
  brsh s3        ;wenn zehner > 9
  sts zehner,r16    ;sonst zehner sichern
  rjmp t1_end      ;und wiederholen
s3:  ldi r16,0x00
  sts zehner,r16    ;zehner zurück setzen
  lds r16,hunderter
  inc r16        ;hunderter inkrementieren
  cpi r16,0x0a
  brsh s4        ;wenn hunderter > 9
  sts hunderter,r16  ;sonst hunderter sichern
  rjmp t1_end      ;und wiederholen
s4:  ldi r16,0x00
  sts hunderter,r16  ;hunderter zurücksetzen
  lds r16,tausender
  inc r16        ;tausender inkrementieren
  cpi r16,0x0a
  brsh s5        ;wenn tausender > 9
  sts tausender,r16  ;tausender sichern
  rjmp t1_end     ;und wiederholen
s5:  ldi r16,0x00
  sts tausender,r16  ;tausender zurücksetzen


t1_end:
  ldi r17,0xf1
  ldi r18,0xb4
  out tcnt1h,r17    ;timerwert zurücksetzen
  out tcnt1l,r18
  out sreg,r16    ;statusregister wiederherstellen
  pop r18
  pop r17
  pop r16
  reti

zeit:  push r16
    push r17
    push r18
    lds r16,sreg
    push r16
    ldi r16,0xf0
zeit1:  ldi r17,0xff
zeit2:  ldi r18,0x1d
zeit3:  dec r18
    brne zeit3
    dec r17
    brne zeit2
    dec r16
    brne zeit1
    pop r16
    sts sreg,r16
    pop r18
    pop r17
    pop r16
    ret



.dseg

einer:    .byte  1
zehner:    .byte  1
hunderter:  .byte  1
tausender:  .byte  1
stelle:    .byte  1


Möchte gern die herausgegebene Zeit ausgeben lassen hierbei wird es nur 
wieder auf null gesetzt kann mir bitte jemand helfen

von Bernd (Gast)


Lesenswert?

ich glaube nicht dass sich jemand den Code antun wird ...

von Marcel H. (heidelberger)


Lesenswert?

was mir beim durchlesen aufgefallen ist:
du schreibst in der ini
  ldi r16,0000000001
  out tccr1b,r16    ;interner Takt - kein Vorteiler
soll aber vermutlich 0b... heißen macht aber keine Änderung da 1 in 
Oktal in Binär immernoch 1 ist.

im Interrupt tim1_ovf:
du lädst SREG in R16 und am ende auch wieder zurück aber du veränderst 
in der Zwischenzeit den Inhalt von R16. Entweder du machst anschließend 
noch einmal push R16 oder du nimmst ein anderes Register.
Im Unterprogramm Zeit machst du das richtig

von Marcel H. (heidelberger)


Lesenswert?

Der Befehl STS ändert nicht den Wert im Register und du brauchst nicht 
jedesmal anschließend wieder einen neuen Wert zu laden wie in der INI:

  ldi r16,0x00
  sts einer,r16
  ldi r16,0x00
  sts zehner,r16
  ldi r16,0x00
  ...

und noch etwas
wenn du Zeit auskommentierst dann kann es passieren das in st3 der rjmp 
Befehl übersprungen wird

du schreibst das nur timer0 Interrupts machen darf brauchst aber auch 
für timer1 Interrupts. Register TIMSK

von Flo (Gast)


Lesenswert?

TCNT1 setzt man im Normalfall am Anfang des Timers, da je nach Umfang 
des Timerinterrupts ja nebenher schon hochgezählt wird.

von spess53 (Gast)


Lesenswert?

Hi

>  sbis pinc,0
>  ;rcall zeit
>  rjmp start

>  push r18
>  in r16,sreg>
>  lds r16,einer    ;einerstelle holen

>  ldi r16,0000000001
>  out tccr1b,r16    ;interner Takt - kein Vorteiler

alles böse Fallen.


>  ldi r16,0b00000011
>  out tccr0,r16    ;interner Takt Timer0 - Frequenz CLK/64

Benutze bitte die Bitdefinitionen

ldi r16,1<<CS11|1<<CS10

MfG Spess

von JAY (Gast)


Lesenswert?

Das Programm arbeitet er Zählt hoch aber es muss wenn der setz befehl 
wieder kommt muss die zeit wieder auf null aber dafür die zeit die als 
letztes angezeigt war angezeigt werden bis die neue zeit gestoppt wird

von Karl H. (kbuchegg)


Lesenswert?

JAY schrieb:
> Das Programm arbeitet er Zählt hoch aber es muss wenn der setz befehl
> wieder kommt muss die zeit wieder auf null aber dafür die zeit die als
> letztes angezeigt war angezeigt werden bis die neue zeit gestoppt wird

Dann wirst du wohl 2 Sätze von Variablen brauchen
In den einen wird gezählt, die anderen werden angezeigt.
Und wenn du soweit bist wird die laufende Zeit umkopiert auf die 
Variablen von denen angezeigt wird.

von JAY (Gast)


Lesenswert?

Ja genau wie müsste ich das weiteer schreiben hab alles versucht aber 
dann zeigt er mir immer den selben wert an

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.