typAAA
11.04.2008, 13: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....
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....