Forum: Mikrocontroller und Digitale Elektronik Frequenzmesser


von anfänger0815 (Gast)


Lesenswert?

Hallo Forum, ich habe folgendes kleines Programm geschrieben.
1
.dseg
2
  frequ_hoch:
3
    .byte 1
4
  frequ_mittel:
5
    .byte 1
6
  frequ_nieder:
7
    .byte 1
8
  frequ_hoch_temp_temp:
9
    .byte 1
10
  frequenz_status:
11
    .byte 1
12
  zaehl_ergeb_spei:
13
    .byte 27
14
  zaehl_spei_schr_z:
15
    .byte 1
16
17
.cseg    
18
frequenzmessen_vor:
19
  ldi tmp1,0
20
  out TCCR1A,tmp1
21
  ldi tmp1,0b00000010
22
  out TCCR1B,tmp1
23
;Timer Interupt Mask
24
  in tmp1,TIMSK
25
  ori tmp1,0b00100100
26
  out TIMSK,tmp1
27
  ldi tmp1,0
28
  sts frequ_hoch,tmp1
29
  sts frequ_mittel,tmp1
30
  sts frequ_nieder,tmp1
31
  ret
32
 ;---------------------------------- 
33
frequenz_int1:
34
  push tmp6
35
  in tmp6,sreg
36
  push tmp6
37
38
  lds tmp6,frequ_hoch_temp_temp
39
  inc tmp6
40
  sts frequ_hoch_temp_temp,tmp6
41
42
  pop tmp6
43
  out sreg,tmp6
44
  pop tmp6
45
  reti
46
;-----------------------------------    
47
frequenz_start_stop:
48
  push tmp5
49
  push tmp6
50
  in tmp6,sreg
51
  push tmp6
52
  push xl
53
  push xh
54
  
55
  lds tmp6,zaehl_spei_schr_z
56
  cpi tmp6,27
57
  brlo frequenz_start_stop_10
58
  ldi tmp6,0
59
60
frequenz_start_stop_10:
61
  ldi xl,low(zaehl_ergeb_spei)
62
  ldi xh,high(zaehl_ergeb_spei)
63
  add xl,tmp6
64
  clr tmp5
65
  adc xh,tmp5
66
67
  in tmp5,TCNT1L
68
  rcall frequenz_start_stop_100
69
  in tmp5,TCNT1H
70
  rcall frequenz_start_stop_100
71
  lds tmp5,frequ_hoch_temp_temp
72
  rcall frequenz_start_stop_100
73
74
  ldi tmp5,0
75
  sts frequ_hoch_temp_temp,tmp5
76
  sts zaehl_spei_schr_z,tmp6
77
78
  pop xh
79
  pop xl
80
  pop tmp6
81
  out sreg,tmp6
82
  pop tmp6
83
  pop tmp5
84
  reti
85
86
frequenz_start_stop_100:
87
  st x+,tmp5
88
  inc tmp6
89
  ret
90
;-----------------------------------   
91
92
frequenz_berechnung:
93
  ldi xl,low(zaehl_ergeb_spei)
94
  ldi xh,high(zaehl_ergeb_spei)
95
  mov yl,xl
96
  mov yh,xh
97
  
98
  ldi tmp5,3
99
  add yl,tmp5
100
  clr tmp3
101
  adc yh,tmp3
102
  
103
;Adressen für die indirekten Zeiger sind berechnet
104
frequenz_berechnung_10:    
105
  ld tmp5,x
106
  ld tmp8,y
107
108
  adiw x,1
109
  adiw y,1
110
111
  ld tmp6,x
112
  ld tmp9,y
113
114
  adiw x,1
115
  adiw y,1
116
117
  ld tmp7,x
118
  ld tmp10,y
119
120
  adiw x,1
121
  adiw y,1
122
123
  sub tmp5,tmp8
124
  sbc tmp6,tmp9
125
  sbc tmp7,tmp10
126
  
127
  brtc frequenz_berechnung_20
128
  neg tmp5
129
  neg tmp6
130
  neg tmp7
