Forum: Mikrocontroller und Digitale Elektronik ISD1700 mit ATmega8 via SPI


von Manuel B. (Firma: HTBLuVA St.Pölten) (brauma)


Lesenswert?

Hallo!
Wir würden gerne mit einem ATmega8 den ISD1700 via SPI-Schnittstelle 
steuern. Leider scheint irgendetwas am Code nicht zu stimmen, denn der 
ISD gibt einfach keinen Mucks von sich. Wenn wir den Play-Pin mit einem 
Drahtstück gegen Masse ziehen spielt der Chip.

Wir sind schon seit einigen Wochen verzweifelt am Fehlersuchen, kommen 
aber einfach nicht drauf, was wir falsch machen bzw wo der Fehler im 
Programm sein könnte.

Wir wären sehr dankbar für Hilfestellungen!


1
/*******************FUNKTIONEN*********************/
2
//Chip in SPI Mode versetzen
3
void PowerUp()        
4
{
5
PORTB&=~(1<<PB2);
6
SPDR = 0x01;
7
while(!(SPSR & (1<<SPIF)));
8
SPDR = 0x00;
9
while(!(SPSR & (1<<SPIF)));
10
PORTB|=(1<<PB2);
11
}
12
13
//Wiedergabe oder Aufnahme stoppen
14
void Stop()          
15
{
16
PORTB&=~(1<<PB2);
17
SPDR = 0x02;
18
while(!(SPSR & (1<<SPIF)));
19
SPDR = 0x00;
20
while(!(SPSR & (1<<SPIF)));
21
PORTB|=(1<<PB2);
22
}
23
24
//Alle Pointer zuruecksetzen und SPI Mode beenden
25
void Reset()        
26
{
27
PORTB&=~(1<<PB2);
28
SPDR = 0x03;
29
while(!(SPSR & (1<<SPIF)));
30
SPDR = 0x00;
31
while(!(SPSR & (1<<SPIF)));
32
PORTB|=(1<<PB2);
33
}
34
35
//Von aktueller Position wiedergeben bis Stop oder EOM
36
void Play()          
37
{
38
PORTB&=~(1<<PB2);
39
SPDR = 0x40;
40
while(!(SPSR & (1<<SPIF)));
41
SPDR = 0x00;
42
while(!(SPSR & (1<<SPIF)));
43
PORTB|=(1<<PB2);
44
}
45
46
//APC-Register uebertragen
47
void WriteAPC2(unsigned char data1, unsigned char data2)
48
{
49
PORTB&=~(1<<PB2);
50
SPDR = 0x65;
51
while(!(SPSR & (1<<SPIF)));
52
SPDR = data1;
53
while(!(SPSR & (1<<SPIF)));
54
SPDR = data2;
55
while(!(SPSR & (1<<SPIF)));
56
PORTB|=(1<<PB2);
57
}
58
59
/*******************HAUPTPROGRAMM******************/
60
int main(void)
61
{
62
  //MOSI, SCK und SS als Ausgaenge setzen
63
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);
64
  //SPI init:
65
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA)|(1<<DORD)|(1<<CPOL);
66
  //ISD in SPI-Mode versetzen:
67
  Reset();
68
  PowerUp();
69
  Stop();
70
71
  //          76543210    76543210
72
  WriteAPC2(0b00001010, 0b01000000);
73
  while(1)
74
  {
75
    Play();
76
    _delay_ms(1000);
77
    Stop();
78
    _delay_ms(500);
79
  }
80
  
81
}

von Nico (nico123)


Lesenswert?

Ein Schaltplan wäre wichtig um zu helfen!

von Benjamin B. (Firma: HTL St.Pölten) (buchi1905)


Angehängte Dateien:

Lesenswert?

Manuel B. und ich arbeiten an diesem Projekt.
Hier sind die Schaltpläne dazu.
Bei Fragen zum Schaltplan einfach melden.
mfG

von Nico (nico123)


Lesenswert?

Was macht Ihr mit dem Reset vom ISD1700?
Der wird in eurem Programm garnicht gesetzt (-> undefinierter Pegel). Wo 
geht der RES_ISD noch ran (ist schwer zu erkennen im Schaltplan!)?

