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


von sasa (Gast)


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?

von Gast (Gast)


Lesenswert?

Ja.

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

von holger (Gast)


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.

von sasa (Gast)


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.

von holger (Gast)


Lesenswert?

>Und nacheinnander?

So gehts.

von sasa (Gast)


Lesenswert?

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

von sasa (Gast)


Lesenswert?

Danke!

von micha (Gast)


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.

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.