131
  
132
frequenz_berechnung_20:
133
  lds tmp4,frequ_nieder
134
  add tmp4,tmp5
135
  sts frequ_nieder,tmp4
136
137
  lds tmp4,frequ_mittel
138
  add tmp4,tmp6
139
  sts frequ_mittel,tmp4
140
141
  lds tmp4,frequ_hoch
142
  add tmp4,tmp7
143
  sts frequ_hoch,tmp4
144
145
  inc tmp5
146
  cpi tmp5,9
147
  brsh frequenz_berechnung_40
148
  rjmp frequenz_berechnung_10
149
150
frequenz_berechnung_40:
151
  ldi tmp5,0
152
153
frequenz_berechnung_50:
154
  lds tmp7,frequ_hoch
155
  lsr tmp7
156
  sts frequ_hoch,tmp7
157
  
158
  lds tmp7,frequ_mittel
159
  ror tmp7
160
  sts frequ_mittel,tmp7
161
  
162
  lds tmp7,frequ_nieder
163
  ror tmp7
164
  sts frequ_nieder,tmp7
165
  
166
  inc tmp5
167
  cpi tmp5,4
168
  brlo frequenz_berechnung_50
169
170
  
171
frequenz_berechnung_100:
172
  ldi tmp3,199
173
  rcall frequenz_darstellen
174
  ret

In "frequenzmessen_vor" werden Voreinstellungen gemacht.

In "frequenz_int1" wird der Zähler "frequ_hoch_temp_temp" bei jedem 
Zähler 1 überlauf um eins erhöht.

In "frequenz_start_stop" wird eine 9 x 3 Tabelle mit den Low und High 
Bytes des Zähler 1 und dem Byte "frequ_hoch_temp_temp" gefüllt.

In "frequenz_berechnung" soll nun der Durchschnittswert der Tabelle 
berechnet werden. Dazu werden zuerst die einzelnen Dreiergruppen geladen 
und voneinander abgezogen. Müßte normalerweise, wenn sich die Frequenz 
nicht ändert immer den gleichen Wert ergeben. Die Ergebnisse der 
Subtraktion werde aufaddiert und dann durch 8 geteilt. Und das sollte 
dann einen Wert ergeben von dem ich die Frequenz berechnen kann. Nur so 
weit bin ich noch nicht da dieser Wert schon nicht stabil ist, sondern 
im ganzen Bereich umherspringt. Was mach ich falsch?
Vielen Dank im vorraus.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich wühl' mich da jetzt nicht durch - aber es hilft ungemein, 
Unterprogramme und bei Assembler sogar einzelne Zeilen mit einem 
Kommentar zu versehen. Nicht nur für uns Ahnungslose, sondern auch für 
dich selber, damit du in 3 Wochen auch noch verstehst, was du da 
eigentlich programmiert hast.

Und noch ein Tipp: Wenn du Kontrollstrukturen in z.B. Timerregistern 
schreibst, ist solche eine Schreibweise wesentlich besser:
1
       ldi   r16,(1<<COM1A)|(1<<COM1B)
2
       out   TCCR0A,r16
als das Bitgewurschtel, wo jeder nochmal ins Datenblatt gucken muss, obs 
denn auch an der richtigen Stelle ist.

: Bearbeitet durch User
von anfänger0815 (Gast)


Lesenswert?

Hoffe jetzt ist es besser

1
.dseg
2
  frequ_hoch:
3
    .byte 1
4
  frequ_mittel:
5
    .byte 1
6
  frequ_nieder:
7
    .byte 1
8
  frequ_hoch_temp_temp:
9
    .byte 1
10
  frequenz_status:
11
    .byte 1
12
  zaehl_ergeb_spei:
13
    .byte 27
14
  zaehl_spei_lese_z:
15
    .byte 1
16
  zaehl_spei_schr_z:
17
    .byte 1
18
19
.cseg    
20
frequenzmessen_vor:
21
  ldi tmp1,0
22
  out TCCR1A,tmp1
23
  ldi tmp1,0b00000010
24
  out TCCR1B,tmp1
25
;Timer Interupt Mask
26
  in tmp1,TIMSK
27
  ori tmp1,0b00100100
28
  out TIMSK,tmp1
29
  ldi tmp1,0
30
  sts frequ_hoch,tmp1
31
  sts frequ_mittel,tmp1
32
  sts frequ_nieder,tmp1
33
  ret
34
 ;---------------------------------- 
35
frequenz_int1:
36
  push tmp6
37
  in tmp6,sreg
38
  push tmp6
39
40
;Lade Zählbyte für event. Timer1 Überlauf
41
;und erhöhe es um 1
42
  lds tmp6,frequ_hoch_temp_temp
43
  inc tmp6
44
  sts frequ_hoch_temp_temp,tmp6
45
46
  pop tmp6
47
  out sreg,tmp6
48
  pop tmp6
49
  reti
50
;-----------------------------------    
51
frequenz_start_stop:
52
  push tmp5
53
  push tmp6
54
  in tmp6,sreg
55
  push tmp6
56
  push xl
57
  push xh
58
  
59
;Lade den Zeiger der auf die akt Speicher-
60
;zelle in der Tabelle zeigt in tmp6
61
62
  lds tmp6,zaehl_spei_schr_z
63
  cpi tmp6,27
64
  brlo frequenz_start_stop_10
65
66
;Ist der Zeiger am Ende angekommen lade 0
67
;in den Zeiger (Tabellenanfang)
68
69
  ldi tmp6,0
70
71
frequenz_start_stop_10:
72
73
;Lade akt. Tabellenadresse in X
74
75
  ldi xl,low(zaehl_ergeb_spei)
76
  ldi xh,high(zaehl_ergeb_spei)
77
  add xl,tmp6
78
  clr tmp5
79
  adc xh,tmp5
80
81
;Speicher Zählerstände ab
82
83
  in tmp5,TCNT1L
84
  rcall frequenz_start_stop_100
85
  in tmp5,TCNT1H
86
  rcall frequenz_start_stop_100
87
  lds tmp5,frequ_hoch_temp_temp
88
  rcall frequenz_start_stop_100
89
90
;Lösche Timer1 Überlaufzähler
91
92
  ldi tmp5,0
93
  sts frequ_hoch_temp_temp,tmp5
94
  sts zaehl_spei_schr_z,tmp6
95
96
  pop xh
97
  pop xl
98
  pop tmp6
99
  out sreg,tmp6
100
  pop tmp6
101
  pop tmp5
102
  reti
103
104
frequenz_start_stop_100:
105
  st x+,tmp5
106
  inc tmp6
107
  ret
108
;-----------------------------------   
109
110
frequenz_berechnung:
111
112
;Lade in X Anfangadresse der Tabelle und
113
114
115
  ldi xl,low(zaehl_ergeb_spei)
116
  ldi xh,high(zaehl_ergeb_spei)
117
118
;in Y die Adresse der folgenden 3 Werte 
119
120
  mov yl,xl
121
  mov yh,xh
122
  ldi tmp5,3
123
  add yl,tmp5
124
  clr tmp3
125
  adc yh,tmp3
126
  
127
;Adressen für die indirekten Zeiger sind berechnet
128
frequenz_berechnung_10:    
129
130
Lade 6 Werte in die Register tmp5 - tmp10
131
132
  ld tmp5,x
133
  ld tmp8,y
134
135
  adiw x,1
136
  adiw y,1
137
138
  ld tmp6,x
139
  ld tmp9,y
140
141
  adiw x,1
142
  adiw y,1
143
144
  ld tmp7,x
145
  ld tmp10,y
146
147
  adiw x,1
148
  adiw y,1
149
150
;Berechne die Differenz aus den 2 x 3 Werten
151
152
  sub tmp5,tmp8
153
  sbc tmp6,tmp9
154
  sbc tmp7,tmp10
155
156
; Ist ein Übertrag entstanden Negiere
157
  
158
  brtc frequenz_berechnung_20
159
  neg tmp5
