-
-
Neuer Benutzer
Öfters hier
SPI und SCK
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....
-
Neuer Benutzer
Öfters hier
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!
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen