Ich habe nun mein 74HC595 an den MEGA8 (interner oszi) angeschlossen und unten aufgeführtes Programm geladen, doch leider tut sich am Ausgang von HC nicht das was ich möchte. Kann jemand einen Fehler entdecken ?? #include <avr\io.h> #define DD_MOSI PINB3 #define DD_SCK PINB5 #define DD_RCK PINB2 #define DDR_SPI PORTB int main (void) { DDR_SPI = (1<<DD_MOSI | 1<< DD_SCK | (1<<DD_RCK)); SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) ; SPDR = 0x3; while (!(SPSR & (1<<SPIF))); while (1) { } }
Gast
#1347833
#define DDR_SPI PORTB Das ist falsch.
holger schrieb: > #define DDR_SPI PORTB > > Das ist falsch. Syntaktisch ist es korrekt Semantisch nicht ;)
Klammern fehlten, geht aber trotzdem nicht
#include <avr\io.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_RCK PINB2
#define DDR_SPI PORTB
int main (void)
{
DDR_SPI = (1<<DD_MOSI) | (1<< DD_SCK) | (1<<DD_RCK);
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
SPDR = 0x3;
while (!(SPSR & (1<<SPIF)));
while (1)
{
}
}
Gast
#1347846
holger schrieb: > #define DDR_SPI PORTB > > Das ist falsch. Ist immer noch falsch.
wieso ?
Ingo Laabs schrieb:
> wieso ?
DDR = Data Direction Register
PORT != DDR
Also muß da DDRB hin und nicht PORTB.
Wie ich shcon geschrieben hab, der Compiler kann nix falsches dran
finden (Syntax korrekt), aber es macht nicht das was du möchtest
(Semantischer Fehler).
#include <avr\io.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_RCK PINB2
#define DDR_SPI DDRB
int main (void)
{
DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_RCK);
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
SPDR = 0x2;
while (!(SPSR & (1<<SPIF)));
while (1)
{
}
}
jepp geändert, aber gleiches problem..nix Ausgang
ALso, nun funktioniert es.
Muss den SS am PB2 Impuls erzeugen.
Machr dass das SPI eigentlich nicht von selbst ??
#include <avr\io.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_RCK PINB2
#define DDR_SPI DDRB
int main (void)
{
DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_RCK);
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
PORTB &= ~(1 << PB2); //SS LOW
SPDR = 3;
while(!(SPSR & (1<<SPIF)));
PORTB |= (1 << PB2); // SS HIGH
while (1)
{
}
}
Gast
#1347924
>Muss den SS am PB2 Impuls erzeugen. >Machr das das SPI eigentlich nicht von selbst ?? Nö.
Gast
#1347927
Hi >Muss den SS am PB2 Impuls erzeugen. >Machr dass das SPI eigentlich nicht von selbst ?? Nein. Datenblatt für Master: SS User Defined. MfG Spess
OK, dann hammas jetzt
#include <avr\io.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_RCK PINB2
#define DDR_SPI DDRB
#define F_CPU 1000000UL
#include <util/delay.h>
int Tabelle[] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2 };
int ElementeAnzahl = sizeof(Tabelle) / sizeof( int );
int Zaehler;
int main (void)
{
DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK) | (1<<DD_RCK);
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) ;
while (1)
{
for (Zaehler=0; Zaehler<=ElementeAnzahl-1; Zaehler++)
{
PORTB &= ~(1 << DD_RCK); //SS LOW
SPDR = Tabelle[Zaehler];
while(!(SPSR & (1<<SPIF)));
PORTB |= (1 << DD_RCK); // SS HIGH
_delay_ms(100);
}
}
}
Hallo, wenn SPI als nur als Master betrieben wird, kann /SS als Ausgang definiert sein und kann dann beliebig genutzt werden. Datenblatt unter /SS Pin Fuctionality Gruß aus Berlin Michael
@ Michael U. (amiga) >wenn SPI als nur als Master betrieben wird, kann /SS als Ausgang >definiert sein MUSS! als Ausgang definiert sein! Siehe Datenblatt. MfG Falk
Gast
#1348110
>MUSS! als Ausgang definiert sein!
Nein.
Datenblatt:
If SS is configured as an input, it must be held high to ensure Master
SPI operation.
MfG Spess
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
