Forum: Mikrocontroller und Digitale Elektronik Zeitberechnung des Prozesses


von Fughulu (Gast)


Lesenswert?

Hallo,

ich habe mir mit meinem 8051 eine Uhr aufgebaut und wollte diese mit 
Assembler lösen, sie läuft auch soweit. Nur bin ich etwas unzufrieden 
mit der genauigkeit der Zeit.
Mich interesssiert es wie ich die Arbeitsdauer des Programmablaufes 
berechnen kann damit ich die Uhr genauer einstellen kann.





Hier mein kompletter Programmcode
1
;####### Programm für AT89S52 #########;
2
3
4
org 000h
5
    jmp 0100h         ;Sprung zu Haupt;
6
7
org 01bh
8
9
    ljmp 0300h       ;Sprung zu Interrupt Zeitschleife
10
11
12
13
;####### Initialisierung #########;
14
15
org 0100h
16
mov IE,#88h          ;1xEA bit7 und 1x ET1 bit3 (Freigabe Timer 1-interrupt);
17
mov  PCON,#00h        ;nicht benötigt;
18
mov SCON,#00h
19
mov TCON,#00h
20
mov TMOD,#20h         ;Mode 8-bit-Timer/Counter Reload M1 bit5;
21
mov TL1,#06h   
22
mov TH1,#06h      ;Reloadwert für ein 12MHz Oszi, Berechnung: 12M / 12 = 1M= Maschinenzyklus, 1M / 250 = 4 000 Bitwert: 256-250 = 6;
23
mov TH1,#06h
24
setb TR1             ;start Timer 1;
25
26
mov P0,#00h         ;Nullsetzen;
27
mov P1,#00h
28
mov P2,#00h
29
mov P3,#00h
30
mov R0,#00h
31
mov R7,#0160           ;R7 für Zeitberechnung 4 000 / 160 = 25 deshalb Register Vorladen mit 160 = 64hex;
32
mov R6,#025         ;R6 für Zeitberechnung 25 / 25 =1 deshalb Register vorladen mit 25 (19hex);
33
mov R1,#00h
34
mov R2,#00h
35
mov R3,#00h
36
mov R4,#00h
37
mov R5,#00h
38
39
;####### Hauptprogramm #########;
40
41
mainloop:
42
  setb p3.2
43
  setb p3.3
44
  jnb p3.2,min
45
  jnb p3.3,std
46
    mov a,r7          ; Abfrage ob  Register 7 0 wenn ja Abfrage des 2. Registers auf 0;
47
    jz wert1
48
    jmp mainloop
49
std:                               ; Zum einstellen der Zeit von hier...;
50
  cjne r3,#02,stdn20
51
  inc p2
52
  inc r2
53
  cjne r2,#04,nzmin
54
  mov p2,#00
55
  mov r2,#00
56
  mov r3,#00
57
  mov p3,#00
58
  jmp nzmin
59
stdn20:
60
  inc p2
61
  inc r2
62
  cjne r2,#10,nzmin
63
  mov p2,#00
64
  mov r2,#00
65
  inc r3
66
  inc p3
67
  jmp nzmin
68
  
69
min:
70
  inc p0
71
  inc r0
72
  cjne r0,#10,nzmin
73
  mov p0,#00
74
  mov r0,#00
75
  inc p1
76
  inc r1
77
  cjne r1,#06,nzmin
78
  mov p1,#00
79
  mov r1,#00
80
nzmin:
81
  mov r5,250
82
  mov r4,250
83
loop1:
84
  djnz r5,loop1
85
  djnz r4,loop1
86
  mov r5,250
87
  mov r4,250
88
loop2:  
89
  djnz r5,loop2
90
  djnz r4,loop2
91
  jmp mainloop       ; ...Bis hier nur für Zeit einstellen;
92
wert1:
93
    mov r7,#160    ;Reloadwert für Register 7 ( 4 000 Hz / 160);
94
    dec r6
95
    mov a,r6
96
    jz Sekundentakt
97
    jmp mainloop
98
99
Sekundentakt:    
100
  mov r6,#25         ;Reloadwert für Register 2 (25Hz /25);
101
  inc r4
102
  cjne r4,#060,mainloop   ;Minutentakt #60;
103
  mov r4,#00
104
  inc p0
105
  inc r0
106
  cjne r0,#10,mainloop   ;Zehnerminutentakt #10;
107
  mov p0,#00
108
  mov r0,#00
109
  inc p1
110
  inc r1
111
  cjne r1,#06,mainloop    ;Stunde #60;
112
  mov p1,#00
113
  mov r1,#00
114
  cjne r3,#02,nichtzwanzig    ;Stunde nicht im 20 Uhr Bereich;
115
  inc p2
116
  inc r2
117
  cjne r2,#04,main2
118
  mov p2,#00
119
  mov r2,#00
120
  mov r3,#00
121
  mov p3,#00
122
  ljmp mainloop
123
nichtzwanzig:
124
  inc p2
125
  inc r2
126
  cjne r2,#010,main2
127
  mov r2,#00
128
  mov p2,#00
129
  inc r3
130
  inc p3
131
main2:
132
  ljmp mainloop
133
134
135
;##### Interrupt Zeitschleife###;
136
137
org 0300h
138
139
    dec r7       ;Register 7 erhöhen bei jeden Interrupt;
140
141
    reti

von Karl H. (kbuchegg)


Lesenswert?

Fughulu schrieb:

> Mich interesssiert es wie ich die Arbeitsdauer des Programmablaufes
> berechnen kann damit ich die Uhr genauer einstellen kann.

Schwierig, weil du alle Codepfade inkl. aller Verzweigungen 
berücksichtigen musst.

Hat dein µC keine Hardware-Timer?
Die sind normalerweise das Mittel der Wahl, wenn man Zeitsachen machen 
will. Denn Hardware-Timer arbeiten losgelöst vom Programm und lösen bei 
bestimmten Zählerständen eine Interrupt-Bearbeitung aus. Und das auf den 
Timer-Takt genau.

von Karl H. (kbuchegg)


Lesenswert?

Moment.
Du benutzt ja einen Timer.

Dann dürfte das für dich interessant sein. Ist zwar für einen anderen 
Prozessor, aber das Prinzip ist dasselbe.

AVR - Die genaue Sekunde / RTC

von Wolfgang (Gast)


Lesenswert?

Und mit ein bisschen Feinarbeit läßt sich auch die mittlere 
Ungenauigkeit der Quarzfrequenz herauskalibrieren
Beitrag "Die genaue Sekunde / RTC"

von Fughulu (Gast)


Lesenswert?

ok vielen Dank ich werde mich mal schlaulesen.

von amateur (Gast)


Lesenswert?

1. Die meisten Verzweigungsbefehle brauchen je nach Entscheidung
   (linear weiter oder Sprung) unterschiedlich viele Takte.
2. Möglicherweise ist sogar deshalb der "Weg" länger oder kürzer
   (mehr oder weniger Befehle in der Sequenz).
3. Wüstest Du also vorher was Sache ist, brauchtest Du die
   Verzweigungen ja nicht.

Also: Die Laufzeit ist abhängig von Deinen tatsächlichen/aktuellen
      Daten.
      Die lässt sich zwar, für einen konkreten Zustand bestimmen, aber
      nicht pauschal.

Es gibt zwar die Möglichkeit durch das Einfügen von Hilfsschritten wie 
z.B. NOP die Wege anzupassen, aber die Wartung eines solchen 
Codeabschnittes ist eine reine Sisyphusarbeit. Normalerweise geht das 
aber nur in Assembler.

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.