Warteschleife 1s bei XTAL 4000000

#3948188
Lesenswert?

Hallo zusammen,

bin nicht so erfahren in der Assemblerprogrammierung.Ich wollte eine 
Warteschleife bauen die ca 1 Sekunde dauert. Mein Taktgenerator hat 
4Mhz.
Habe folgenden Code geschrieben:

(Xtal = 4000000)
1
wait1s:                                 
2

3
  push temp1
4
  push temp2
5
  push temp3
6

7
     ldi temp3, (xtal * 1/191208)
8
        WGLOOP4:     
9
     ldi  temp1, $F8
10
  WGLOOP2:   
11
     ldi  temp2, $FF
12
  WGLOOP3:   
13
     dec  temp2
14
                 brne WGLOOP3
15
                 dec  temp1
16
                 brne WGLOOP2
17
     dec temp3
18
     brne WGLOOP4
19

20
  pop temp3
21
  pop temp2
22
  pop temp1
23
ret


Naja irgendwas stimmt wohl nicht. Die Dauer entspricht nicht 1 Sekunde 
sondern ca 0,85 Sekunden.
Habe ich aus eurer Sicht die Werte richtig eingetragen?

Danke!
#3948788
Lesenswert?

Nimm ein Macro und laß die magischen Zahlen den Assembler selber 
ausrechnen, der kann 64Bit Ganzzahl.
1
.include "tn13def.inc"
2

3
        .equ    F_CPU = 4000000       ; 4MHz
4

5
.macro  warte
6
        ldi     r16, byte1( @0 / 6 )
7
        ldi     r17, byte2( @0 / 6 )
8
        ldi     r18, byte3( @0 / 6 )
9
        ldi     r19, byte4( @0 / 6 )
10
_warte11:
11
        subi    r16, byte1(1)         ; 1 Zyklus
12
        sbci    r17, byte2(1)         ; 1 Zyklus
13
        sbci    r18, byte3(1)         ; 1 Zyklus
14
        sbci    r19, byte4(1)         ; 1 Zyklus
15
        brne    _warte11              ; 2 Zyklen
16
                                      ; = 6 Zyklen
17
.endmacro
18

19
main:
20
        sbi     ddrb, pb1
21
        sbi     portb, pb1
22
        warte   F_CPU * 1         ; 1s
23
        cbi     portb, pb1
24
        warte   F_CPU * 2         ; 2s
25
        rjmp    main

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren