Hallo, wenn ich über USART Daten ausgeben möchte, empfange ich nur 0x80 oder 0x80 + 0x00. Ich benutze das STK600 (habe über AVR Studio F_CPU auf 1MHz eingestellt und das auch im Programm eingesellt). Baudrate benutze ich 19200 (auch beim Empfangsterminal). Egal was ich senden möchte, ich bekomme immer nur 0x80 oder 0x80 und 0x00 aufeinmal. Kann mir bitte jemand sagen, was ich falsch mache?
>Kann mir bitte jemand sagen, was ich falsch mache?
Keinen Code zu posten!
1 | void usart_init(void) |
2 | {
|
3 | // Baudrate einstellen
|
4 | UBRRH = (uint8_t) ((F_OSC / (BAUD_RATE * 16L) - 1)>>8); |
5 | UBRRL = (uint8_t) (F_OSC / (BAUD_RATE * 16L) - 1); |
6 | |
7 | //Stelle Frameformat ein: 8 bit, 1 Stop, kein Parity
|
8 | UCSRC = (1 << URSEL) | (3 << UCSZ0) | (1 << UPM0) | (0 << USBS); |
9 | |
10 | //Doppelte Geschwindigkeit
|
11 | //UCSRA |= (1 << U2X);
|
12 | |
13 | // Schalte Senden und Empfangen ein
|
14 | UCSRB = (1 << RXCIE) | (1 << TXEN) | (1 << RXEN); // Aktiviere USART Interrupt |
15 | }
|
[/c] void usart_send(uint8_t data) { // Warte bis Übertragungs-Puffer leer ist (letzte Übertragung fertig ist) while (!(UCSRA & (1<<UDRE))); //Übergebene Daten in Data-Register geben (Daten übertragen) UDR = data; } [/c]
1 | int main(void) |
2 | {
|
3 | usart_init(); |
4 | while(1) |
5 | {
|
6 | usart_send(0xA0); |
7 | _delay_ms(1000); |
8 | }
|
9 | }
|
Wenn ich jetzt das sende, erhalte ich 0b1100000 also vorne das erste Bit ist falsch... Wenn ich 0x01 sende, erhalte ich 0b10000001 Start,Stop und Parity sind aber im Terminal richtig eingestellt. Außerdem hab das Programm früher funktioniert.
Und der Schaltplan der verwendeten Schaltung? Der Code ist aber auch nicht komplett. Hänge doch mal die ganze .c Datei an bitte. Da fehlt mindestens ein #define und ein #include.
Richtig Baudrate? Richtige Taktfrequenz? Irgendwelche "DIV8"-Fuses übersehen? Dein Programm-Fragment ist nicht compilierbar, also unbrauchbar.
Hallo, sorry, hatte das Programm auf anderem Rechner, deshalb habe ich es nur abgetippt. Hier jetzt der ganze code angehängt. Das Problem besteht weiter: Sende ich 0b00000001 erhalte ich 0b10000001. Sende ich aber 0b11111111 so erhalte ich auch 0b11111111. Also das MSB ist immer 1. Über AVR Studio habe ich die interne Frequenz auf 1 MHz eingestellt, auf dem STK600 habe ich den Schalter für interne Frequenz auch eingeschalten. PD0 und PD1 mit RXD und TXD verbunden. RS232 Verbinde ich über einen RS232-USB Converter mit dem PC. Beim Terminal (hterm) habe ich die gleichen Einstellungen wie im Programm (Baudrate 19200 , 8 Datenbits, 1 Stop kein Parity). Sonst noch jemand eine Idee?
Simon K. schrieb:
> Und der Schaltplan der verwendeten Schaltung?
Der interne RC Oszillator ist im übrigen pauschal gesagt zu ungenau für
eine UART.
Hi > Simon K. schrieb: >> Und der Schaltplan der verwendeten Schaltung? STK600 MfG Spess
GoZu schrieb: > Das Problem besteht weiter: Sende ich 0b00000001 erhalte ich 0b10000001. > Sende ich aber 0b11111111 so erhalte ich auch 0b11111111. Also das MSB > ist immer 1. Klassisches Symptom eines Bitratenfehlers. Die Bitrate vom Sender ist geringfügig höher als die des Empfängers. Mal dir das mal auf, dann wird das deutlich.
spess53 schrieb: > Hi > >> > > Simon K. schrieb: >>> Und der Schaltplan der verwendeten Schaltung? > > STK600 Ahso, stimmt. Da ist ja auch ein Pegelwandler drauf. Sorry.
Grund für den Bitratenfehler: Aus einem 1MHz Takt, egal wie genau der ist, lässt sich die Bitrate 19200 nicht hinreichend genau ableiten.
Ok danke schonmal, allerdings funktioniert das ganze auch nicht mit anderen Frequenzen. Habe den Clock Generator auch auf 8 MHz, 16 MHz und 20 MHz eingestellt, allerdings mit dem gleichen Ergebnis. Benötige ich dafür wirklich einen Quarz?? Und wenn ja, wo stecke ich den dann genau beim STK600 rein? Beim STK500 war alles gut beschrieben und es gab auch ein Manual, aber beim STK600 gibts ja nur das interne von AVR Studio und dort ist das nicht beschrieben und beschriftet ist es auch nicht auf dem board. Habe jetzt ein Bild vom STK600 angehängt, dort wo der rote Kreis ist, muss ich dort den Quarz reinstecken?
Wenn du bei den STK600-Einstellungen verschiedene Frequenzen eingestellt hast, und sich nichts ändert, liegt es am Controller: Dessen Fuses müssen auch für Verwendung einer externen Taktgenerators programmiert sein.
Hi
> muss ich dort den Quarz reinstecken?
Steht doch in der Beschreibung:
The on-board crystal oscillator will work with ceramic resonators or
crystals between 4 and 24MHz (AT-cut, fundamental, and parallel resonant
crystals). Place a crystal in the crystal socket (located next to the
PROGRAM button).
Und den Umschalter nicht vergessen.
MfG Spess
Ok danke, es funktioniert. Aber könnt ihr mir bitte noch kurz etwas erklären: Ich kann ja zwischen Intern, Extern und XTAL wählen. XTAL ist wenn ich einen eigenen Quarz benutze und den auf das STK stecke oder? Und was ist jetzt genau intern und was extern? Im Manual steht, dass extern vom "Programmable clock generator". Ist dass das, wenn ich zum µC connecte und dann bei den Spannungseinstellungen unten die Frequenz angebe? Und vonwo kommt dann intern? Bei den Fuse bits kann ich intern und extern auswählen und dort auch noch einmal die Frequenz einstellen.... Ich bin gerade etwas verwirrt, könnt ihr mir das bitte kurz erklären. Außerdem habe ich hier Quarz-Oszillatoren mit 4 Anschlüssen, was sind das für welche? Für das STK600 brauche ich doch welche mit 2 Anschlüsse oder?
@ GoZu (Gast) >Und was ist jetzt genau intern und was extern? Intern: RC-Oszillator im AVR. Extern: Separater Taktgenerator, welcher einen Takt in den AVR einspeist. >Außerdem habe ich hier Quarz-Oszillatoren mit 4 Anschlüssen, was sind >das für welche? Das sind Quarzoszillatoren, also Quarz + Verstärker. Dort legt man Masse und 5V an und es kommt ein Takt raus. > Für das STK600 brauche ich doch welche mit 2 Anschlüsse >oder? Keine Ahnung. Ein normaler Quarz braucht noch die Beschaltung, um zu schwingen. Die ist im AVR eingebaut. MFG Falk
Hi >Außerdem habe ich hier Quarz-Oszillatoren mit 4 Anschlüssen, was sind >das für welche? Für das STK600 brauche ich doch welche mit 2 Anschlüsse >oder? Ja. Das STK600 hat einen Quarzgenerator, der mit dem eingesteckten Quarz schwingt. Mit dem Umschalter wird das Taktsignal an XTAL1 vom Controller gelegt. In der Hilfe zum STK ist das alles sehr nett beschrieben. MfG Spess
Dann wäre da noch der feine aber beim Fusen gern verwechselte Unterschied zwischen dem externen Quarzsozillator und dem externen Quarz. Beim externen Quarz ist nämlich der Oszillator halb drin halb draussen. Der aktive Teil ist intern, der passive (der Quarz und die Kondensatoren) extern.
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.