mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 - SPI - SPR0/1 kann nicht gesetzt werden!


Autor: ratatatata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wahrscheinlich bin ich einfach mal wieder zu blöd oder das ist gar kein
Fehler ;), aber ich krieg es irgendwie nicht hin SPR0 und SPR1 im SPCR
meines Atmega16s zu setzen!
Ich kann zuerst alles einstellen und danach SPI enablen, ich kann
zuerst SPI enablen und danach alles einstellen und ich kann alles
gleichzeitig wie im Datenblatt machen, nichts funktioniert!

Kennt das einer?

Hier mal der Code:
  ldi   r16, 0b10110000
  out DDRB, r16
  ldi   r16, (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)
  out SPCR, r16

Im AVR-Studio 3.56 Emulator werden die Bits gesetzt und mein
Oszillograph zeigt auch eine Aktivität am SCK an!

Naja.. aufjedenfall mal danke!
André

Autor: ratatatata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, meinte natürlich Oszilloskop, nicht -graph ^^

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste auch SPDR = r0 oder so mal ausprobiert? Ohne Grund macht der kein
Takt.

Autor: ratatatata (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja natürlich, habe auch geschrieben dass ich einen Takt kriege.
Nur das Problem war ja dass ich die SPR-Bits nicht setzen kann und so
immer eine Freqeuenz von 4 KHz habe!

Autor: André Freitag (ratatatata)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso habs grad nochmal durchgelesen, hab mich wohl etwas unklar
ausgedrückt, also mein spi geht soweit (denk ich mal, konnte leider nur
mit dem oszilloskop nachschauen ob die spannungen sich ändern) nur mein
problem ist, dass wenn ich SPR0 auf 1 setze es beim auslesen des SPCR
registers immer noch/wieder(?) 0 ist, heißt also ich kann die
übertragungsrate nicht ändern!

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche f_osc benutzt Du?

Wie ist SPI2X gesetzt?

Wenn SPI2X, SPR1 und SPR0 alle 0 sind, stimmt dann, dass
f_SCK = f_osc/4 ist?

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja rolf das stimmt.

und wenn du spi2x setzt kommst du auf fosc/2.

Dachte vorher, daß der bei dieser Geschwindigkeit ein par bits
schluckt, aber es ist einwandfrei gelaufen...

Autor: André Freitag (ratatatata)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm habe irgendwo gelesen das fosc/4 4khz bedeuted, aber stimmt das? weil
dann gäbe es ja keinen sinn dass doppelte geschwindigkeit 2khz bedeutet
^^

da keiner von euch was gesagt hat schätze ich mal nicht, dass das
normal  is das das nicht gesetzt wird, was könnte das denn dann sein?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Oszillator mit 16 KHz läuft, dann ist ein Viertel davon 4KHz,
ja. Solche Frequenzen sind aber eher selten anzutreffen.

Autor: André Freitag (ratatatata)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso ups der slash is ein wahrhaftiges divisions-zeichen ^^
gar nicht dran gedacht..

hab auch grad versucht das spi2x bit zu setzen - leider ohne erfolg :(

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe im Moment exakt das Gleiche Problem, und zwar mit nem 90s8515. Also
ganz einfaches Modell.

Du hast sicher ein 16Mhz Quarz oder? :-) Bei mir kommt immer nur 2khz
Takt heraus, egal wie ich diese dösigen SPRx Bits setze. (Hex Datei
verändert sich auch). Das Schieberegister was dranhängt klappt. Also
das rausgeshiftete Byte entspricht dem am Schieberegister anliegendem
Byte.

Habe es gestern Abend ausprobiert und wollte heute das ganze mit nem
m16 ausprobieren, weils nich klappte. Aber wenn das da auch so ist,
brauch ich ja garnicht rumprobieren.

Ich schließe mich mal dem Hilferuf an !

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein 90s8515 läuft übrigena auf 8Mhz, wie dem Zusammenhang mit den 2 und
4kHz zu entnehmen ist.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein Code (ganz einfacher C Code)
#include <inttypes.h>
#include <stdio.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/io.h>


#define ubrrval 207


void uart_putc(unsigned char);
void uart_puts(char *);



int main(void)
{
  DDRA=0xFF;
   DDRB=0xFF;
  DDRC=0xFF;
  DDRD=0xFF;

  UBRR=ubrrval;
  UCR=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
  
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);//|(1<<SPR1);
  
  SPDR=0xAA;
  
  uart_puts("test");
  
  sei();
  
  while(1);
   
}

SIGNAL (SIG_UART_RECV)
{
    unsigned char temp;
  temp = UDR;
  SPDR=temp;
  uart_putc(temp);
}



void uart_putc(unsigned char c)
{
    while(!(USR & (1 << UDRE))); /* warte, bis UDR bereit */
    UDR = c;                     /* sende Zeichen */
}


void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem
"String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

Autor: André Freitag (ratatatata)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok..
bitte schlagt mich, ich habs verdient ^^
meine funktion die ein byte als hex aufs lcd geben soll hatte eine
unterroutine aufgerufen die ausversehen das niedrige nibble auf 0
gesetzt hat

tut mir leid! aufjedenfall danke für all eure bemühungen!

tja, jetzt bist wieder alleine simon :D

wird nicht nochmal vorkommen schäm
André

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz toll. Mal nen Mega16 ausprobiert. Das gleiche. ich geh langsam
kaputt.

(Code natürlich angepasst für den m16)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, das ist echt ein dummer Zufall dass wir das gleiche Problem haben.
nun gehts. Woran lags?

Ich hab mit nem DMM die Frequenz gemessen am clock pin. habe aber als
baudrate nur 2400 baud eingestellt. jetz habe ich ganz viele chars
rübergeschickt um die frequenz an CLK zu messen, und da die
baudfrequenz sooo langsam ist, hat das messegerät die
idle-zwischenlücken mitgemessen, kann ja nix werden. habs jetzt mal in
ne loop gesteckt und fast 4 Mhz (clck/4)

schlagt mich bitte auch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.