160
  neg tmp6
161
  neg tmp7
162
  
163
;Addiere die 8 Differenzen
164
165
frequenz_berechnung_20:
166
  lds tmp4,frequ_nieder
167
  add tmp4,tmp5
168
  sts frequ_nieder,tmp4
169
170
  lds tmp4,frequ_mittel
171
  add tmp4,tmp6
172
  sts frequ_mittel,tmp4
173
174
  lds tmp4,frequ_hoch
175
  add tmp4,tmp7
176
  sts frequ_hoch,tmp4
177
178
  inc tmp5
179
  cpi tmp5,9
180
  brsh frequenz_berechnung_40
181
  rjmp frequenz_berechnung_10
182
183
;Teile die Adierten Werte durch 8
184
;=Mittelwert
185
186
frequenz_berechnung_40:
187
  ldi tmp5,0
188
189
frequenz_berechnung_50:
190
  lds tmp7,frequ_hoch
191
  lsr tmp7
192
  sts frequ_hoch,tmp7
193
  
194
  lds tmp7,frequ_mittel
195
  ror tmp7
196
  sts frequ_mittel,tmp7
197
  
198
  lds tmp7,frequ_nieder
199
  ror tmp7
200
  sts frequ_nieder,tmp7
201
  
202
  inc tmp5
203
  cpi tmp5,4
204
  brlo frequenz_berechnung_50
205
206
;Springe zur Darstellung der Frequenz
207
  
208
frequenz_berechnung_100:
209
  ldi tmp3,199
210
  rcall frequenz_darstellen
211
  ret

von Karl H. (kbuchegg)


Lesenswert?

anfänger0815 schrieb:

> und voneinander abgezogen. Müßte normalerweise, wenn sich die Frequenz
> nicht ändert immer den gleichen Wert ergeben.

Das lässt sich ja testen.
Sind die Werte (im wesentlichen) immer gleich?

Dann wüsste man schon mal, warauf man genauer schauen muss: auf die 
Datenerfassung oder die Berechnung.

Auf Deutsch: schau dir halt mal die Werte an, die deine Datenerfassung 
liefert. Wenn die schon nicht plausibel sind, dann brauchst du dich erst 
mal um die ganze Subtraktion bzw. Mittelwertbildung nicht kümmern. Sind 
die Werte aber gut, dann kann man das alles in den Simulator laden und 
dort in Einzelschritten nachgehen und die Berechnung kontrollieren.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

>   in tmp1,TIMSK
>   ori tmp1,0b00100100
>   out TIMSK,tmp1

Das eine ist wohl der Overflow Interrupt.
Aber was ist der andere? Ist das ein Capture Interrupt?

Ich hab jetzt ehrlich gesagt keine Lust, mir aus dem Datenblatt 
rauszusuchen, welcher Interrupt das ist. Warum verwendest du da keine 
Bitnamen? Dann müsste man an dieser Stelle nicht das Datenblatt suchen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Aus dem Bauch heraus denke ich aber, dein Problem liegt in den gezählten 
Overflows.

Diesen Zähler setzt du nach jeder Messung wieder auf 0, den 
Timer-Counter lässt du aber weiter laufen.
Das ist ungefähr so, als ob du mit einer Uhr stoppen würdest (nur 
Sekunden) und zwar registrierst, dass du über 100 Sekunden kommst, dann 
aber die Hunderterstelle jeweils wieder auf 0 setzt.

d.h. du kriegst Werte von
1
   88
2
  123
3
   79
4
  101
5
   56
und wenn du da jetzt die Differenzen nimmst, dann kommt Unsinn raus. Du 
müsstest eigentlich Werte haben
1
   88
2
  123
3
  179
4
  201
5
  256
und dann kannst du auch mit den Differenzen rechnen.

Ist aber nur so ein Bauchgefühl. Wie gesagt: ich würde mir erst mal die 
aufgezeichneten Daten ansehen.

von anfänger0815 (Gast)


Lesenswert?

