www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISD1700 mit ATmega8 via SPI


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

Bewertung
0 lesenswert
nicht 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!


/*******************FUNKTIONEN*********************/
//Chip in SPI Mode versetzen
void PowerUp()        
{
PORTB&=~(1<<PB2);
SPDR = 0x01;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x00;
while(!(SPSR & (1<<SPIF)));
PORTB|=(1<<PB2);
}

//Wiedergabe oder Aufnahme stoppen
void Stop()          
{
PORTB&=~(1<<PB2);
SPDR = 0x02;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x00;
while(!(SPSR & (1<<SPIF)));
PORTB|=(1<<PB2);
}

//Alle Pointer zuruecksetzen und SPI Mode beenden
void Reset()        
{
PORTB&=~(1<<PB2);
SPDR = 0x03;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x00;
while(!(SPSR & (1<<SPIF)));
PORTB|=(1<<PB2);
}

//Von aktueller Position wiedergeben bis Stop oder EOM
void Play()          
{
PORTB&=~(1<<PB2);
SPDR = 0x40;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x00;
while(!(SPSR & (1<<SPIF)));
PORTB|=(1<<PB2);
}

//APC-Register uebertragen
void WriteAPC2(unsigned char data1, unsigned char data2)
{
PORTB&=~(1<<PB2);
SPDR = 0x65;
while(!(SPSR & (1<<SPIF)));
SPDR = data1;
while(!(SPSR & (1<<SPIF)));
SPDR = data2;
while(!(SPSR & (1<<SPIF)));
PORTB|=(1<<PB2);
}

/*******************HAUPTPROGRAMM******************/
int main(void)
{
  //MOSI, SCK und SS als Ausgaenge setzen
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);
  //SPI init:
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA)|(1<<DORD)|(1<<CPOL);
  //ISD in SPI-Mode versetzen:
  Reset();
  PowerUp();
  Stop();

  //          76543210    76543210
  WriteAPC2(0b00001010, 0b01000000);
  while(1)
  {
    Play();
    _delay_ms(1000);
    Stop();
    _delay_ms(500);
  }
  
}

Autor: Nico ... (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Schaltplan wäre wichtig um zu helfen!

Autor: Benjamin Buchner (Firma: HTL St.Pölten) (buchi1905)
Datum:
Angehängte Dateien:

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

Autor: Nico ... (nico123)
Datum:

Bewertung
0 lesenswert
nicht 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!)?

Autor: Benjamin Buchner (Firma: HTL St.Pölten) (buchi1905)
Datum:

Bewertung
0 lesenswert
nicht 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:
int main(void)
{
  //DDRC 3,4,5 als Ausgaenge setzen (Relais):
  DDRC |= (1<<PC3)|(1<<PC4)|(1<<PC5);
  //DDRB 2,3,5 als Ausgaenge setzen (SPI)
  //ISD-Reset
  DDRB |= (1<<PB6);
  //MOSI und SCK
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);
  //SPI init:
  sei();
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(1<<CPHA)|(1<<DORD)|(1<<CPOL);
  //Sounchip init:
  PORTB |= (1<<PB6);
  Reset();
  PowerUp();
  Stop();
  WriteAPC2(0b00001010, 0b01000000);
  while(1)
  {
    Play();
    _delay_ms(1000);
    Stop();
    _delay_ms(500);
  }
  
}

Autor: Nico ... (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit welcher Frequenz läuft die SPI?

Autor: Benjamin Buchner (Firma: HTL St.Pölten) (buchi1905)
Datum:

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

Es ist vielleicht wichtig, dass wie einen ATmega8L verwenden.

Autor: Nico ... (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie hoch ist euer Systemtakt?

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

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

HW-Settings:
Clock-Generator: 3.686 MHz

Autor: Nico ... (nico123)
Datum:

Bewertung
0 lesenswert
nicht 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!

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

Bewertung
0 lesenswert
nicht 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.

Autor: Manuel B. (Firma: HTBLuVA St.Pölten) (brauma)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Nico ... (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dafür ist das Forum ja da! :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.