www.mikrocontroller.net

Forum: Compiler & IDEs Schieberegister-Kaskade ansprechen


Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
ich hab hier eine Schaltung vor mir, wo 4 Schieberegister kaskadiert 
wurden. Die Ansteuerung der Schieberegister,74HC595D, erfolgt über SPI, 
Controller ist ein AtMega32.
Meine Frage dazu ist, wie steuere ich so was an, ich hatte mir ueberlegt 
das so zumachen:
Das Array ground_tab ist eine Vorgabe, diese Werte muessen ausgegeben 
werden:
#include <avr/io.h>
.
.
static uint32_t ground_tab[6] = {0xFD,0x2CF5,B6C95,AB2C55,5AB2663,C5C8A27B};
.
.
void init_spi(void)
{
  // Set MOSI, SS and SCK output, all others input
  DDRB |= (1<<PB4) | (1<<PB5) | (1<<PB7) | (1<<PB0) | (1<<PB1) | (1<<PB2);
  
  // Enable SPI, Master, set clock rate double
  SPCR |= (1<<SPE) | (0<<DORD) | (1<<MSTR) | (1<<CPHA);
  SPSR |= (1<<SPI2X);  
  SPDR = 0x01;
  SR_On;  
}

void spi_split(uint32_t data)
{
    int8_t i;
    uint8_t tmp;
    for(i=3;i >= 0; i--){
        tmp = (data >> (8*i));
        spi_senden(tmp);
    }
    SR_On();
    asm volatile ("nop");
    SR_Off;
}

void spi_senden(uint8_t cData)
{
  SR_Off;
  while(!(SPSR & (1<<SPIF)));
  SPDR = cData;
  while(!(SPSR & (1<<SPIF)));
  SR_On;
}

int main(void)
{
for(;;)
{
.
.
for(uint8_t i=0;i<6;i++)
{
spi_split(ground_tab[i]);
}
.
.
}
}
Das ist so wie ich mir das vorgestellt habe, kann das so funktionieren, 
hab damit noch keine Erfahrung.
Schon mal Danke,
Roland

Autor: Ja mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kann das so funktionieren,
Keine Ahnung, warum testest Du das nicht erst mal und fragst dann 
nochmal spezifischer wenn das Problem bekannt ist ?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Hardware kennst du selbst am besten.  Ich habe etwas ähnliches
zur Ansteuerung meiner Nixie-Uhr gebaut.  Hier sind die relevanten
Codeschnipsel:
static void
ioinit(void)
{
  /* PB0, /SS, MOSI, SCK output */
  DDRB = _BV(PB4) | _BV(PB5) | _BV(PB7);
  /* Setup SPI */
  SPCR = _BV(SPE) | _BV(MSTR);

...
}

/*
 * Transmit a single digit's bits to the shift register chain.  The
 * rightmost digit (seconds LSB) is transferred first.
 */
static void
spi_xmit(uint8_t num)
{
  uint8_t digit;

  if (num < DIGIT_OFF)
    digit = pgm_read_byte(digits + num);
  else
    digit = B0 | B0_;

  SPDR = digit;
  loop_until_bit_is_set(SPSR, SPIF);
}

/*
 * Update the '595 output latches from the values shifted through the
 * chain.
 */
static void
load_595_latches(void)
{
  PORTB |= _BV(PB4);
  PORTB &= ~_BV(PB4);
}
...
      if (update_display)
        {
          int8_t i;

          for (i = 5; i >= 0; i--)
            {
              if (display_enabled)
                spi_xmit(display_buf[i]);
              else
                spi_xmit(DIGIT_OFF);
            }

          load_595_latches();
        }

Unterschiede, die mir auffallen:

. du setzt CPHA (warum?)
. du setzt SPI2X (OK, hätte ich sicher auch tun können)
. du beschreibst SPDR am Anfang einmal mit 0x01, das löst einen
  Transfer aus, obwohl du doch eigentlich immer 4 Transfers im
  Block brauchst, oder?
. das Initialisieren von DDRB als ODER-Operation kostet eine
  sinnlose Einleseoperation; weise es doch einfach direkt zu

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.