Das mit den Bitnamen habe ich noch nie gemacht. Müßte ich vielleicht 
langsam mal machen. Ich bin von Kindesbeinen auf gewohnt des so zu 
machen wie ich es halt mache. Tut mir scho leid. Werde mich aber mal 
drüber machen wie des so geht.

von anfänger0815 (Gast)


Lesenswert?

Hallo Karl Heinz der Tipp war goldrichtig. Ich lasse jetz bei jedem 
Durchgang die gleichen Werte in die Tabelle eintragen und siehe da, die 
Anzeige ändert sich noch immer.

von Karl H. (kbuchegg)


Lesenswert?

anfänger0815 schrieb:
> Das mit den Bitnamen habe ich noch nie gemacht.

Dann wirds Zeit

Was ist (auf einem Mega16) der Unterschied zwischen
1
  in tmp1,TIMSK
2
  ori tmp1,0b00100100
3
  out TIMSK,tmp1]

und
1
  in tmp1,TIMSK
2
  ori tmp1, (1<<TICIE1) | ( 1<<TOIE1)
3
  out TIMSK,tmp1

Antwort: technisch gesehen - keiner
Die 2-te Form ist für Menschen aber besser lesbar. Du musst dir dazu 
noch nicht mal viel merken, denn die Bitnamen stehen im Datenblatt genau 
an der Stelle dabei, an der du dir sonst die Bits rausliest.

Und nach 3 mal machen hast du dir auch gemerkt, dass TOIE1 für "Timer 
Overflow Interrupt Enable vom timer 1" steht und TICIE1 für "Timer Input 
Capture Interrupt Enable vom timer 1" steht. D.h. beim Code lesen, 
kannst du ganz leicht im Code lesen, was du eigentlich eingeschaltet 
hast. Aus den binär-Bits siehst du das aber nicht so schnell.

: Bearbeitet durch User
von anfänger0815 (Gast)


Lesenswert?

Jetzt habe ich die ganze Geschichte umgeschrieben, den Timer 1 Überlauf 
mal "ausgeschaltet". Ein Problem habe ich jetzt aber immer noch, dei 
Anzeige ist zwar ruhiger aber zeigt zu viel an. Und da hätte ich gleich 
noch eine Frage: Wie verhält es sich mit dem Überlauf, wenn ich von 
einem Timerwert vor dem Überlauf einen Timerwert nach dem Überlauf 
abziehe? Ich denke mir ich muß dann per neg-Befehl ein Zweierkomplement 
machen. Aber wie mache ich des bei einer 3-Byte langen Zahl? Bei dem 
Komplement wird doch 1 hinzu addiert. Wie mach ich das wenn es dann 
einen Überlauf nach der Addition gibt?

1
.dseg
2
  frequ_hoch:
3
    .byte 1
4
  frequ_mittel:
5
    .byte 1
6
  frequ_nieder:
7
    .byte 1
8
  frequ_hoch_temp_temp:
9
    .byte 1
10
  frequenz_status:
11
    .byte 1
12
  zaehl_ergeb_spei:
13
    .byte 27
14
  zaehl_spei_lese_z:
15
    .byte 1
16
  zaehl_spei_schr_z:
17
    .byte 1
18
19
.cseg    
20
frequenzmessen_vor:
21
  ldi tmp1,0
22
  out TCCR1A,tmp1
23
;Vorverteiler durch 8
24
  ldi tmp1,0b00000010
25
  out TCCR1B,tmp1
26
;Timer Interupt Mask
27
  in tmp1,TIMSK
28
  ori tmp1, (1<<TICIE1 | 1<<TOIE1)
29
  out TIMSK,tmp1
30
  ldi tmp1,0
31
  sts frequ_hoch,tmp1
32
  sts frequ_mittel,tmp1
33
  sts frequ_nieder,tmp1
34
  ret
35
 ;---------------------------------- 
36
frequenz_int1:
37
38
;Bei Ãœberlauf des Timer 1, Byte +1
39
40
  push tmp6
41
  in tmp6,sreg
42
  push tmp6
43
44
  lds tmp6,frequ_hoch_temp_temp