von Benjamin B. (Firma: HTL St.Pölten) (buchi1905)


Lesenswert?

Der ist über den µC auf H geschaltet. Das haben wir der einfachheit 
halber aus dem Code genommen weil wir uns sicher sind das der Chip 
funktioniert, nur der SPI-Mode nicht. Über den Play-Taster lässt sich 
die Musik ohne Probleme abspielen.

Der RES_ISD ist nur zwischen dem Reset Pin des ISD und dem PB6.

Hier der ungekürzte Code:
1
int main(void)
2
{
3
  //DDRC 3,4,5 als Ausgaenge setzen (Relais):
4
  DDRC |= (1<<PC3)|(1<<PC4)|(1<<PC5);
5
  //DDRB 2,3,5 als Ausgaenge setzen (SPI)
6
  //ISD-Reset
7
  DDRB |= (1<<PB6);
8
  //MOSI und SCK
9
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);
10
  //SPI init:
11
  sei();
12
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA)|(1<<DORD)|(1<<CPOL);
13
  //Sounchip init:
14
  PORTB |= (1<<PB6);
15
  Reset();
16
  PowerUp();
17
  Stop();
18
  WriteAPC2(0b00001010, 0b01000000);
19
  while(1)
20
  {
21
    Play();
22
    _delay_ms(1000);
23
    Stop();
24
    _delay_ms(500);
25
  }
26
  
27
}

von Nico (nico123)


Lesenswert?

Mit welcher Frequenz läuft die SPI?

von Benjamin B. (Firma: HTL St.Pölten) (buchi1905)


Lesenswert?

lt. Konfiguaration haben wir einen Clock-Teiler von 128 eingestellt.
(1<<SPR0)|(1<<SPR1)

Es ist vielleicht wichtig, dass wie einen ATmega8L verwenden.

von Nico (nico123)


Lesenswert?

Und wie hoch ist euer Systemtakt?

von Manuel B. (Firma: HTBLuVA St.Pölten) (brauma)


Lesenswert?

Fuses:
Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms; default value

HW-Settings:
Clock-Generator: 3.686 MHz

von Nico (nico123)


Lesenswert?

Okay, also 1MHz...dann könntet ihr den Vorteiler für die SPI auf 1 
setzen, aber das sollte nicht das Problem sein!
Laut Datenblatt soll nach dem Chipselect eine Dauer von 500ns gewartet 
werden bis Takt und Daten kommen, also würde ich dort mal 'ne Wartezeit 
einbauen.
Habt ihr ein Oszi zum kontrollieren der SPI-Schnittstelle da?

Und hier: WriteAPC2(0b00001010, 0b01000000); werden die oberen 4 Bit 
der zweiten Variable nicht berücksichtig, d.h. das setzen der 1 ist 
irrelevant!

von Manuel B. (Firma: HTBLuVA St.Pölten) (brauma)


Lesenswert?

Ich glaube, das Problem gefunden zu haben bzw. hat Nico mich darauf 
gebracht. Die beiden Bytes aus dem WriteAPC2 gehören vertauscht. Wir 
haben anscheinend die Reihenfolge vertauscht. Deswegen auch das unnötige 
Bit, welches Nico angesprochen hat.

So wie wir es bis jetzt versucht haben, ist das FT-Bit (D6, also im 
ersten übertragenen Byte) im APC nicht gesetzt.
Wenn ich die Beschreibung im Datenblatt richtig interpretiere, sollte 
das FT-Bit für unsere Anwendung gesetzt werden.

Leider können wir das erst morgen Mittags testen, da das Projekt in der 
Schule liegt.

Wir werden uns auf alle Fälle morgen im Laufe des Nachmittags nochmal zu 
Wort melden.

von Manuel B. (Firma: HTBLuVA St.Pölten) (brauma)


Angehängte Dateien:

Lesenswert?

Ok, der Fehler lag wirklich an dem nicht-gesetzten FT-Bit. Der ISD 
spielt jetzt ohne Probleme!

Danke für die Hilfe nico123!

Den richtigen Code habe ich jetzt nochmal als Anhang angefügt, falls es 
jemanden interessiert.

von Nico (nico123)


Lesenswert?

Dafür ist das Forum ja da! :-)

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.