Forum: Mikrocontroller und Digitale Elektronik Mein MSP3400 und mein MSP3410 wollen nicht funktionieren


von Alex F. (electronicfox)


Lesenswert?

Hallo!
Ich hab schon alle Datenblätter durch und beide ICs probiert.
http://www.alldatasheet.com/datasheet-pdf/pdf/228067/MICRONAS/MSP3400C.html
http://www.alldatasheet.com/datasheet-pdf/pdf/103192/MICRONAS/MSP3410B.html
http://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
38
.def  i2cstat  = r27      ; I2C bus status register
39
 
40
41
;-----------------------------------------------------------------------------
42
;
43
; Datensegment im RAM
44
;
45
;-----------------------------------------------------------------------------
46
 
47
.dseg
48
.org 0x60
49
Daten:      .byte 2    ; Speicherplatz für Eingangsdaten
50
.cseg
51
52
 
53
    ldi temp1, RAMEND
54
    out SPL, temp1
55
56
    clr temp1
57
           
58
    ;ldi temp1,0        ; Port B = Eingang
59
    ;out DDRB, temp1
60
 
61
    ldi temp1, $FF    ; 
62
    out DDRD, temp1
63
64
;**********************************************************************************
65
66
67
68
;**********************************************************************************
69
70
INIT:
71
    cbi  DDRB, DENA   ; DENA im Ruhezustand immer auf 1.
72
    cbi  DDRB, SDAP   ; SCL im Ruhezustand immer auf 1.
73
  cbi  DDRB, SCLP   ; SDA im Ruhezustand immer auf 1.
74
  Cbi  DDRB, STLED  ; ST-Led AUS
75
  
76
  
77
rjmp Delay  
78
79
Delay:
80
81
; Delay= 30ms.
82
83
    rcall WARTESCHLEIFE
84
  rcall WARTESCHLEIFE
85
  rcall WARTESCHLEIFE
86
  rcall WARTESCHLEIFE
87
88
  sbi   DDRB, DENA   ; DENA beim steuern des M50198P auf LOW
89
90
    ldi   temp1, 0b01101110
91
    rcall Schiebe
92
93
    ldi   temp1, 0b00100000
94
    rcall Schiebe
95
96
  rcall   WARTESCHLEIFE      ; Warten für die genaue Werte
97
98
    cbi  DDRB, DENA   ; DENA im Ruhezustand immer auf 1.
99
    cbi  DDRB, SDAP   ; SCL im Ruhezustand immer auf 1.
100
  cbi  DDRB, SCLP   ; SDA im Ruhezustand immer auf 1.
101
  cbi  DDRB, STLED  ; ST-Led AUS
102
103
    rcall WARTESCHLEIFE
104
  rcall WARTESCHLEIFE
105
  rcall WARTESCHLEIFE
106
  rcall WARTESCHLEIFE
107
  rjmp START
108
109
110
111
START:
112
    rcall IIC
113
  cbi  DDRB, DENA   ; DENA im Ruhezustand immer auf 1.
114
    cbi  DDRB, SDAP   ; SCL im Ruhezustand immer auf 1.
115
  cbi  DDRB, SCLP   ; SDA im Ruhezustand immer auf 1.
116
  
117
  rjmp STOP
118
119
STOP:
120
    rjmp STOP
121
122
  
123
124
125
;**********************************************************************************
126
127
IIC:
128
    
129
130
    rcall WARTESCHLEIFE
131
                  ; I²C-Busübertragung
132
    ldi  i2cadr,$80           ; MSP3400
133
    rcall  i2c_start
134
  sbic  PINB,SDAP     ; if SDA is high
135
  rjmp    Fehler
136
    ldi  i2cdata,$00          ; RESET-MSP
137
    rcall  i2c_do_transfer  
138
    ldi  i2cdata,$80           ; HIGH
139
    rcall  i2c_do_transfer  
140
  ldi  i2cdata,$00           ; LOW
141
    rcall  i2c_do_transfer
142
    rcall  i2c_stop
143
144
    rcall WARTESCHLEIFE
145
146
  ldi  i2cadr,$80           ; MSP3400
147
    rcall  i2c_start  
148
    ldi  i2cdata,$00          ; INIT-MSP
149
    rcall  i2c_do_transfer  
150
    ldi  i2cdata,$00           ; HIGH
151
    rcall  i2c_do_transfer  
