Hallo, Bin Anfänger und hatte meine Frage schon mal im GCC Forum gestellt, aber nur wenig zielführende Antwort erhalten. Ich habe die empfohlenen Links http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf http://rn-wissen.de/index.php/Atmel_Controller_Mega48_Mega88_Mega168#Unterschiede_zwischen_Mega8_und_Mega88 durchgelesen und dennoch keine Lösung gefunden. Ich möchte nur ein einfaches Tastenecho auf dem Atmega 88 realisisern, etwas , was auf dem Atmega 8 problemlos läuft. Ich weiß, dass der 88 er kein URSEL besitzt, daß UBRR0H und UCSR0C getrennt angesprochen werden müssen. Aber die UART Initialization im Datenblatt verstehe ich überhaupt nicht. Ich arbeite mit STk500, AVR Studio, habe einen 3,6864 MHz Quartz, habe das Fuse für ext.crystal/Resonator High Freq; Startup time16K Ck+ 64ms gesetzt, was beim Atmega 8 auch problemlos läuft. Aber dennoch gehts beim 88 nicht, es kommen nur sinnlose Zeichen raus. Kann bitte jemand mal den Code überfliegen und mir einen Tipp geben woran es liegen könnte? Gruß Thomas
Hallo spess53, danke für den Tipp! Das CKDIV8 scheint beim Atmega88P Standartmäßig gelöscht zu sein. Habe einen neuen ins STK 500 eingesetzt und die Fuses ausgelesen. CKDIV8 hat immer ein Häkchen. As wegzumachen bringt nix, ist nach dem Auslesen immer wieder da. Muss das weg, wenn wie bekomm ich das weg? Gruß Thomas
Hi >danke für den Tipp! Das CKDIV8 scheint beim Atmega88P Standartmäßig >gelöscht zu sein. Nein. Die CKDIV8-Fuse ist bei einem neuen ATMega88 gestzt. D.h. der AVR läuft mit 8MHz/8 = 1MHz. >CKDIV8 hat immer ein Häkchen. As wegzumachen bringt nix, ist >nach dem Auslesen immer wieder da. Nur das Häkchen wegmachen reicht nicht. Du muss die Fuses auch progammieren. MfG Spess
Das Bit heißt einfach, daß die jeweilige Taktfrequenz pauschal durch 8 geteilt wird -> wenn du alles für 8MHz berechnet hast, das Ding aber nur mit 1MHz läuft, passen also all deine Berechnungen nicht (als Beispiel). Ob das gesetzt oder gelöscht sein muß hängt von deiner Anwendung ab. Meist bringt es aber mehr es "unprogrammed" zu machen. Und mal ehrlich: ob jetzt "gesetzt" programmed oder UNprogrammed bedeutet... der Zusammenhang ist doch eigentlich gar nicht so schwer zu verstehen :) . Wenn du das Häkchen in AVR Studio wegnimmst wird das Bit gesetzt. Das heißt es ist UNpregrammed. Danach mußt du (je nach Entwicklungsumgebung) die veränderten Einstellungen noch hochladen (write)... Eigentlich ganz einfach :) Gruß
Danke für die Antworten! habe jezt einen nagelneuen Atmega88 eingesetzt, mit avr die Fuses ausgelesen und festgestellt, dass das Häkchen bei CLDIV( gesetzt war. Habe dann das Häkchen entfernt und die Veränderung in den µC geladen. So jetzt geht auch das UART. Aber wieso?????? Meine ganzen Berechnungen im Programm gehen doch von Fosc 3686400 aus. Wenn ich jetzt den Vorteiler CKDIV8 programmed habe, dürfte doch nix mehr gehen?!? Dannn arbeitet dwer C doch mit 921600 Hz oder nicht?? So stehts jedenfalls im Datenblatt. Habe jetzt aus Flashplatzgründen auf den Atmega162 gewechselt. Hier ist das genauso. Es geht zwar, aber verstehen würde ich es doch gerne.... Gruß Thomas
Hi >Meine ganzen Berechnungen im Programm gehen doch von Fosc 3686400 aus. >Wenn ich jetzt den Vorteiler CKDIV8 programmed habe, dürfte doch nix >mehr gehen?!? Nein, du hast jetzt den Vorteiler abgeschaltet. Ein Häkchen zeigt eine programmierte Fuse an. MfG Spess
Thomas schrieb: > habe jezt einen nagelneuen Atmega88 eingesetzt, mit avr die Fuses > ausgelesen > und festgestellt, dass das Häkchen bei CLDIV( gesetzt war. Habe dann das > Häkchen entfernt und die Veränderung in den µC geladen. > So jetzt geht auch das UART. Aber wieso?????? > > Meine ganzen Berechnungen im Programm gehen doch von Fosc 3686400 aus. > Wenn ich jetzt den Vorteiler CKDIV8 programmed habe, dürfte doch nix > mehr gehen?!? Wenn CKDIV8 eingeschaltet ist (und das ist es bei einem nagelneuen Mega88) dann arbeitet dein µC nicht mit 3686400 Hz, sondern mit 3686400 / 8 = 460800 Hz, also rund 480kHz anstelle von 3.6MHz. Erst dadurch, dass du CKDIV8 ausschaltest, arbeitet dein µC mit der vollen Frequenz.
wie kommst du auf die krummen zahlen? der interne oszillator ist doch ab werk auf 8MHz eingestellt...
Danke, jetzt habe ich es verstanden. Habe jetzt das Datenblatt Atmega 162 vor der Nase und möchte den UART mit ISR Programmieren. Jetzt sehe ich im Datenblatt unter USART Register deskription nicht etwa UCSRnA sondern einfach UCSRA. Was soll denn das? Der 162 er hat doch zwei USART!?! Beim Compilieren nörgelt das AVstudio erwartungsgemäß rum und möchte andere Registernamen. Im Datenblatt vom 88 er, der ja auch zwei USART HAT stand es richtig. Ist das jetzt mal einfach ein Fehler? oder muss man jetzt jede Bezeichnung im Datenblatt erstmal "übersetzten" ? Das ist für einen Anfänger wie mich echt nicht witzig..... Gruß Thomas
Hi Bist du sicher,das du die richtigen Datenblätter hast. Der ATMega162 hat definitiv 2 UARTs und der ATMega88 nur eine. MfG Spess
Spess hat bei den Datenblättern schon Recht. Was mir noch aufgefallen ist: in deinem Sourcecode hast du F_CPU mit 3680000 angegeben. Dein Quarz hat aber 3,6864 MHz Quarz. Das entsricht einem Fehler von fast 0,2%. Lt. Datenblatt sind zwar 0,5% erlaubt, aber man muß es ja nicht drauf anlegen... Zeig mal deine Fuses (Screenshot)... Gruß
In meinem Datenblatt stimmen die Registernamen zu USART auch durchweg nicht, sowohl im laufenden Text als auch in den C-Beispielen beim atmega162. Je nach Schnittstelle muß man sich zu den Namen noch 0 oder 1 dazudenken, etwas Flexibilität ist hier gefragt. Die richtigen Namen stehen in der Tabelle der Register kurz vorm Ende. Die Doku ist wohl aus der Rubrik fuzzy logic...
Thomas schrieb: > Im Datenblatt vom 88 er, der ja auch zwei USART HAT stand es richtig. Aber der wiederum hat doch nur eine USART? Glaube ich zumindest. Die wiederum hat eine 0 im Registernamen, auch wenn es keine 2 dazu gibt.
Die Datenblätter stimmen, allerdings hast Du recht: Das Datenblatt für den 88 er gilt für Atmega48/88/168. Ich nehme an, dass deswegen die Registernamen ein "n" haben. Allerdings ist das Datenblatt atmega162doc2513pdf doch wohl das richtige. Und hier sind definitiv alle Registernamen falsch. Bei UCSRB kann ich es ja noch ergänzen, aber wo mach ich die UART Zahl dann bei den Register bits hin? Bei TXEN hänge ich die 0 dran. Bei UCSZ1 muss die Zahl aber vor die eins, also UCSZ01. Ich schau jetzt halt nach den Register und Bitnamen im 48/88/168 datenblatt nach. Ist jaeigentlich im Prinzip fast immer dasselbe. Aber eben nur fast. Der 162 hat ein URSELn, der 88 er nicht..... echt merkwürdig. Vielleicht lade ich mir das Datenblat einfach nochmal runter doch was soll das ändern? Es sind in den Codebeispielen sowieso einige Zeichenfehler drin wie beispielsweise: unsigned c?ar. Das machts auch nicht einfacher.... Thomas
Wie gesagt: Die Namen stehen richtig in der Registerübersicht am Ende. Da sind auch die Namen der Bits zu finden. Du kannst natürlich auch in iom88.h schauen. ... und wirst feststellen, daß es da nicht steht. Stattdessen wird ein avr/iomx8.h includet, und da stehen dann die Namen.
Bei 88 und 162 ist einiges etwas anders! Entscheide dich, welchen du nehmen willst und nimm das richtge Datenblatt! Auch wenn es etwas schwammig ist, die Namen stehen in der Tabelle richtig. Von den Namen abgesehen ist die Funktion aber richtig beschrieben, soweit ich das sehe.
Außerdem: Solange du mit dem Takt nicht sicher bist, solltest gar nicht USART anfassen. Sonst hast du zuviele Fehlermöglichkeiten auf einmal, und siehst nur daß es nicht geht. Stelle erstmal den Takt sicher, dann geht es weiter.
@jojo84 das mit den Fuses hat sich zumindest von der Wirkung her erledigt, weil die UART Init funktioniert. Aber ich vertehe jetzt schon, warum mancher von den Fuses genervt ist. Bei AVRStudio ist ein Häkchen, wenns unprogrammed ist, und keines wenns programmed ist. Eigentlich. Aber dann gibts ja disabled und enabled Fuses, das ist dann wie eine doppelte Verneinung... Die Fosc ändere ich noch in 3686400.... @mfgkw Fein. Dann weiß ich, dass ich die Datenblätter nicht nur lesen muss, sondern auch noch mitdenken ;-) muss... der Tipp mit der Registerübersicht am Ende ist OK, da stehts richtig drin... @spess53 im Tutorial steht, dass im AVRStudio ein Häkchen 0 bedeutet und keines 1, im Gegensatz dazu hat ponyprog das Häkchen am programmed Fuse, so wie man es erwarten würde. So. jetzt versuche ich mal die Interrupt gesteuerte UART Version aus dem Artikel Interrupt auf den 162 zu packen. Thomas
Hi >Bei AVRStudio ist ein Häkchen, wenns unprogrammed ist, und keines wenns >programmed ist. Nein, da liegst du falsch. Ein Häkchen bedeutet eine programmiertes Fusebit. MfG Spess
Hi Nachtrag: >@spess53 >im Tutorial steht, dass im AVRStudio ein Häkchen 0 bedeutet und keines >1, im Gegensatz dazu hat ponyprog das Häkchen am programmed Fuse, so wie >man es erwarten würde. Ein programmiertes Fusebit hat den Wert 0! MfG Spess
Ich finde im Datenblatt irgendwie nicht den Namen vom Interrupt für ein empfangenes Byte. Bevor du es auch suchst: er heißt USART_RXC_vect (auch wenn sonst bei den AVR mit USART, bei denen die Register eine Ziffer im Namen haben, der Vektor dann auch USART0_RXC_vect oder USART0_RX_vect heißt, aber bei den AVR mit Registernamen ohne Ziffer dann der Vektor U(S)ART_RX(C)_vect heißt, ist es beim mega88 wieder anders: Register mit Ziffer, Interruptroutine ohne...) Soll noch einer sagen, es gäbe keine guten Textadventures mehr!
..ich nehme jetzt den 162er, weil ich glaube, dass ich noch etwas Platz im Flash brauche, für ICP, dynam. Sinus PWM über LUT variabel über ISR getaktet, etc. Thomas
@mfgkw danke, es begann gerade ein Problem zu werden mit dem ISR Vektor;-) hast es mit Deinem Tipp erschlagen..... @spess53 ach so, dann ist es klar.. Thomas
ok, aber dann leg das Pamphlet zum 88 ganz weit weg. Es geht nicht gut, in beide rein zu schauen! Der 88 hat nämlich die beiden Register UCSR...C und UBRR...H getrennt, während der 162 nur ein Register für beide hat, und welches man meint, muß man beim Schreiben mit dem obersten Bit auswählen (UCSR0C.URSEL1 gleich 1 meint: der Rest des Wertes ist für UCSR0C, dagegen UCSR0C.URSEL1 gleich 0 meint: der Rest des Wertes ist für UBRR0H gedacht).
ach ja: für weitere Diskussionen zum 162 wäre es vielleicht sinnvoll, einen neuen Thread aufzumachen. Sonst werden die nächsten Generatinen noch mehr verwirrt als ohnehin schon.
Vielen Dank an alle, die mir geantwortet haben! werde jetzt mal weitermachen und ggf bei neuen Fragen einen neuen Thread aufmachen..... @mfgkw ;-) habe das Datenblatt vom 88 er ganz weit weggelegt. Nachdem ich beim 88 das URSEL gesucht und nicht gefunden habe, hatte ich auch mitbekommen, dass hier die beiden Register getrennt sind. Viele Grüße Thomas
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.