mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Einstellungen im Betrieb ändern


Autor: sasa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem. Ich wollte 2 SPI-Slaves an den atmega32 
anschließen: enc28j60(Netzwerk) und mlx90316(Winkelgeber).
enc28j60 läuft mit f/2, CPHA=0 und mlx90316 nur mit f/16,CPHA=1.
Wäre es möglich dass ich zum Winkelauslesen eine Interrruptroutine 
benutze, bei der zuerst die SPI-Parameter richtg einstelle, und danach 
wieder auf den alten Wert (Frequenz/CPHA) setze?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Ich würde das aber nicht alles in einer Interruptroutine machen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wäre es möglich dass ich zum Winkelauslesen eine Interrruptroutine
>benutze, bei der zuerst die SPI-Parameter richtg einstelle, und danach
>wieder auf den alten Wert (Frequenz/CPHA) setze?

Das wäre äußerst kontraproduktiv wenn die
Interruptroutine die SPI Routinen vom ENC unterbricht.
Dann kommt nur noch Müll dabei raus.

Autor: sasa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und nacheinnander? Es wird nicht oft unterbrochen, alle 3-4 Minuten für 
ca. 40 sec. Die Ausgabe von dem Webserver in der Unterbrechungs-Phase 
nicht kritisch.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und nacheinnander?

So gehts.

Autor: sasa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quatsch, nicht 40, sondern für 3-5 sec unterbrechen.

Autor: sasa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo sasa,

ich stehe gerade vor einen rätzel ich, ich versuche die ganze Zeit den 
mlx90316 über SPI auszuwerten aber bekomme leider nur Mull raus, 
entweder Nullen oder Einsen, als µc benutze ich einen atmega168, und 
einen npn-transistor(BC547), mein relevante stückCode Sieht So aus:

//*******************************************************

    DDRB  &=  ~(1 << MISO);
    DDRB  |=  ( (1 << MOSI) | (1 << SCK)| (1 << CS) );
    PORTB &=  ~((1 << MOSI) | (1 << MISO) | (1 << SCK));  //
  PORTB |= (1<<CS); //CS auf High
SPCR |= (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(1<<CPHA)|(1 << SPR1 )|( 0<< SPR0);
SPSR &= ~(1 << SPI2X);


PORTB &=~(1<<CS);
_delay_us(10);

  SPDR = 0xaa;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x0  = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x1  = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x2 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x3 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x4 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x5 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x6 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x7 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x8 = SPDR;
  _delay_us(10);

  SPDR = 0x00;
  while (!(SPSR&(1<<SPIF)));
  SPDR = 0xff;
  while (!(SPSR&(1<<SPIF)));
  x9 = SPDR;
  _delay_us(10);

PORTB|=(1<<CS);
_delay_ms(1);



habe ich was falsches dabei gemacht, ohne es zu merken?
ich bin für jede Art hilfe dankbar.

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.