www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik seltsames Problem mit SPI und 595


Autor: Dantor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

möchte per 74..595 mehrere 7 Segmentanzeigen ansteuern.
Momentan habe ich erstmal einen 595 angeschlossen.

Momentan bin ich bei 3 Varianten:

1. Über manuelles rüberschieben bekomme ich Daten rein.
2. Hardware SPI klappt dagegen nicht.
3. Software SPI irgendwie auch nicht. Das ist seltsam, zumal 1.) geht.
Hier kommt nur nicht reproduzierbares Chaos rüber, bei jedem µC reset 
etwas anderes.

Das Setup:

Der 595 ist über MISO, SCK und PD7 als RCK (der Pin, der die Register 
auf die Ausgangspins übernimmt) angeschlossen.
µC ist ein Mega32 mit 16Mhz Quarz.
Reset des 595 ist fest auf VCC, Output enable auf GND.

Variante 1 (Jedes Bit manuell rüberschieben):
#include <avr/io.h>
#include <stdlib.h>

#define  RCK_DDR DDRD
#define RCK_PORT PORTD
#define  RCK_PIN  7
#define SPI_MOSI   5
#define SPI_SCK    7
#define SPI_SS    4
#define DDR_SPI    PORTB



int main(void) {

  DDRD |= (1<<PD2); //macht eine LED an
  PORTD |= (1 << PD2);

  
  DDRB |= (1<<7) |  (1<<5); //sck und mosi
  DDRD |= (1<<7); 
  PORTB |= (1<<5);
  PORTB |= (1<<7);

  PORTB &= ~(1<<7);
  PORTB &= ~(1<<5);

  PORTB |= (1<<7);  //weitere Clockimpulse
  PORTB &= ~(1<<7);

  PORTB |= (1<<7);
  PORTB &= ~(1<<7);


  PORTB |= (1<<7);
  PORTB &= ~(1<<7);




  PORTD |= (1<<7);  //LEDs anmachen
  PORTD &= ~(1<<7);

  while (1)  {


  }

}

Variante 2: Hardware SPI
#include <avr/io.h>
#include <stdlib.h>

#define  RCK_DDR DDRD
#define RCK_PORT PORTD
#define  RCK_PIN  7
#define SPI_MOSI   5
#define SPI_SCK    7
#define SPI_SS    4
#define DDR_SPI    PORTB

void SPI_MasterInit(void);
void display_write(uint8_t dc) {

  SPDR = dc; 

  while (!(SPSR & (1 << SPIF)));
  
  RCK_PORT &= ~(1 << RCK_PIN); //LEDs anmachen
  RCK_PORT |= (1 << RCK_PIN);

}

int main(void) {

  SPI_MasterInit();
  display_write(0b10101010);

  DDRD |= (1<<PD2);
  PORTD |= (1 << PD2);

  while (1);


}

void SPI_MasterInit(void) {
  /* Set MOSI and SCK output, all others input */
  DDR_SPI = (1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS);
  /* Enable SPI, Master, set clock rate fck/2 */
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
  //SPSR |= (1 << SPI2X);
  
  RCK_DDR |= (1<<RCK_PIN);
  RCK_PORT |= (1<<RCK_PIN);
}

Variante 3: (Software SPI mit SPI Pins)
#include <avr/io.h>
#include <stdlib.h>

#define  RCK_DDR DDRD
#define RCK_PORT PORTD
#define  RCK_PIN  7
#define SPI_MOSI   5
#define SPI_SCK    7
#define SPI_SS    4
#define DDR_SPI    PORTB

void SPI_MasterInit(void);
void display_write(uint8_t dc) {

  unsigned char bits;
  for (bits = 8; bits > 0; bits--) {
    PORTB &= ~(1<<SPI_MOSI);
    if (dc & 0x80) {
      PORTB |= (1<<SPI_MOSI);
    }

    dc <<= 1;
    
    PORTB |= (1<<SPI_SCK);
    PORTB &= ~(1<<SPI_SCK);
  }


  RCK_PORT &= ~(1 << RCK_PIN);
  RCK_PORT |= (1 << RCK_PIN);

}

int main(void) {

  SPI_MasterInit();
  display_write(0b10101010);

  DDRD |= (1<<PD2);
  PORTD |= (1 << PD2);

  while (1);

}

void SPI_MasterInit(void) {
  /* Set MOSI and SCK output, all others input */
  DDR_SPI = (1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS);
  
  RCK_DDR |= (1<<RCK_PIN);
  RCK_PORT |= (1<<RCK_PIN);
  PORTB &= ~(1<<SPI_SCK);
}

Irgendwas essentielles muss ich übersehen, sonst würde entweder 1 auch 
nicht funktionieren oder aber 3 auch klappen.
Mein Ziel ist es, es per Hardware SPI hinzubekommen.

Der µC wird über Bootloader programmiert, es hängt kein Programmer an 
SPI.
Hat jemand eine Idee?

Autor: ggg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wenn da eine LED dran hängt dann brauchst du aber entweder eine 
high speed kamera oder ein "schnelles" auge:

 RCK_PORT &= ~(1 << RCK_PIN); //LEDs anmachen
  RCK_PORT |= (1 << RCK_PIN);



geht an und auch glecih wieder aus (kommt auf deine CPU Takfrequenc 
drauf an wie schnell aber ich schätze <1us )

bg

Autor: Dantor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay,

es muss natürlich statt
#define DDR_SPI    PORTB
#define DDR_SPI    DDRB

heißen und so läufts dann auch!
Ich sitze da echt seit 5 Stunden dran :)

Autor: Dantor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ggg schrieb:
> also wenn da eine LED dran hängt dann brauchst du aber entweder eine
> high speed kamera oder ein "schnelles" auge:

Das ist der "enable" Pin (Storage Clock), der die internen Flip Flops 
nach außen auf die Pins schaltet.

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.