152
  ldi  i2cdata,$00           ; LOW
153
    rcall  i2c_do_transfer
154
    rcall  i2c_stop
155
156
    rcall WARTESCHLEIFE
157
158
  ldi  i2cadr,$80           ; MSP3400
159
    rcall  i2c_start  
160
    ldi  i2cdata,$10          ; STATUS-REGISTER
161
    rcall  i2c_do_transfer  
162
    ldi  i2cdata,$00           ; FM1-HIGH
163
    rcall  i2c_do_transfer  
164
  ldi  i2cdata,$30           ; FM1-LOW
165
    rcall  i2c_do_transfer
166
  ldi  i2cdata,$30          ; CONTROL-HIGH
167
    rcall  i2c_do_transfer  
168
  ldi  i2cdata,$C8           ; CONTROL-LOW
169
    rcall  i2c_do_transfer
170
    rcall  i2c_stop
171
172
  rcall WARTESCHLEIFE
173
174
    ldi  i2cadr,$80           ; MSP3400
175
    rcall  i2c_start  
176
    ldi  i2cdata,$12          ; DSP
177
    rcall  i2c_do_transfer  
178
    ldi  i2cdata,$00           ; MATRIX-SCART
179
    rcall  i2c_do_transfer  
180
  ldi  i2cdata,$08           ; MATRIX-SCART
181
    rcall  i2c_do_transfer
182
  ldi  i2cdata,$02          ; 
183
    rcall  i2c_do_transfer  
184
  ldi  i2cdata,$20           ; 
185
    rcall  i2c_do_transfer
186
    rcall  i2c_stop
187
188
    rcall WARTESCHLEIFE
189
190
    ldi  i2cadr,$80           ; MSP3400
191
    rcall  i2c_start  
192
    ldi  i2cdata,$12          ; DSP
193
    rcall  i2c_do_transfer  
194
    ldi  i2cdata,$00           ; PAL-BG
195
    rcall  i2c_do_transfer  
196
  ldi  i2cdata,$0E           ; PAL-BG
197
    rcall  i2c_do_transfer
198
  ldi  i2cdata,$13          ; 
199
    rcall  i2c_do_transfer  
200
  ldi  i2cdata,$01           ; 
201
    rcall  i2c_do_transfer
202
    rcall  i2c_stop
203
204
    rcall WARTESCHLEIFE
205
206
  ldi  i2cadr,$80           ; MSP3400
207
    rcall  i2c_start  
208
    ldi  i2cdata,$10          ; DSP
209
    rcall  i2c_do_transfer  
210
    ldi  i2cdata,$00           ; PAL-BG
211
    rcall  i2c_do_transfer  
212
  ldi  i2cdata,$20           ; PAL-BG
213
    rcall  i2c_do_transfer
214
  ldi  i2cdata,$00          ; 
215
    rcall  i2c_do_transfer  
216
  ldi  i2cdata,$03           ; 
217
    rcall  i2c_do_transfer
218
    rcall  i2c_stop
219
220
    rcall WARTESCHLEIFE
221
222
    ldi  i2cadr,$80           ; MSP3400
223
    rcall  i2c_start  
224
    ldi  i2cdata,$12          ; DSP
225
    rcall  i2c_do_transfer  
226
    ldi  i2cdata,$00           ; LAUTSPRECHER-LAUTSTAERKE
227
    rcall  i2c_do_transfer  
228
  ldi  i2cdata,$00           ; LAUTSPRECHER-LAUTSTAERKE
229
    rcall  i2c_do_transfer
230
  ldi  i2cdata,$AA          ; 
231
    rcall  i2c_do_transfer  
232
  ldi  i2cdata,$00           ; 
233
    rcall  i2c_do_transfer
234
    rcall  i2c_stop
235
236
    
237
238
    rcall WARTESCHLEIFE
239
240
    ret
241
242
243
Fehler:
244
    sbi   DDRB, STLED  ; ST-LED leuchtet wenn der MSP3400 nicht antwortet
245
  rcall Warte
246
  rjmp Fehler
247
248
;Delayeinstellung 
249
250
251
;-----------------------------------------------------------------------------
252
;
253
; Die Ausgabe im Schieberegister in das Ausgaberegister übernehmen, wenn ein HC595 verwendet wird.
254
;
255
; Dazu am RCK Eingang am Schieberegister einen 0-1-0 Puls erzeugen
256
;
257
SchiebeOut:
258
    cbi   DDRB, DENA
