Atmega16 - SPI - SPR0/1 kann nicht gesetzt werden!

Gast #259500
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é
#259504
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!
Persönliche Seite #259510
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 !
Persönliche Seite #259512
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
}
#259513
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é
Persönliche Seite #259515
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren