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é
oh, meinte natürlich Oszilloskop, nicht -graph ^^
Haste auch SPDR = r0 oder so mal ausprobiert? Ohne Grund macht der kein Takt.
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!
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!
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?
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...
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?
Wenn der Oszillator mit 16 KHz läuft, dann ist ein Viertel davon 4KHz, ja. Solche Frequenzen sind aber eher selten anzutreffen.
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 :(
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 !
Mein 90s8515 läuft übrigena auf 8Mhz, wie dem Zusammenhang mit den 2 und 4kHz zu entnehmen ist.
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 | }
|
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é
ganz toll. Mal nen Mega16 ausprobiert. Das gleiche. ich geh langsam kaputt. (Code natürlich angepasst für den m16)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.