259
    sbi   DDRB, DENA
260
    ret
261
 
262
;-----------------------------------------------------------------------------
263
;
264
; 8 Bits aus temp1 an das Schieberegister ausgeben
265
Schiebe:
266
    push  temp2
267
    ldi   temp2, 8             ; 8 Bits müssen ausgegeben werden
268
  rcall   WARTESCHLEIFE       ; Warten für die genaue Werte
269
 
270
Schiebe_1:
271
     ;
272
     ; jeweils das höchstwertige Bit aus temp1 ins Carry-Flag schieben
273
     ; Je nach Zustand des Carry-Flags wird die Datenleitung entsprechend
274
     ; gesetzt oder gelöscht
275
     ;
276
    rol  temp1                 ; MSB -> Carry
277
    brcs Schiebe_One           ; Carry gesetzt? -> weiter bei Schiebe_One
278
  rcall   WARTESCHLEIFE      ; Warten für die genaue Werte
279
    sbi  DDRB, SDAP     ; Eine 0 ausgeben
280
  rcall   WARTESCHLEIFE      ; Warten für die genaue Werte
281
    rjmp Schiebe_Clock         ; und Sprung zur Clock Puls Generierung
282
Schiebe_One:
283
    cbi  DDRB, SDAP     ; Eine 1 ausgeben
284
 
285
     ;
286
     ; einen Impuls an CLK zur Übernahme des Bits nachschieben
287
     ;
288
Schiebe_Clock:
289
    
290
    sbi   DDRB, SCLP    ; Clock-Ausgang auf 0 ...
291
  rcall   WARTESCHLEIFE      ; Warten für die genaue Werte
292
    cbi   DDRB, SCLP    ; und wieder zurück auf 1
293
    rcall   WARTESCHLEIFE      ; Warten für die genaue Werte
294
    dec   temp2                ; Anzahl der ausgegebenen Bits runterzählen
295
    brne  Schiebe_1            ; Wenn noch keine 8 Bits ausgegeben -> Schleife bilden
296
 
297
    pop   temp2
298
    ret
299
300
301
302
delay50us:                              ; 50us Pause
303
           ldi  temp1, $42
304
delay50us_:dec  temp1
305
           brne delay50us_
306
           ret                          ; wieder zurück
307
 
308
 ; Längere Pause für manche Befehle
309
delay5ms:                               ; 5ms Pause
310
           ldi  temp1, $21
311
WGLOOP0:   ldi  temp2, $C9
312
WGLOOP1:   dec  temp2
313
           brne WGLOOP1
314
           dec  temp1
315
           brne WGLOOP0
316
           ret                          ; wieder zurück
317
 
318
319
Warte:
320
; ============================= 
321
;    
322
;     8000000 Zyklen:
323
; ----------------------------- 
324
; warte 7999992 Zyklen:
325
          ldi  R20, $48
326
WGLOOP0a: ldi  R22, $BC
327
WGLOOP1a: ldi  R21, $C4
328
WGLOOP2a: dec  R21
329
          brne WGLOOP2a
330
          dec  R22
331
          brne WGLOOP1a
332
          dec  R20
333
          brne WGLOOP0a
334
; ----------------------------- 
335
; warte 6 Zyklen:
336
          ldi  R20, $02
337
WGLOOP3a: dec  R20
338
          brne WGLOOP3a
339
; ----------------------------- 
340
; warte 2 Zyklen:
341
          nop
342
          nop
343
      ret
344
; ============================= 
345
346
347
348
349
350
WARTESCHLEIFE:
351
; Warteschleife für die seriellen Daten
352
; ===================================== 
353
;   Warteschleife für 4MHz
354
;     40000 Zyklen:
355
; ------------------------------------- 
356
; warte 39999 Zyklen:
357
          ldi  R20, $43
358
WGLOOP0b: ldi  R21, $C6
359
WGLOOP1b: dec  R21
360
          brne WGLOOP1b
361
          dec  R20
362
          brne WGLOOP0b
363
; ------------------------------------- 
364
; warte 1 Zyklus:
365
          nop
366
; =====================================
367
          ret
368
369
; Warteschleifenende
370
371
372
373
; Hier die I2C-Routine:
374
375
;*********************************************************
376
;*                                                       *
377
;* ATMEL-Routine                                         *
378
;*                                                       *
379
;*********************************************************
380
381
382
383
384
                                    
