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) { } }
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) { } }
holger schrieb: > #define DDR_SPI PORTB > > Das ist falsch. Ist immer noch falsch.
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) { } }
>Muss den SS am PB2 Impuls erzeugen. >Machr das das SPI eigentlich nicht von selbst ?? Nö.
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
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.