Hallo liebe Forumsmitglieder, ich bin im Moment dabei eine Steuerung zu schreiben, die ueber die serielle Schnittstelle Daten empfaengt und rausschreibt. Jetzt habe ich bei ersten Tests das Problem, dass die Reihenfolge der empfangenen Bits nicht stimmt. Hoert sich ziemlich bloed an, ich weiss. Also, normalerweise sollte ich die Bits in dieser Reihenfolge 7 6 5 4 3 2 1 0 empfangen. Tatsaechlich kommen die aber so rein: 3 7 6 5 4 2 1 0. Kann das sein? Kann man das vielleicht irgendwo im MC einstellen und ich habe das ausversehen mal gemacht (von der Art wie fuses oder so). Das Problem habe ich nicht nur mit meiner eigenen Platine, sondern auch, wenn ich die serielle Schnittstelle vom STK500 nehme. Anbei mal ein kurzes Codefragement, wie ich das in ASM gemacht habe: .... ;Stack ldi temp,low(ramend) out spl,temp ldi temp,high(ramend) out sph,temp ;UART Initialisierung ldi temp,low(ubrrval) out ubrrl,temp ldi temp,high(ubrrval) out ubrrh,temp ldi temp,(1<<ursel)|(3<<ucsz0) out ucsrc,temp sbi ucsrb,rxen ;daten empfangen sbi ucsrb,rxcie ;interrupt bei empfang sei loop: rjmp loop ..... int_rxc: in temp,udr .... reti Und schon an dieser Stelle stimmt der Inhalt in temp nicht. Irgendjemand vielleicht eine Idee?? Vielen vielen Dank!! mfg, Sebastian
Versuch mal nicht in ucsrc zu schreiben, die sind schon am Start richtig eingestellt. Und noch was - was meinst du mit ursel? Umsel? Dann ist es ja falsch, es soll 0 sein.
Hi Aleksej, ich hatte das alles aus dem Tutorial uebernommen. Da geht es wohl um die Einstellungen auf 8Datenbit. Aber ich kann das gerne mal zum Spass weglassen. Lass dann wieder von mir hoeren. Bye, Sebastian
@Sebastian: Das mit den Interrupts funktioniert aber bei dir, oder? Also Stackpointer initialisiert, Vektoren passend beschrieben? Wie verarbeitest du 'temp' weiter ? Besser wäre, wenn du das komplette Programm anhängst. Vielleicht liegt der Fehler ja woanders. @Aleksej: Es gibt auch das Bit "Ursel". Hierzu Seite 167 im Datasheet.
Ja, ist richtig, man soll UCSRS mit 0x86 beschreiben. Wahrscheinlich liegt das Problem wo anders. Habe die falsche Anleitung, sorry :(
Hallo Leute, ich denke ich habe jetzt meinen Fehler gefunden. Und zwar scheint es an der Übertragungsgeschwindigkeit zu liegen. Ich muss leider 57600 Baud verwenden. Nehme ich zum Beispiel 9600 Baud gibt es keine Fehler. Ja, und ich habe natürlich keinen externen Quarts auf meiner Platine vorgesehen und verwende den Internen. Da scheint es einfach zu große Fehler/Abweichungen zu geben, da man die interne Clock ja nur auf 1MHz, 2MHz ect. einstellen kann und nicht auf Kommawerte. Ich werde das jetzt nochmal mit einer externen Clock auf dem STK500 probieren. Denke aber mal, dass es dann auch klappt. Hat sonst noch jemand Vorschläge? Vielen Dank, Sebastian
Leider hast du nicht das ganze Programm gezeigt,
Sollten bei ... Programmteile sein die ausgeführt werden, wenn auch das
Interrupt aktiv werden kann dann sollte dort temp nicht verändert
werden
>loop:rjmp loop seh ich mal nur als Bsp an , sonst wuerde ... keinen
Sinn machen
Mit der Oszillatorkalibrierung kann man den internen Oszillator schon noch ein wenig hin und her schieben. Allerdings wirst Du mit der Temperaturstabilität nicht sehr viel Freude haben. Bei zeitkritischen Dingen (der UART gehört bei größeren Baudraten dazu) immer einen externen Quarz vorsehen.
Hi, nur noch der vollstaende halber. Mit einem externen Quartz laeuft alles wie es soll. Danke fuer Eure Ueberlegungen und Hilfestellungen. Thanks, Sebastian
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.