385
                                    
386
;***************************************************************************
387
;*
388
;* FUNCTION
389
;*  i2c_hp_delay
390
;*  i2c_qp_delay
391
;*
392
;* DESCRIPTION
393
;*  Cristalclock or intern RC-Oscillator up to 4MHz
394
;*  Control I2C-Device with an ATTINY2313
395
;*
396
;*  SEE DOCUMENTATION !!!
397
;*
398
;* USAGE
399
;*  no parameters
400
;*
401
;* RETURN
402
;*  none
403
;*
404
;***************************************************************************
405
                                    
406
i2c_hp_delay:
407
ldi  i2cdelay,2
408
409
i2c_hp_delay_loop:
410
dec  i2cdelay
411
brne  i2c_hp_delay_loop
412
ret
413
                                    
414
i2c_qp_delay:
415
ldi  i2cdelay,1  
416
i2c_qp_delay_loop:
417
dec  i2cdelay
418
brne  i2c_qp_delay_loop
419
ret
420
                                    
421
                                    
422
;***************************************************************************
423
;*
424
;* FUNCTION
425
;*  i2c_rep_start
426
;*
427
;* DESCRIPTION
428
;*  Assert repeated start condition and sends slave address.
429
;*
430
;* USAGE
431
;*  i2cadr - Contains the slave address and transfer direction.
432
;*
433
;* RETURN
434
;*  Carry flag - Cleared if a slave responds to the address.
435
;*
436
;* NOTE
437
;*  IMPORTANT! : This funtion must be directly followed by i2c_start.
438
;*
439
;***************************************************************************
440
                                    
441
i2c_rep_start:
442
sbi  DDRB,SCLP    ; force SCL low
443
cbi  DDRB,SDAP    ; release SDA
444
rcall  i2c_hp_delay    ; half period delay
445
cbi  DDRB,SCLP    ; release SCL
446
rcall  i2c_qp_delay    ; quarter period delay
447
                                    
448
                                    
449
;***************************************************************************
450
;*
451
;* FUNCTION
452
;*  i2c_start
453
;*
454
;* DESCRIPTION
455
;*  Generates start condition and sends slave address.
456
;*
457
;* USAGE
458
;*  i2cadr - Contains the slave address and transfer direction.
459
;*
460
;* RETURN
461
;*  Carry flag - Cleared if a slave responds to the address.
462
;*
463
;* NOTE
464
;*  IMPORTANT! : This funtion must be directly followed by i2c_write.
465
;*
466
;***************************************************************************
467
                                    
468
i2c_start:        
469
mov  i2cdata,i2cadr    ; copy address to transmitt register
470
sbi  DDRB,SDAP    ; force SDA low
471
rcall  i2c_qp_delay    ; quarter period delay
472
                                    
473
                                    
474
;***************************************************************************
475
;*
476
;* FUNCTION
477
;*  i2c_write
478
;*
479
;* DESCRIPTION
480
;*  Writes data (one byte) to the I2C bus. Also used for sending
481
;*  the address.
482
;*
483
;* USAGE
484
;*  i2cdata - Contains data to be transmitted.
485
;*
486
;* RETURN
487
;*  Carry flag - Set if the slave respond transfer.
488
;*
489
;* NOTE
490
;*  IMPORTANT! : This funtion must be directly followed by i2c_get_ack.
491
;*
492
;***************************************************************************
493
                                    
494
i2c_write:
495
sec        ; set carry flag
496
rol  i2cdata      ; shift in carry and out bit one
497
rjmp  i2c_write_first
498
i2c_write_bit:
499
lsl  i2cdata      ; if transmit register empty
500
501
i2c_write_first:
502
breq  i2c_get_ack    ;  goto get acknowledge
503
sbi  DDRB,SCLP    ; force SCL low
504
                                    
505
brcc  i2c_write_low    ; if bit high
506
nop        ;  (equalize number of cycles)
507
cbi  DDRB,SDAP    ;  release SDA
508
rjmp  i2c_write_high
509
i2c_write_low:        ; else
510
sbi  DDRB,SDAP    ;  force SDA low
511
rjmp  i2c_write_high    ;  (equalize number of cycles)
512
513
i2c_write_high:
514
rcall  i2c_hp_delay    ; half period delay
515
cbi  DDRB,SCLP    ; release SCL
516
rcall  i2c_hp_delay    ; half period delay
517
rjmp  i2c_write_bit
518
                                    
