www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Test 74HC595


Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich taste mich an das SPI heran und habe wohl gleich einen Schritt ins 
Leere gemacht.

Die Hardware Hardware besteht aus dem µC Atmega 169 (Butterfly) und 
einem 74HC595, Ausgangsseitig habe ich 8 LED's.
Aus dem Datenblatt und Beispielen hier im Forum habe ich mir ein 
Testprogramm zusammen gestrickt.
Das Compilieren und Flashen (via ISP - Druckerschnittstelle) läuft ohne 
Feher, nur meine LED's rühren sich nicht.
Hier mein C-Programm. Kann mir jemand sagen wo da mein Fehler ist?
/* SPI-Test.c */

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "util/delay.h"

void spi_Masterinit (void); 
void spi_Mastershiftout(uint8_t data);

#ifndef F_CPU
#define F_CPU 10000000UL     // Takt CPU wird auf 1Mhz gesetzt
#endif

int main(void)
{  
  void spi_Masterinit (void) {
   // Set MOSI and SCK
   DDRB = (1<<DDB2)|(1<<DDB1);   // DDB2 is MOSI, DDB1 is SCK
   // enable|as master|CPHA|1/16clk 
   SPCR |= (1<<6)|(1<<4)|(1<<2)|(1<<0);
  }

  char data=170;

  while(1){ 

    void spi_Mastershiftout(char data){
     //=== Start transmission 
     SPDR = data;
     //=== Wait for transmission complete (bit7 in SPSR get 1) 
     while(!(SPSR & (1<<7))); //7=SPIF bit in SPSR
    }//spi_writetoshift

  }  //while 
   for(;;); 
} /* end main */

Dank für Eure Hilfe
Gruß
Dietmar

Autor: Jens PICler (picler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob die SPI-Hardware des AVR den 595 ansteuern kann, weiß ich nicht. Auf 
jeden Fall ist der 595 nur ein simples serielles Schieberegister, bei 
dem ausgangsseitig ein paar Besonderheiten zu beachten sind. Es gibt 
einen Freigabeeingang, mit dem die Ausgänge aktiviert werden und ein 
Steuereingang für das Ausgangslatch. Damit kann man nach erfolgtem 
Schieben den Inhalt des SR an die Ausgänge schicken. Diese Lösung 
verhindert, dass die Ausgangspins während des Schiebens undefinierte 
Zustände einnehmen.

Ich vermut, dass dort dein Problem liegt, denn falls die Kommunikation 
mit den Controller nicht sauber läuft, würde zumindest irgendwas bei den 
LEDs passieren.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Pin /SS muß Ausgang sein oder wenn Eingang, dann auf L, damit der SPI im 
Master-Mode ist.

-> Datenblatt AVR

Gruß aus Berlin
Michael

Autor: Kollektiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, es muss der zweite CLK Pin beschaltet werden, und du brauchst den 
Latch Puls. Siehe: 
http://www.mikrocontroller.net/articles/AVR-Tutori...

Warum deklarierst du die Funktion innerhalb der main()?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast spi_Mastershiftout() etwas unüblich definiert. Funktionen 
definiert man besser außerhalb von Funktionen.

Aber Du rufst es nirgends auf.

Und Du muß noch RCLK takten, sonst wird nix übernommen.


Peter

Autor: Kollektiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(!(SPSR & (1<<7))); //7=SPIF bit in SPSR
geht auch so mit gcc:
 while(!(SPSR & (1<<SPIF)));

Die Prüfung wird sinnvollerweise vor dem SPDR-Zugriff gemacht, so 
vertrödelst Du ja den Vorteil der SPI Hardware - das unabhängige 
Arbeiten.
Dann muss aber das SPIF einmal gesetzt werden (sonst while->endlos). Im 
Tutorial erfolgt dazu  bei der Initialisierung ein dummy-read, da man 
das Bit nicht manuell schreiben kann.

Autor: Marcus Overhagen (marcus6100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dietmar P. schrieb:
> int main(void)
> {
>
>   void spi_Masterinit (void) {
>
[...]
>
>   }
>

>   while(1){
>     void spi_Mastershiftout(char data){

und das compiliert?

Du solltest Funktionen nicht schachteln.

Falls das wirklich compiliert, wird jedenfalls
spi_Mastershiftout nicht aufgerufen, weil es
nicht aufgerufen wird, sondern nur eine Definition
ist.

Außerdem must du noch den Slave Select (SS) Pin auf
Output schalten.

Autor: Sven K. (svenk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also compilieren wird das wohl,
aber da wird mindestens mal ein Warning geschissen !
Aber wir wissen ja, Warnings muss man nicht lesen ;-)
Ebenso ist F_CPU nicht 1 Mhz sondern 10 Mhz.
Exemplarisch mal im Anhang wie es aussehen könnte.
Schliesse mich da den Vorpostern an.

#define F_CPU  1000000UL

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "util/delay.h"


void spi_Masterinit (void)
{
 ...........
}

void spi_Mastershiftout(char data)
{
 ............
}

int main(void)
{
  spi_Masterinit();

  unsigned char data=170;

  while(1){

    spi_Mastershiftout(data);

  }
}

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, danke,

für Eure hilfreichen Informationen.
Jetzt muss ich das alles erst einmal umsetzen und den SS einbauen.

Werde mich dann nochmals melden.

Gruß
Dietmar

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.