45
  inc tmp6
46
  ldi tmp6,0
47
  sts frequ_hoch_temp_temp,tmp6
48
49
  pop tmp6
50
  out sreg,tmp6
51
  pop tmp6
52
  reti
53
;-----------------------------------    
54
frequenz_start_stop:
55
  push tmp5
56
  push tmp6
57
  in tmp6,sreg
58
  push tmp6
59
  push xl
60
  push xh
61
62
;Tabelle mit Daten Füllen, 9 X 3 Datensatze  
63
  
64
  lds tmp6,zaehl_spei_schr_z
65
  cpi tmp6,27
66
  brlo frequenz_start_stop_10
67
  ldi tmp6,0
68
69
frequenz_start_stop_10:
70
  ldi xl,low(zaehl_ergeb_spei)
71
  ldi xh,high(zaehl_ergeb_spei)
72
  add xl,tmp6
73
  clr tmp5
74
  adc xh,tmp5
75
76
  in tmp5,TCNT1L
77
;Bis hierher 21 Takte
78
  rcall frequenz_start_stop_100
79
  in tmp5,TCNT1H
80
  rcall frequenz_start_stop_100
81
  lds tmp5,frequ_hoch_temp_temp
82
  rcall frequenz_start_stop_100
83
  sts zaehl_spei_schr_z,tmp6
84
85
  pop xh
86
  pop xl
87
  pop tmp6
88
  out sreg,tmp6
89
  pop tmp6
90
  pop tmp5
91
  reti
92
93
frequenz_start_stop_100:
94
  st x+,tmp5
95
  inc tmp6
96
  ret
97
;-----------------------------------   
98
99
frequenz_berechnung:
100
101
;Tabellenanfang nach X
102
103
  ldi xl,low(zaehl_ergeb_spei)
104
  ldi xh,high(zaehl_ergeb_spei)
105
106
;Durchlaufzähler mit 0 laden
107
  
108
  ldi tmp4,0
109
  
110
;Ersten sechs Werte auslesen
111
 
112
frequenz_berechnung_10:    
113
  ld tmp5,x+
114
  ld tmp6,x+
115
  ld tmp7,x+
116
  ld tmp8,x+
117
  ld tmp9,x+
118
  ld tmp10,x+
119
120
;X-Zeiger um drei Stellen zurück
121
;für nächsten Auslesezyklus  
122
  
123
  clc
124
  sbiw x,3
125
126
;Differenz Berechnen  
127
  
128
  sub tmp5,tmp8
129
  sbc tmp6,tmp9
130
  sbc tmp7,tmp10
131
132
;Wenn Ãœbertrag dann negieren  
133
  
134
  brcc frequenz_berechnung_20
135
  neg tmp5
136
  neg tmp6
137
  neg tmp7
138
139
;Aufaddieren der einzelnen Werte  
140
  
141
frequenz_berechnung_20:
142
  lds tmp8,frequ_nieder
143
  lds tmp9,frequ_mittel
144
  lds tmp10,frequ_hoch
145
146
  add tmp8,tmp5
147
  adc tmp9,tmp6
148
  adc tmp10,tmp7
149
    
150
  sts frequ_nieder,tmp8
151
  sts frequ_mittel,tmp9
152
  sts frequ_hoch,tmp10
153
154
;Sind schon 8 Durchläufe gemacht worden
155
  
156
  inc tmp4
157
  cpi tmp4,8
158
  brsh frequenz_berechnung_40
159
  rjmp frequenz_berechnung_10
160
161
162
frequenz_berechnung_40:
163
  ldi tmp5,0
164
165
;Ergebnis durch 8 Teilen, Mittelwert  
166
  
167
frequenz_berechnung_50:
168
  lds tmp7,frequ_hoch
169
  lsr tmp7
170
  sts frequ_hoch,tmp7
171
  
172
  lds tmp7,frequ_mittel
173
  ror tmp7
174
  sts frequ_mittel,tmp7
175
  
176
  lds tmp7,frequ_nieder