519
                                    
520
;***************************************************************************
521
;*
522
;* FUNCTION
523
;*
524
;* DESCRIPTION
525
;*  Get slave acknowledge response.
526
;*
527
;* USAGE
528
;*  (used only by i2c_write in this version)
529
;*
530
;* RETURN
531
;*  Carry flag - Cleared if a slave responds to a request.
532
;*
533
;***************************************************************************
534
                                    
535
i2c_get_ack:
536
537
sbi  DDRB,SCLP    ; force SCL low
538
cbi  DDRB,SDAP    ; release SDA
539
rcall  i2c_hp_delay    ; half period delay
540
cbi  DDRB,SCLP    ; release SCL
541
                                    
542
i2c_get_ack_wait:
543
sbis  PINB,SCLP    ; wait SCL high 
544
                                              ;(In case wait states are inserted)
545
rjmp i2c_get_ack_wait
546
547
                                    
548
clc        ; clear carry flag
549
sbic  PINB,SDAP    ; if SDA is high
550
551
sec        ;  set carry flag
552
rcall  i2c_hp_delay    ; half period delay
553
ret
554
                                    
555
                                    
556
;***************************************************************************
557
;*
558
;* FUNCTION
559
;*  i2c_do_transfer
560
;*
561
;* DESCRIPTION
562
;*  Executes a transfer on bus. This is only a combination of i2c_read
563
;*  and i2c_write for convenience.
564
;*
565
;* USAGE
566
;*  i2cadr - Must have the same direction as when i2c_start was called.
567
;*  see i2c_read and i2c_write for more information.
568
;*
569
;* RETURN
570
;*  (depends on type of transfer, read or write)
571
;*
572
;* NOTE
573
;*  IMPORTANT! : This funtion must be directly followed by i2c_read.
574
;*
575
;***************************************************************************
576
                                    
577
i2c_do_transfer:
578
sbrs  i2cadr,b_dir    ; if dir = write
579
rjmp  i2c_write    ;  goto write data
580
                                    
581
                                    
582
;***************************************************************************
583
;*
584
;* FUNCTION
585
;*  i2c_read
586
;*
587
;* DESCRIPTION
588
;*  Reads data (one byte) from the I2C bus.
589
;*
590
;* USAGE
591
;*  Carry flag -   If set no acknowledge is given to the slave
592
;*      indicating last read operation before a STOP.
593
;*      If cleared acknowledge is given to the slave
594
;*      indicating more data.
595
;*
596
;* RETURN
597
;*  i2cdata - Contains received data.
598
;*
599
;* NOTE
600
;*  IMPORTANT! : This funtion must be directly followed by i2c_put_ack.
601
;*
602
;***************************************************************************
603
                                    
604
i2c_read:
605
rol  i2cstat      ; store acknowledge
606
                                              ; (used by i2c_put_ack)
607
ldi  i2cdata,0x01    ; data = 0x01
608
i2c_read_bit:        ; do
609
sbi  DDRB,SCLP    ;   force SCL low
610
rcall  i2c_hp_delay    ;  half period delay
611
                                    
612
cbi  DDRB,SCLP    ;  release SCL
613
rcall  i2c_hp_delay    ;  half period delay
614
                                    
615
clc        ;  clear carry flag
616
sbic  PINB,SDAP    ;  if SDA is high
617
sec        ;    set carry flag
618
                                    
619
rol  i2cdata      ;   store data bit
620
brcc  i2c_read_bit    ; while receive register not full
621
                                    
622
                                    
623
;***************************************************************************
624
;*
625
;* FUNCTION
626
;*  i2c_put_ack
627
;*
628
;* DESCRIPTION
629
;*  Put acknowledge.
630
;*
631
;* USAGE
632
;*  (used only by i2c_read in this version)
633
;*
634
;* RETURN
635
;*  none
636
;*
637
;***************************************************************************
638
                                    
639
i2c_put_ack:
640
sbi  DDRB,SCLP    ; force SCL low
641
ror  i2cstat      ; get status bit
642
brcc  i2c_put_ack_low    ; if bit low goto assert low
643
cbi  DDRB,SDAP    ;  release SDA
644
rjmp  i2c_put_ack_high
645
646
i2c_put_ack_low:      ; else
647
sbi  DDRB,SDAP    ;  force SDA low
648
i2c_put_ack_high:
649
                                    
