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


von ratatatata (Gast)


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é

von ratatatata (Gast)


Lesenswert?

oh, meinte natürlich Oszilloskop, nicht -graph ^^

von D. W. (dave) Benutzerseite


Lesenswert?

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

von ratatatata (Gast)


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!

von André F. (ratatatata)


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!

von Rolf (Gast)


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?

von Florian (Gast)


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

von André F. (ratatatata)


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?

von A.K. (Gast)


Lesenswert?

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

von André F. (ratatatata)


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 :(

von Simon K. (simon) Benutzerseite


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 !

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

mein Code (ganz einfacher C Code)
1
#include <inttypes.h>
2
#include <stdio.h>
3
#include <avr/signal.h>
4
#include <avr/interrupt.h>
5
#include <avr/io.h>
6
7
8
#define ubrrval 207
9
10
11
void uart_putc(unsigned char);
12
void uart_puts(char *);
13
14
15
16
int main(void)
17
{
18
  DDRA=0xFF;
19
   DDRB=0xFF;
20
  DDRC=0xFF;
21
  DDRD=0xFF;
22
23
  UBRR=ubrrval;
24
  UCR=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
25
  
26
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);//|(1<<SPR1);
27
  
28
  SPDR=0xAA;
29
  
30
  uart_puts("test");
31
  
32
  sei();
33
  
34
  while(1);
35
   
36
}
37
38
SIGNAL (SIG_UART_RECV)
39
{
40
    unsigned char temp;
41
  temp = UDR;
42
  SPDR=temp;
43
  uart_putc(temp);
44
}
45
46
47
48
void uart_putc(unsigned char c)
49
{
50
    while(!(USR & (1 << UDRE))); /* warte, bis UDR bereit */
51
    UDR = c;                     /* sende Zeichen */
52
}
53
54
55
void uart_puts (char *s)
56
{
57
    while (*s)
58
    {   /* so lange *s != '\0' also ungleich dem
59
"String-Endezeichen" */
60
        uart_putc(*s);
61
        s++;
62
    }
63
}

von André F. (ratatatata)


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é

von Simon K. (simon) Benutzerseite


Lesenswert?

ganz toll. Mal nen Mega16 ausprobiert. Das gleiche. ich geh langsam
kaputt.

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

von Simon K. (simon) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.