Hallo!
Ich hab schon alle Datenblätter durch und beide ICs probiert.
http://www.alldatasheet.com/datasheet-pdf/pdf/228067/MICRONAS/MSP3400C.htmlhttp://www.alldatasheet.com/datasheet-pdf/pdf/103192/MICRONAS/MSP3410B.htmlhttp://www.alldatasheet.com/datasheet-pdf/pdf/103189/MICRONAS/MSP34X0G.html
Nun keines will funktionieren. Die ICs sind noch auf fertigen
Steckkarten, TV-Karten und Platinen drauf mit gescheiten RESET und
genauen +5V und +8V.
die Assemblersoftware funktioniert auch soweit drauf, zumindest
antworten die MSPs und die Spannungen stimmen auch soweit. Sogar das
Delay wird angesteuert und funktioniert einwandfrei.
Nur kommt kein Ton aus den Lautsprecherausgängen des MSP34x0.
Ich glaub ich hab einen Fehler im Code. Als Test wollte ich nur diesen
Code ausführen
<80> <00> <80> <00> RESET
<80> <00> <00> <00> INIT
<80> <10> <00> <30> <30> <08> FM-Eingang1
<80> <12> <00> <08> <02> <20> SCART-Eingang1 zu den Lautsprechern
<80> <12> <00> <0E> <13> <01> PAL-B/G
<80> <10> <00> <20> <00> <03> PAL-B/G
<80> <12> <00> <00> <AA> <00> Lautstärke ca. 80%
Nur eine Umschaltung findet nicht statt. Ich bin mir sicher dass ich was
überlesen habe und hoffe auf eure Hilfe.
Die MSPs wären endlich mal eine günstige Alternative für I2S-Projekte,
da viele TV-Geräte mit diesen IC verschrottet werden ;)
1
.include "2313def.inc"
2
3
4
.def temp1 = r16
5
.def temp2 = r17
6
.def temp3 = r18
7
.def temp4 = r19
8
.def ar0 = r20
9
.def status = r21
10
.def VOLL = r22
11
.def VOLR = r23
12
.def BASS = r28
13
.def TREB = r29
14
.def SWITCH = r30
15
16
;**** Global I2C Constants ****
17
18
.equ SCLP = 7 ; SCL für M50198P und MSP3400
19
.equ DENA = 4 ; ENABLE für M50198P
20
.equ SDAP = 5 ; SDA für M50198P und MSP3400
21
.equ SLED = 3 ;
22
.equ WLED = 6 ;
23
.equ STLED = 2 ; STOERUNG-LED
24
.equ MLED = 1 ;
25
.equ PLED = 0 ;
26
27
28
29
.equ b_dir = 0 ; transfer direction bit in i2cadr
30
.equ i2crd = 1
31
.equ i2cwr = 0
32
33
;**** Global Register Variables ****
34
35
.def i2cdelay= r24 ; Delay loop variable
36
.def i2cdata = r25 ; I2C data transfer register
37
.def i2cadr = r26 ; I2C address and direction register
Hallo!
irgentwo ist der Wurm drin. Ich bring es einfach nicht fertig einen
MSP3410 ( Multi-Sound-Processor ) anzusteuern. Bei TDA8420, TDA8421,
TDA8425, TDA9840, TDA9860, TDA6200, TDA6610 und TDA7313 ging das ohne
Probleme, so dass ich glaube, dass der Fehler in meiner Assemblerfile
steckt. Der MSP3410 sollte doch nur zum Test ganz einfach das NF-Signal
von SCART3 auf den Lautsprecherausgang übertragen, was nicht klappt. Ich
habe mich sogar extra dran gehalten den Demodulator zuerst zu justieren
und danach die Audioeinstellungen. Auf das RESET habe ich eh nicht
vergessen und da glaub ich ist der Wurm drin. Nach dem Reset über den
I2C-Bus setzt mir der MSP3410 SDA und SCL auf Low und verbleibt in
diesem Zustand. Den Hardware-Reset über den /RESET-Pin mache ich für ca.
1 Sekunde bevor der Mikrocontroller ( ATMEGA32 ) das Protokol startet.
Vielleicht findet jemand den Fehler für mich, da der IC schon recht
Klasse ist und billig kriegt und derzeit bei fast 80% der TV-Geräte zu
finden ist. Alleine die I2S-Ports könnte man für viele sinnvolle
Projekte verwenden. Ich hab sogar extra auf die INITs geachtet und nacht
10 bis 12 Protokollen legen mir die MSPs die I2C_Ports auf Masse und der
MSP macht dicht und lässt das Signal nicht durch.
Ich bedanke mich jetzt schon für jede Hilfe.
1
.include "m32def.inc"
2
3
.cseg
4
.org 0
5
6
.def temp1 = r16
7
.def temp2 = r17
8
.def temp3 = r18
9
.def temp4 = r19
10
.def ar0 = r20
11
.def status = r21
12
.def TESTING= r31
13
.def i2cdelay= r24 ; Delay loop variable
14
.def i2cdata = r25 ; I2C data transfer register
15
.def i2cadr = r26 ; I2C address and direction register
16
.def i2cstat = r27 ; I2C bus status register
17
18
.equ SCLP = 0 ; SCL für MSP3400
19
.equ DENA = 2 ;
20
.equ SDAP = 1 ; SDA für MSP3400
21
.equ b_dir = 0 ; transfer direction bit in i2cadr
22
.equ i2crd = 1
23
.equ i2cwr = 0
24
25
ldi temp1, RAMEND
26
out SPL, temp1
27
ldi temp1, RAMEND
28
out SPH, temp1
29
30
clr temp1
31
32
ldi temp1,0 ; Port C = Eingang
33
out DDRC, temp1
34
35
ldi temp1, $FF ; Port D = Ausgang
36
out DDRD, temp1
37
38
INIT:
39
40
cbi DDRB, DENA ; DENA im Ruhezustand immer auf 1.
41
cbi DDRB, SDAP ; SCL im Ruhezustand immer auf 1.
42
cbi DDRB, SCLP ; SDA im Ruhezustand immer auf 1.
43
44
rcall MSP_INIT
45
rjmp RESET_MSP
46
47
RESET_MSP:
48
49
rcall MSP_SEKUNDE
50
ldi i2cadr,$80 ; MSP3400
51
rcall i2c_start
52
rcall MSP_SEKUNDE
53
ldi i2cdata,$00 ; RESET-MSP
54
rcall i2c_do_transfer
55
ldi i2cdata,$80 ; HIGH
56
rcall i2c_do_transfer
57
ldi i2cdata,$00 ; LOW
58
rcall i2c_do_transfer
59
rcall i2c_stop
60
rcall MSP_SEKUNDE
61
ldi i2cadr,$80 ; MSP3400
62
rcall i2c_start
63
rcall MSP_SEKUNDE
64
ldi i2cdata,$00 ; INIT-MSP
65
rcall i2c_do_transfer
66
ldi i2cdata,$00 ; HIGH
67
rcall i2c_do_transfer
68
ldi i2cdata,$00 ; LOW
69
rcall i2c_do_transfer
70
rcall i2c_stop
71
rcall MSP_SEKUNDE
72
rcall MSP_SEKUNDE
73
rcall MSP_SEKUNDE
74
rjmp AD_CV
75
76
AD_CV:
77
78
ldi i2cadr,$80 ; MSP3400
79
rcall i2c_start
80
rcall MSP_SEKUNDE
81
ldi i2cdata,$10 ; STATUS-REGISTER
82
rcall i2c_do_transfer
83
ldi i2cdata,$00 ; HIGH
84
rcall i2c_do_transfer
85
ldi i2cdata,$BB ; LOW
86
rcall i2c_do_transfer
87
ldi i2cdata,$05 ; CONTROL-HIGH
88
rcall i2c_do_transfer
89
ldi i2cdata,$D0 ; CONTROL-LOW
90
rcall i2c_do_transfer
91
rcall i2c_stop
92
rcall MSP_SEKUNDE
93
rjmp AUDIO_PLL
94
95
AUDIO_PLL:
96
97
ldi i2cadr,$80 ; MSP3400
98
rcall i2c_start
99
rcall MSP_SEKUNDE
100
ldi i2cdata,$10 ; STATUS-REGISTER
101
rcall i2c_do_transfer
102
ldi i2cdata,$02 ; HIGH
103
rcall i2c_do_transfer
104
ldi i2cdata,$D7 ; LOW
105
rcall i2c_do_transfer
106
ldi i2cdata,$00 ; CONTROL-HIGH
107
rcall i2c_do_transfer
108
ldi i2cdata,$00 ; CONTROL-LOW
109
rcall i2c_do_transfer
110
rcall i2c_stop
111
rcall MSP_SEKUNDE
112
rjmp FIR_REG_1
113
114
FIR_REG_1:
115
116
ldi i2cadr,$80 ; MSP3400
117
rcall i2c_start
118
rcall MSP_SEKUNDE
119
ldi i2cdata,$10 ; STATUS-REGISTER
120
rcall i2c_do_transfer
121
ldi i2cdata,$00 ; HIGH
122
rcall i2c_do_transfer
123
ldi i2cdata,$01 ; LOW
124
rcall i2c_do_transfer
125
ldi i2cdata,18 ; CONTROL-HIGH
126
rcall i2c_do_transfer
127
ldi i2cdata,$00 ; CONTROL-LOW
128
rcall i2c_do_transfer
129
rcall i2c_stop
130
rcall MSP_SEKUNDE
131
rjmp FIR_REG_2
132
133
FIR_REG_2:
134
135
ldi i2cadr,$80 ; MSP3400
136
rcall i2c_start
137
rcall MSP_SEKUNDE
138
ldi i2cdata,$10 ; STATUS-REGISTER
139
rcall i2c_do_transfer
140
ldi i2cdata,$00 ; HIGH
141
rcall i2c_do_transfer
142
ldi i2cdata,$05 ; LOW
143
rcall i2c_do_transfer
144
ldi i2cdata,18 ; CONTROL-HIGH
145
rcall i2c_do_transfer
146
ldi i2cdata,$00 ; CONTROL-LOW
147
rcall i2c_do_transfer
148
rcall i2c_stop
149
rcall MSP_SEKUNDE
150
rjmp MODE_REG
151
152
MODE_REG:
153
154
ldi i2cadr,$80 ; MSP3400
155
rcall i2c_start
156
rcall MSP_SEKUNDE
157
ldi i2cdata,$10 ; STATUS-REGISTER
158
rcall i2c_do_transfer
159
ldi i2cdata,$00 ; HIGH
160
rcall i2c_do_transfer
161
ldi i2cdata,$83 ; LOW
162
rcall i2c_do_transfer
163
ldi i2cdata,$0C ; CONTROL-HIGH
164
rcall i2c_do_transfer
165
ldi i2cdata,$94 ; CONTROL-LOW
166
rcall i2c_do_transfer
167
rcall i2c_stop
168
rcall MSP_SEKUNDE
169
rjmp DCO_1_LO
170
171
DCO_1_LO:
172
173
ldi i2cadr,$80 ; MSP3400
174
rcall i2c_start
175
rcall MSP_SEKUNDE
176
ldi i2cdata,$10 ; STATUS-REGISTER
177
rcall i2c_do_transfer
178
ldi i2cdata,$00 ; HIGH
179
rcall i2c_do_transfer
180
ldi i2cdata,$93 ; LOW
181
rcall i2c_do_transfer
182
ldi i2cdata,$03 ; CONTROL-HIGH
183
rcall i2c_do_transfer
184
ldi i2cdata,$8E ; CONTROL-LOW
185
rcall i2c_do_transfer
186
rcall i2c_stop
187
rcall MSP_SEKUNDE
188
rjmp DCO_1_HI
189
190
DCO_1_HI:
191
192
ldi i2cadr,$80 ; MSP3400
193
rcall i2c_start
194
rcall MSP_SEKUNDE
195
ldi i2cdata,$10 ; STATUS-REGISTER
196
rcall i2c_do_transfer
197
ldi i2cdata,$00 ; HIGH
198
rcall i2c_do_transfer
199
ldi i2cdata,$9B ; LOW
200
rcall i2c_do_transfer
201
ldi i2cdata,$04 ; CONTROL-HIGH
202
rcall i2c_do_transfer
203
ldi i2cdata,$C6 ; CONTROL-LOW
204
rcall i2c_do_transfer
205
rcall i2c_stop
206
rcall MSP_SEKUNDE
207
rcall MSP_SEKUNDE
208
rcall MSP_SEKUNDE
209
rcall MSP_SEKUNDE
210
rjmp AD_CV_I
211
212
AD_CV_I:
213
ldi i2cadr,$80 ; MSP3400
214
rcall i2c_start
215
rcall MSP_SEKUNDE
216
ldi i2cdata,$10 ; STATUS-REGISTER
217
rcall i2c_do_transfer
218
ldi i2cdata,$00 ; HIGH
219
rcall i2c_do_transfer
220
ldi i2cdata,$BB ; LOW
221
rcall i2c_do_transfer
222
ldi i2cdata,$05 ; CONTROL-HIGH
223
rcall i2c_do_transfer
224
ldi i2cdata,$D0 ; CONTROL-LOW
225
rcall i2c_do_transfer
226
rcall i2c_stop
227
rcall MSP_SEKUNDE
228
rjmp AUDIO_PLL_I
229
230
AUDIO_PLL_I:
231
232
ldi i2cadr,$80 ; MSP3400
233
rcall i2c_start
234
rcall MSP_SEKUNDE
235
ldi i2cdata,$10 ; STATUS-REGISTER
236
rcall i2c_do_transfer
237
ldi i2cdata,$02 ; HIGH
238
rcall i2c_do_transfer
239
ldi i2cdata,$D7 ; LOW
240
rcall i2c_do_transfer
241
ldi i2cdata,$00 ; CONTROL-HIGH
242
rcall i2c_do_transfer
243
ldi i2cdata,$00 ; CONTROL-LOW
244
rcall i2c_do_transfer
245
rcall i2c_stop
246
rcall MSP_SEKUNDE
247
rjmp FIR_REG_1_I
248
249
FIR_REG_1_I:
250
251
ldi i2cadr,$80 ; MSP3400
252
rcall i2c_start
253
rcall MSP_SEKUNDE
254
ldi i2cdata,$10 ; STATUS-REGISTER
255
rcall i2c_do_transfer
256
ldi i2cdata,$00 ; HIGH
257
rcall i2c_do_transfer
258
ldi i2cdata,$01 ; LOW
259
rcall i2c_do_transfer
260
ldi i2cdata,18 ; CONTROL-HIGH
261
rcall i2c_do_transfer
262
ldi i2cdata,$00 ; CONTROL-LOW
263
rcall i2c_do_transfer
264
rcall i2c_stop
265
rcall MSP_SEKUNDE
266
rjmp FIR_REG_2_I
267
268
FIR_REG_2_I:
269
270
ldi i2cadr,$80 ; MSP3400
271
rcall i2c_start
272
rcall MSP_SEKUNDE
273
ldi i2cdata,$10 ; STATUS-REGISTER
274
rcall i2c_do_transfer
275
ldi i2cdata,$00 ; HIGH
276
rcall i2c_do_transfer
277
ldi i2cdata,$05 ; LOW
278
rcall i2c_do_transfer
279
ldi i2cdata,18 ; CONTROL-HIGH
280
rcall i2c_do_transfer
281
ldi i2cdata,$00 ; CONTROL-LOW
282
rcall i2c_do_transfer
283
rcall i2c_stop
284
rcall MSP_SEKUNDE
285
rjmp MODE_REG_I
286
287
MODE_REG_I:
288
289
ldi i2cadr,$80 ; MSP3400
290
rcall i2c_start
291
rcall MSP_SEKUNDE
292
ldi i2cdata,$10 ; STATUS-REGISTER
293
rcall i2c_do_transfer
294
ldi i2cdata,$00 ; HIGH
295
rcall i2c_do_transfer
296
ldi i2cdata,$83 ; LOW
297
rcall i2c_do_transfer
298
ldi i2cdata,$0C ; CONTROL-HIGH
299
rcall i2c_do_transfer
300
ldi i2cdata,$94 ; CONTROL-LOW
301
rcall i2c_do_transfer
302
rcall i2c_stop
303
rcall MSP_SEKUNDE
304
rjmp DCO_1_LO_I
305
306
DCO_1_LO_I:
307
308
ldi i2cadr,$80 ; MSP3400
309
rcall i2c_start
310
rcall MSP_SEKUNDE
311
ldi i2cdata,$10 ; STATUS-REGISTER
312
rcall i2c_do_transfer
313
ldi i2cdata,$00 ; HIGH
314
rcall i2c_do_transfer
315
ldi i2cdata,$93 ; LOW
316
rcall i2c_do_transfer
317
ldi i2cdata,$03 ; CONTROL-HIGH
318
rcall i2c_do_transfer
319
ldi i2cdata,$8E ; CONTROL-LOW
320
rcall i2c_do_transfer
321
rcall i2c_stop
322
rcall MSP_SEKUNDE
323
rjmp DCO_1_HI_I
324
325
DCO_1_HI_I:
326
327
ldi i2cadr,$80 ; MSP3400
328
rcall i2c_start
329
rcall MSP_SEKUNDE
330
ldi i2cdata,$10 ; STATUS-REGISTER
331
rcall i2c_do_transfer
332
ldi i2cdata,$00 ; HIGH
333
rcall i2c_do_transfer
334
ldi i2cdata,$9B ; LOW
335
rcall i2c_do_transfer
336
ldi i2cdata,$04 ; CONTROL-HIGH
337
rcall i2c_do_transfer
338
ldi i2cdata,$C6 ; CONTROL-LOW
339
rcall i2c_do_transfer
340
rcall i2c_stop
341
rcall MSP_SEKUNDE
342
rcall MSP_SEKUNDE
343
rcall MSP_SEKUNDE
344
rcall MSP_SEKUNDE
345
rjmp VOLUME
346
347
VOLUME:
348
349
ldi i2cadr,$80 ; MSP3400
350
rcall i2c_start
351
rcall MSP_SEKUNDE
352
ldi i2cdata,$12 ; STATUS-REGISTER
353
rcall i2c_do_transfer
354
ldi i2cdata,$00 ; HIGH
355
rcall i2c_do_transfer
356
ldi i2cdata,$00 ; LOW
357
rcall i2c_do_transfer
358
ldi i2cdata,$6A ; CONTROL-HIGH
359
rcall i2c_do_transfer
360
ldi i2cdata,$00 ; CONTROL-LOW
361
rcall i2c_do_transfer
362
rcall i2c_stop
363
rcall MSP_SEKUNDE
364
rjmp BALANCE
365
366
BALANCE:
367
368
ldi i2cadr,$80 ; MSP3400
369
rcall i2c_start
370
rcall MSP_SEKUNDE
371
ldi i2cdata,$12 ; STATUS-REGISTER
372
rcall i2c_do_transfer
373
ldi i2cdata,$00 ; HIGH
374
rcall i2c_do_transfer
375
ldi i2cdata,$01 ; LOW
376
rcall i2c_do_transfer
377
ldi i2cdata,$00 ; CONTROL-HIGH
378
rcall i2c_do_transfer
379
ldi i2cdata,$00 ; CONTROL-LOW
380
rcall i2c_do_transfer
381
rcall i2c_stop
382
rcall MSP_SEKUNDE
383
rjmp BASS
384
385
BASS:
386
387
ldi i2cadr,$80 ; MSP3400
388
rcall i2c_start
389
rcall MSP_SEKUNDE
390
ldi i2cdata,$12 ; STATUS-REGISTER
391
rcall i2c_do_transfer
392
ldi i2cdata,$00 ; HIGH
393
rcall i2c_do_transfer
394
ldi i2cdata,$02 ; LOW
395
rcall i2c_do_transfer
396
ldi i2cdata,$40 ; CONTROL-HIGH
397
rcall i2c_do_transfer
398
ldi i2cdata,$00 ; CONTROL-LOW
399
rcall i2c_do_transfer
400
rcall i2c_stop
401
rcall MSP_SEKUNDE
402
rjmp TREBLE
403
404
TREBLE:
405
406
ldi i2cadr,$80 ; MSP3400
407
rcall i2c_start
408
rcall MSP_SEKUNDE
409
ldi i2cdata,$12 ; STATUS-REGISTER
410
rcall i2c_do_transfer
411
ldi i2cdata,$00 ; HIGH
412
rcall i2c_do_transfer
413
ldi i2cdata,$03 ; LOW
414
rcall i2c_do_transfer
415
ldi i2cdata,$50 ; CONTROL-HIGH
416
rcall i2c_do_transfer
417
ldi i2cdata,$00 ; CONTROL-LOW
418
rcall i2c_do_transfer
419
rcall i2c_stop
420
rcall MSP_SEKUNDE
421
rjmp LOUDNESS
422
423
LOUDNESS:
424
425
ldi i2cadr,$80 ; MSP3400
426
rcall i2c_start
427
rcall MSP_SEKUNDE
428
ldi i2cdata,$12 ; STATUS-REGISTER
429
rcall i2c_do_transfer
430
ldi i2cdata,$00 ; HIGH
431
rcall i2c_do_transfer
432
ldi i2cdata,$04 ; LOW
433
rcall i2c_do_transfer
434
ldi i2cdata,$04 ; CONTROL-HIGH
435
rcall i2c_do_transfer
436
ldi i2cdata,$04 ; CONTROL-LOW
437
rcall i2c_do_transfer
438
rcall i2c_stop
439
rcall MSP_SEKUNDE
440
rjmp STEREO
441
442
STEREO:
443
444
ldi i2cadr,$80 ; MSP3400
445
rcall i2c_start
446
rcall MSP_SEKUNDE
447
ldi i2cdata,$12 ; STATUS-REGISTER
448
rcall i2c_do_transfer
449
ldi i2cdata,$00 ; HIGH
450
rcall i2c_do_transfer
451
ldi i2cdata,$05 ; LOW
452
rcall i2c_do_transfer
453
ldi i2cdata,$00 ; CONTROL-HIGH
454
rcall i2c_do_transfer
455
ldi i2cdata,$00 ; CONTROL-LOW
456
rcall i2c_do_transfer
457
rcall i2c_stop
458
rcall MSP_SEKUNDE
459
rjmp HEAD
460
461
HEAD:
462
463
ldi i2cadr,$80 ; MSP3400
464
rcall i2c_start
465
rcall MSP_SEKUNDE
466
ldi i2cdata,$12 ; STATUS-REGISTER
467
rcall i2c_do_transfer
468
ldi i2cdata,$00 ; HIGH
469
rcall i2c_do_transfer
470
ldi i2cdata,$06 ; LOW
471
rcall i2c_do_transfer
472
ldi i2cdata,$00 ; CONTROL-HIGH
473
rcall i2c_do_transfer
474
ldi i2cdata,$00 ; CONTROL-LOW
475
rcall i2c_do_transfer
476
rcall i2c_stop
477
rcall MSP_SEKUNDE
478
rjmp INPUT_PEGEL
479
480
INPUT_PEGEL:
481
482
ldi i2cadr,$80 ; MSP3400
483
rcall i2c_start
484
rcall MSP_SEKUNDE
485
ldi i2cdata,$12 ; STATUS-REGISTER
486
rcall i2c_do_transfer
487
ldi i2cdata,$00 ; HIGH
488
rcall i2c_do_transfer
489
ldi i2cdata,$07 ; LOW
490
rcall i2c_do_transfer
491
ldi i2cdata,$7F ; CONTROL-HIGH
492
rcall i2c_do_transfer
493
ldi i2cdata,$00 ; CONTROL-LOW
494
rcall i2c_do_transfer
495
rcall i2c_stop
496
rcall MSP_SEKUNDE
497
rjmp SOUND_OUT
498
499
SOUND_OUT:
500
501
ldi i2cadr,$80 ; MSP3400
502
rcall i2c_start
503
rcall MSP_SEKUNDE
504
ldi i2cdata,$12 ; STATUS-REGISTER
505
rcall i2c_do_transfer
506
ldi i2cdata,$00 ; HIGH
507
rcall i2c_do_transfer
508
ldi i2cdata,$08 ; LOW
509
rcall i2c_do_transfer
510
ldi i2cdata,$02 ; CONTROL-HIGH
511
rcall i2c_do_transfer
512
ldi i2cdata,$20 ; CONTROL-LOW
513
rcall i2c_do_transfer
514
rcall i2c_stop
515
rcall MSP_SEKUNDE
516
ldi i2cadr,$80 ; MSP3400
517
rcall i2c_start
518
rcall MSP_SEKUNDE
519
ldi i2cdata,$12 ; STATUS-REGISTER
520
rcall i2c_do_transfer
521
ldi i2cdata,$00 ; HIGH
522
rcall i2c_do_transfer
523
ldi i2cdata,$09 ; LOW
524
rcall i2c_do_transfer
525
ldi i2cdata,$02 ; CONTROL-HIGH
526
rcall i2c_do_transfer
527
ldi i2cdata,$20 ; CONTROL-LOW
528
rcall i2c_do_transfer
529
rcall i2c_stop
530
rcall MSP_SEKUNDE
531
ldi i2cadr,$80 ; MSP3400
532
rcall i2c_start
533
rcall MSP_SEKUNDE
534
ldi i2cdata,$12 ; STATUS-REGISTER
535
rcall i2c_do_transfer
536
ldi i2cdata,$00 ; HIGH
537
rcall i2c_do_transfer
538
ldi i2cdata,$0A ; LOW
539
rcall i2c_do_transfer
540
ldi i2cdata,$02 ; CONTROL-HIGH
541
rcall i2c_do_transfer
542
ldi i2cdata,$20 ; CONTROL-LOW
543
rcall i2c_do_transfer
544
rcall i2c_stop
545
rcall MSP_SEKUNDE
546
ldi i2cadr,$80 ; MSP3400
547
rcall i2c_start
548
rcall MSP_SEKUNDE
549
ldi i2cdata,$12 ; STATUS-REGISTER
550
rcall i2c_do_transfer
551
ldi i2cdata,$00 ; HIGH
552
rcall i2c_do_transfer
553
ldi i2cdata,$0B ; LOW
554
rcall i2c_do_transfer
555
ldi i2cdata,$02 ; CONTROL-HIGH
556
rcall i2c_do_transfer
557
ldi i2cdata,$20 ; CONTROL-LOW
558
rcall i2c_do_transfer
559
rcall i2c_stop
560
rcall MSP_SEKUNDE
561
rjmp SCART_P
562
563
SCART_P:
564
565
ldi i2cadr,$80 ; MSP3400
566
rcall i2c_start
567
rcall MSP_SEKUNDE
568
ldi i2cdata,$12 ; STATUS-REGISTER
569
rcall i2c_do_transfer
570
ldi i2cdata,$00 ; HIGH
571
rcall i2c_do_transfer
572
ldi i2cdata,$0D ; LOW
573
rcall i2c_do_transfer
574
ldi i2cdata,$7F ; CONTROL-HIGH
575
rcall i2c_do_transfer
576
ldi i2cdata,$00 ; CONTROL-LOW
577
rcall i2c_do_transfer
578
rcall i2c_stop
579
rcall MSP_SEKUNDE
580
rjmp IF_FM
581
582
IF_FM:
583
584
ldi i2cadr,$80 ; MSP3400
585
rcall i2c_start
586
rcall MSP_SEKUNDE
587
ldi i2cdata,$12 ; STATUS-REGISTER
588
rcall i2c_do_transfer
589
ldi i2cdata,$00 ; HIGH
590
rcall i2c_do_transfer
591
ldi i2cdata,$0E ; LOW
592
rcall i2c_do_transfer
593
ldi i2cdata,$7F ; CONTROL-HIGH
594
rcall i2c_do_transfer
595
ldi i2cdata,$01 ; CONTROL-LOW
596
rcall i2c_do_transfer
597
rcall i2c_stop
598
rcall MSP_SEKUNDE
599
rjmp DEEMPHASIS
600
601
DEEMPHASIS:
602
603
ldi i2cadr,$80 ; MSP3400
604
rcall i2c_start
605
rcall MSP_SEKUNDE
606
ldi i2cdata,$12 ; STATUS-REGISTER
607
rcall i2c_do_transfer
608
ldi i2cdata,$00 ; HIGH
609
rcall i2c_do_transfer
610
ldi i2cdata,$0F ; LOW
611
rcall i2c_do_transfer
612
ldi i2cdata,$00 ; CONTROL-HIGH
613
rcall i2c_do_transfer
614
ldi i2cdata,$00 ; CONTROL-LOW
615
rcall i2c_do_transfer
616
rcall i2c_stop
617
rcall MSP_SEKUNDE
618
rjmp NICAM
619
620
NICAM:
621
622
ldi i2cadr,$80 ; MSP3400
623
rcall i2c_start
624
rcall MSP_SEKUNDE
625
ldi i2cdata,$12 ; STATUS-REGISTER
626
rcall i2c_do_transfer
627
ldi i2cdata,$00 ; HIGH
628
rcall i2c_do_transfer
629
ldi i2cdata,$10 ; LOW
630
rcall i2c_do_transfer
631
ldi i2cdata,$00 ; CONTROL-HIGH
632
rcall i2c_do_transfer
633
ldi i2cdata,$00 ; CONTROL-LOW
634
rcall i2c_do_transfer
635
rcall i2c_stop
636
rcall MSP_SEKUNDE
637
rjmp NICAM_DEEM
638
639
NICAM_DEEM:
640
641
ldi i2cadr,$80 ; MSP3400
642
rcall i2c_start
643
rcall MSP_SEKUNDE
644
ldi i2cdata,$12 ; STATUS-REGISTER
645
rcall i2c_do_transfer
646
ldi i2cdata,$00 ; HIGH
647
rcall i2c_do_transfer
648
ldi i2cdata,$11 ; LOW
649
rcall i2c_do_transfer
650
ldi i2cdata,$00 ; CONTROL-HIGH
651
rcall i2c_do_transfer
652
ldi i2cdata,$00 ; CONTROL-LOW
653
rcall i2c_do_transfer
654
rcall i2c_stop
655
rcall MSP_SEKUNDE
656
rjmp INPUT
657
658
INPUT:
659
660
ldi i2cadr,$80 ; MSP3400
661
rcall i2c_start
662
rcall MSP_SEKUNDE
663
ldi i2cdata,$12 ; STATUS-REGISTER
664
rcall i2c_do_transfer
665
ldi i2cdata,$00 ; HIGH
666
rcall i2c_do_transfer
667
ldi i2cdata,$13 ; LOW
668
rcall i2c_do_transfer
669
ldi i2cdata,0b11000011 ; CONTROL-HIGH
670
rcall i2c_do_transfer
671
ldi i2cdata,$00 ; CONTROL-LOW
672
rcall i2c_do_transfer
673
rcall i2c_stop
674
rcall MSP_SEKUNDE
675
rjmp BEEP_OFF
676
677
BEEP_OFF:
678
679
ldi i2cadr,$80 ; MSP3400
680
rcall i2c_start
681
rcall MSP_SEKUNDE
682
ldi i2cdata,$12 ; STATUS-REGISTER
683
rcall i2c_do_transfer
684
ldi i2cdata,$00 ; HIGH
685
rcall i2c_do_transfer
686
ldi i2cdata,$14 ; LOW
687
rcall i2c_do_transfer
688
ldi i2cdata,$00 ; CONTROL-HIGH
689
rcall i2c_do_transfer
690
ldi i2cdata,$01 ; CONTROL-LOW
691
rcall i2c_do_transfer
692
rcall i2c_stop
693
rcall MSP_SEKUNDE
694
rjmp STOP
695
696
STOP:
697
rjmp STOP
698
699
700
MSP_INIT:
701
; =============================
702
; Warteschleifen-Generator
703
; 20000000 Zyklen:
704
; -----------------------------
705
; warte 19999992 Zyklen:
706
ldi R17, $BF
707
MSP0: ldi R18, $A7
708
MSP1: ldi R19, $D0
709
MSP2: dec R19
710
brne MSP2
711
dec R18
712
brne MSP1
713
dec R17
714
brne MSP0
715
; -----------------------------
716
; warte 6 Zyklen:
717
ldi R17, $02
718
MSP3: dec R17
719
brne MSP3
720
; -----------------------------
721
; warte 2 Zyklen:
722
nop
723
nop
724
; =============================
725
ret
726
727
Warte:
728
; =============================
729
;
730
; 8000000 Zyklen:
731
; -----------------------------
732
; warte 7999992 Zyklen:
733
ldi R20, $48
734
WGLOOP0a: ldi R22, $BC
735
WGLOOP1a: ldi R21, $C4
736
WGLOOP2a: dec R21
737
brne WGLOOP2a
738
dec R22
739
brne WGLOOP1a
740
dec R20
741
brne WGLOOP0a
742
; -----------------------------
743
; warte 6 Zyklen:
744
ldi R20, $02
745
WGLOOP3a: dec R20
746
brne WGLOOP3a
747
; -----------------------------
748
; warte 2 Zyklen:
749
nop
750
nop
751
ret
752
; =============================
753
754
WARTESCHLEIFE:
755
; Warteschleife für die seriellen Daten
756
; =====================================
757
; Warteschleife für 4MHz
758
; 40000 Zyklen:
759
; -------------------------------------
760
; warte 39999 Zyklen:
761
ldi R20, $43
762
WGLOOP0b: ldi R21, $C6
763
WGLOOP1b: dec R21
764
brne WGLOOP1b
765
dec R20
766
brne WGLOOP0b
767
; -------------------------------------
768
; warte 1 Zyklus:
769
nop
770
; =====================================
771
ret
772
773
MSP_SEKUNDE:
774
; =============================
775
; Warteschleifen-Generator
776
; 2400000 Zyklen:
777
; -----------------------------
778
; warte 2399820 Zyklen:
779
ldi temp1, $14
780
SE0: ldi temp2, $C6
781
SE1: ldi temp3, $C9
782
SE2: dec temp3
783
brne SE2
784
dec temp2
785
brne SE1
786
dec temp1
787
brne SE0
788
; -----------------------------
789
; warte 180 Zyklen:
790
ldi temp1, $3C
791
SE3: dec temp1
792
brne SE3
793
; =============================
794
795
796
; Warteschleifenende
797
798
i2c_hp_delay:
799
ldi i2cdelay,2
800
801
i2c_hp_delay_loop:
802
dec i2cdelay
803
brne i2c_hp_delay_loop
804
ret
805
806
i2c_qp_delay:
807
ldi i2cdelay,1
808
i2c_qp_delay_loop:
809
dec i2cdelay
810
brne i2c_qp_delay_loop
811
ret
812
813
814
i2c_rep_start:
815
sbi DDRC,SCLP ; force SCL low
816
cbi DDRC,SDAP ; release SDA
817
rcall i2c_hp_delay ; half period delay
818
cbi DDRC,SCLP ; release SCL
819
rcall i2c_qp_delay ; quarter period delay
820
821
i2c_start:
822
mov i2cdata,i2cadr ; copy address to transmitt register
823
sbi DDRC,SDAP ; force SDA low
824
rcall i2c_qp_delay ; quarter period delay
825
826
i2c_write:
827
sec ; set carry flag
828
rol i2cdata ; shift in carry and out bit one
829
rjmp i2c_write_first
830
i2c_write_bit:
831
lsl i2cdata ; if transmit register empty
832
833
i2c_write_first:
834
breq i2c_get_ack ; goto get acknowledge
835
sbi DDRC,SCLP ; force SCL low
836
837
brcc i2c_write_low ; if bit high
838
nop ; (equalize number of cycles)
839
cbi DDRC,SDAP ; release SDA
840
rjmp i2c_write_high
841
i2c_write_low: ; else
842
sbi DDRC,SDAP ; force SDA low
843
rjmp i2c_write_high ; (equalize number of cycles)
844
845
i2c_write_high:
846
rcall i2c_hp_delay ; half period delay
847
cbi DDRC,SCLP ; release SCL
848
rcall i2c_hp_delay ; half period delay
849
rjmp i2c_write_bit
850
851
i2c_get_ack:
852
853
sbi DDRC,SCLP ; force SCL low
854
cbi DDRC,SDAP ; release SDA
855
rcall i2c_hp_delay ; half period delay
856
cbi DDRC,SCLP ; release SCL
857
858
i2c_get_ack_wait:
859
sbis PINC,SCLP ; wait SCL high
860
;(In case wait states are inserted)
861
rjmp i2c_get_ack_wait
862
863
864
clc ; clear carry flag
865
sbic PINC,SDAP ; if SDA is high
866
867
sec ; set carry flag
868
rcall i2c_hp_delay ; half period delay
869
ret
870
871
i2c_do_transfer:
872
sbrs i2cadr,b_dir ; if dir = write
873
rjmp i2c_write ; goto write data
874
875
i2c_read:
876
rol i2cstat ; store acknowledge
877
; (used by i2c_put_ack)
878
ldi i2cdata,0x01 ; data = 0x01
879
i2c_read_bit: ; do
880
sbi DDRC,SCLP ; force SCL low
881
rcall i2c_hp_delay ; half period delay
882
883
cbi DDRC,SCLP ; release SCL
884
rcall i2c_hp_delay ; half period delay
885
886
clc ; clear carry flag
887
sbic PINC,SDAP ; if SDA is high
888
sec ; set carry flag
889
890
rol i2cdata ; store data bit
891
brcc i2c_read_bit ; while receive register not full
Wichtige Regeln - erst lesen, dann posten!
* Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Wäre doch zu schön, wenn sich die Leute dran hielten.
Habe den Fehler übrigens gefunden.
Man muss dazwischen auch noch die ganzen NICAM-Sachen justieren, dann
funktioniert auch die einfache Soundsteuerung.
Obwohl ich NICAM beim MSP3400 garnicht im IC habe, benötigt der den
ganzen Sch§§§. OK, ein negativer Punkt für den IC, abe der Sound der
jetzt raus komt ist einfach nur super.