650
rcall  i2c_hp_delay    ; half period delay
651
cbi  DDRB,SCLP    ; release SCL
652
i2c_put_ack_wait:
653
sbis  PINB,SCLP    ; wait SCL high
654
rjmp  i2c_put_ack_wait
655
rcall  i2c_hp_delay    ; half period delay
656
ret
657
                                    
658
                                    
659
;***************************************************************************
660
;*
661
;* FUNCTION
662
;*  i2c_stop
663
;*
664
;* DESCRIPTION
665
;*  Assert stop condition.
666
;*
667
;* USAGE
668
;*  No parameters.
669
;*
670
;* RETURN
671
;*  None.
672
;*
673
;***************************************************************************
674
                                    
675
i2c_stop:
676
sbi  DDRB,SCLP    ; force SCL low
677
sbi  DDRB,SDAP    ; force SDA low
678
rcall  i2c_hp_delay    ; half period delay
679
cbi  DDRB,SCLP    ; release SCL
680
rcall  i2c_qp_delay    ; quarter period delay
681
cbi  DDRB,SDAP    ; release SDA
682
rcall  i2c_hp_delay    ; half period delay
683
ret
684
                                    
685
                                    
686
;***************************************************************************
687
;*
688
;* FUNCTION
689
;*  i2c_init
690
;*
691
;* DESCRIPTION
692
;*  Initialization of the I2C bus interface.
693
;*
694
;* USAGE
695
;*  Call this function once to initialize the I2C bus. No parameters
696
;*  are required.
697
;*
698
;* RETURN
699
;*  None
700
;*
701
;* NOTE
702
;*  PORTC and DDRC pins not used by the I2C bus interface will be
703
;*  set to Hi-Z (!).
704
;*
705
;* COMMENT
706
;*  This function can be combined with other PORTC initializations.
707
;*
708
;***************************************************************************
709
                                    
710
i2c_init:
711
clr  i2cstat      ; clear I2C status register (used
712
                                              ; as a temporary register)
713
out  PORTB,i2cstat    ; set I2C pins to open colector
714
out  DDRB,i2cstat
715
ret
716
717
718
719
720
;*****************************************************************************************************
721
;*                                                                                                   *
722
;* Ende der ATMEL-Applikation                                                                        *
723
;*                                                                                                   *
724
;*****************************************************************************************************

von Alex F. (electronicfox)


Lesenswert?

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
892
                                    
893
i2c_put_ack:
894
sbi  DDRC,SCLP    ; force SCL low
895
ror  i2cstat      ; get status bit
896
brcc  i2c_put_ack_low    ; if bit low goto assert low
897
cbi  DDRC,SDAP    ;  release SDA
898
rjmp  i2c_put_ack_high
899
900
i2c_put_ack_low:      ; else
901
sbi  DDRC,SDAP    ;  force SDA low
902
i2c_put_ack_high:
903
                                    
904
rcall  i2c_hp_delay    ; half period delay
905
cbi  DDRC,SCLP    ; release SCL
906
i2c_put_ack_wait:
907
sbis  PINC,SCLP    ; wait SCL high
908
rjmp  i2c_put_ack_wait
909
rcall  i2c_hp_delay    ; half period delay
910
ret
911
                                    
912
i2c_stop:
913
sbi  DDRC,SCLP    ; force SCL low
914
sbi  DDRC,SDAP    ; force SDA low
915
rcall  i2c_hp_delay    ; half period delay
916
cbi  DDRC,SCLP    ; release SCL
917
rcall  i2c_qp_delay    ; quarter period delay
918
cbi  DDRC,SDAP    ; release SDA
919
rcall  i2c_hp_delay    ; half period delay
920
ret
921
                                   
922
i2c_init:
923
clr  i2cstat      ; clear I2C status register (used
924
                                              ; as a temporary register)
925
out  PORTC,i2cstat    ; set I2C pins to open colector
926
out  DDRC,i2cstat
927
ret

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Nörgler (Gast)


Lesenswert?

Also ich hoffe, dass sich das keiner durchliest....gRRRR

von Verwandter (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wäre doch zu schön, wenn sich die Leute dran hielten.
Wäre aber auch kein Problem, die Zeichen zu zählen.

von Alex F. (electronicfox)


Angehängte Dateien:

Lesenswert?

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.

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.