-         

Ergebnis 1 bis 3 von 3

Thema: SPI und SCK

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2008
    Beiträge
    5

    SPI und SCK

    Anzeige

    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....

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2008
    Beiträge
    5
    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!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.06.2007
    Ort
    München
    Alter
    54
    Beiträge
    198
    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
  •