177
  ror tmp7
178
  sts frequ_nieder,tmp7
179
  
180
  inc tmp5
181
  cpi tmp5,3
182
  brlo frequenz_berechnung_50
183
184
  
185
frequenz_berechnung_100:
186
  ldi tmp3,199
187
  rcall frequenz_darstellen
188
  ret

von spess53 (Gast)


Lesenswert?

Hi

Was soll das

>  neg tmp5
>  neg tmp6
>  neg tmp7

bewirken? Hoffentlich kein 2er-Komplement einer 24-Bit-Zahl.

MfG Spess

von anfänger0815 (Gast)


Lesenswert?

Warum nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Warum nicht?

Weil das 2er-Komplement einer 24-Bit-Zahl etwas anders ist, als das 
2er-Komplement der einzelnen Bytes. Bei einer 24-Bitzahl muss das so
1
neg24:                com r16
2
                      com r17
3
                      com r18
4
                      subi r16,Low(-1)
5
                      sbci r17,byte2(-1)
6
                      sbci r18,byte3(-1)
7
                      ret

aussehen. Die Register solltest du allerdings an dein Programm anpassen.

MfG Spess

von anfänger0815 (Gast)


Lesenswert?

Könntes Du bitte kurz erklären was Du genau machst?

von spess53 (Gast)


Lesenswert?

Hi

>Könntes Du bitte kurz erklären was Du genau machst?

http://de.wikipedia.org/wiki/Zweierkomplement

MfG Spess

von anfänger0815 (Gast)


Lesenswert?

Des mit dem Zweierkomplement ist leuchtet schon ein,ich verstehe die 
Befehle nicht so richtig:

                      subi r16,Low(-1)
                      sbci r17,byte2(-1)
                      sbci r18,byte3(-1)

Was subi und sbci machen ist mir klar, aber was dann nach dem Komma 
kommt erschließt sich mir nicht so ganz.

von Uwe (de0508)


Lesenswert?

Hallo anfänger0815 ,

-1 besteht als 24-Bit Zahl aus 3 Byte, diese werden mit dem Operatoren 
ausgewählt.

Also Erst Byte 0, 1 und 2.

eine Subtraktion von -1 ist eine Addition - klar ?

von µC-Bastler (Gast)


Lesenswert?

anfänger0815 schrieb:
> Hoffe jetzt ist es besser

Noch besser wäre, wenn du deine seitenlangen Listings als Anhang postet. 
Vor lauter Scrollerei findet man sonst kaum noch die Textbeiträge ;-)

von anfänger0815 (Gast)


Lesenswert?

Ok, hätte ich vielleicht auch selber drauf kommen können. Aber wie so 
oft, sieht man den Wald vor lauter Bäume nicht. Danke

von anfänger0815 (Gast)


Lesenswert?

Könte man den Code:
1
neg24:                com r16
2
                      com r17
3
                      com r18
4
                      subi r16,Low(-1)
5
                      sbci r17,byte2(-1)
6
                      sbci r18,byte3(-1)
7
                      ret
auch so schreiben:
1
neg24:                com r16
2
                      com r17
3
                      com r18
4
                      ldi r19,1
5
                      add r16,r19
6
                      ldi r19,0
7
                      addc r17,r19
8
                      addc r18,r19
9
                      ret

von Helmut L. (helmi1)


Lesenswert?

anfänger0815 schrieb:
> auch so schreiben:neg24:                com r16
>                       com r17
>                       com r18
>                       ldi r19,1
>                       add r16,r19
>                       ldi r19,0
>                       addc r17,r19
>                       addc r18,r19
>                       ret

Ja, aber warum so umstaendlich? Mach dir ein Macro draus und du kannst 
es quasi als neuen Befehl verwenden.

von anfänger0815 (Gast)


Lesenswert?

Geht nur ums Verständnis

von spess53 (Gast)


Lesenswert?

Hi

>Geht nur ums Verständnis

Kann man so machen. Braucht aber ein zusätzliches Register und ist zwei 
Befehle länger.

MfG Spess

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.