PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI und SCK



typAAA
11.04.2008, 12:33
Hallo,
zur Ansteuerung eines Sensors will ich das Hardware SPI des ATmega16
benutzen.

Ich versuche das schon einige Zeit und jetzt bin mit meinem Latein ziemlich am Ende...ich habe das Programm aufs allernötigste Kondensiert, den AVR wieder zurück aufs STK strafversetzt und die Komprimierung ausgeschaltet

Problem: Ist die
while (!(SPSR & (1<<SPIF)));
Schleife drin, so bleibt das Programm hängen, ohne läuft
es weiter??? Das Problem ist weniger das mein Programm nicht weiterläuft, als vielmehr, dass anscheinend das SPIF Flag nicht gesetzt wird...

Ich glaube das Problemn ist, dass SCK nicht wackelt. Auch mit
SpeicherOszi sehe keine Daten über die Leitung huschen. Liegt das an der
Initialisierung, oder liegt der Hund woanders begraben.

#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned int msec=0; volatile unsigned char newmsec=0;
volatile unsigned char sec=0; volatile unsigned char newsec=0;

int main (void)
{
// ***PORTS***
PORTA=0x00;
DDRA=0xFF;

// ***PORTS***ENDE

//***TIMER***

//Timer0 -- global time
TCCR0 |= (1<<CS00) | (1<<CS01); //prescale:64
TCCR0 |= (1<<WGM01);
OCR0 = 0x83;
TIMSK |= (1<<OCIE0);

//***TIMER*** ENDE

sei();

DDRB = (1<<PB5) | (1<<PB7); //Set MOSI and SCK output, all others input
DDRB |= (1<<PB4); // configure the CS Pin as output as not to affect the SPI


/* initialize SPI Control Registers */
SPCR |= (1<<SPE); //enables SPI functionality
// SPCR &= ~(1<<DORD); //Data Order, 0-->MSB first
SPCR |= (1<<MSTR); //Master/Slave Select, 1--> ATmega is master
// SPCR &= ~(1<<CPOL); // Clock Cycle :rising edge first, falling edge trailing
// SPCR &= ~(1<<CPHA); //1-->sample on falling edge

SPCR |= (1<<SPR1); //SPI fqrequenzy= F_CPU/64
SPCR &= ~(1<<SPI2X) &~ (1<<SPR0);

while (1){

if (newsec==1) {
SPDR=0xFF;
while (!(SPSR & (1<<SPIF)));
PORTA ^= 0xFF;
newsec=0;
}
}
}

ISR (SIG_OUTPUT_COMPARE0)
{
msec++;
newmsec=1;

if (msec==1000) {
sec++;
newsec=1;
msec=0;
}
}

Danke für eure Hilfe

ps. ich habe das problem auch vor 2h bei µC.net gepostet, da konnte mir aber keiner helfe...hoffe das wird hier nicht als doppelposting angesehen....

typAAA
11.04.2008, 13:42
Jetzt läufts irgendwie...aber nur, wenn ich den /SS Pin als EINGANG
konfiguriere (sprich: nicht DDRB |= (1<<PB4) setze), was IMHO dem
Datenblatt widerspricht???
Kann mir das Jemand erklären? Ich wäre sehr dankbar!

uffi
07.10.2008, 10:49
Hallo,

das widerspricht nicht dem Datenblatt: Wenn der /SS Pin auf low geht, schaltet der Baustein automatisch vom Master in den Slave Mode!
Wenn Du also /SS als Output definierst un dann auf low treibst, geht der Baustein in den SPI slave mode.

Gruß, uffi.