Hi Leute, ich bin langsam am Verweifeln. Ich habe bisher mit einem 8051 der Firma Atmel gearbeitet und will nun auf einen Atmega 16-16 umsteigen, aber der streubt sich wehement gegen meine Bemühungen. Also mal zu erst hab ich Probleme mit der Taktrate. Ich will später mit der RS 232 komunizieren und deshalb gleich einen Quarz mit mi 14,7456 MHz genommen, aber egal welchen Kondensator ich für den Quarz verwende, stimmen die Zeitn hinten und vorne nicht. Bisher hab ich 10pF, 22pF 27pF und 33pF durch. Jedoch stimmen die Zeiten nicht. Bisher wollte ich nur eine LED 1sec. einschalten und dann wieder abschalten. Das ganze einfach in einer Schleife. Nur er schaltet etwa im bereich von 16 sec statt der einen. Dies für mich zu meinem zweiten Problem. Wie schalte ich einfach eine LED am I/O Port? Bisher konnt ichs immer nur messen das er schaltet, aber sobald eine Last sprich die LED dranhängt macht er einfach nix. Bei den alten 8051 hab ich die LED an 5V, Widerstand von 10k und dann auf den Pin des Controllers. Dort hats Funktioniert aber am Mega16 nicht. Die LED zieht maximal 20mA. MfG Matthias PS. Programmer ist ein myAVR Board und Software Bascom AVR.
Du musst den Mega16 um-fusen. Der läuft mit dem eingebauten RC-Oszillator mit 1 Mhz. http://www.mikrocontroller.net/articles/AVR_Fuses Aber unbedingt das Datenblatt zu Rate ziehen! Du musst den Mega16 auf 'crystal oszillator' umfusen. > die LED an 5V, Widerstand von 10k 10k ? Für ne normale LED (keine Low Power) ist das ein bischen viel. Da laufen grade mal ( 5 - 1.2) / 10000 = 0.00038 A also 0.38 mA durch. Das dürfte selbst für eine Low Power Led viel zu wenig sein. Eine normale LED will so 15 - 20 mA. Mach 220 Ohm draus und gut ists.
Auch bei 10k sollte man, wenn nicht gerade die Sonne hereinscheint, etwas bei der LED sehen. Ich vermute eher, dass DDR nicht gesetzt wurde.
Hi Senex24, was meinst du DDR? Um-fusen. Alles klar werd ich mir mal anschaun das ganze. Aber selbst wenn der Widerstand etwas hoch gewählt ist, sollte sie trotzdem etwas glimmen, tut sie aber nicht. Am Ausgang des Mega liegen immer 5 Volt an. Egal ob mal Set oder Reset macht, ausser es ist keine Last dran. Und wenn man den Pin der am MC ist mal per Hand auf Masse brückt (natürlich ohne MC drin in der Schaltung) leutet sie sichtbar. :-) MfG Matthias
Hmm was interessiert mich eigentlich dieses Register? Sowas sollte der Compiler von selber machen wenn ich ihm sage... SET PORTA.0 bzw. RESET PORTA.0 Und ich nehm ja eine Hochsprache weil ich mit Assembler nix am Hut haben will, sonst könnt ich ja gleich alles in dem Zeug schreiben. Anschluss ist auch so wie im Tutorial...ohne Last schaltet er (Messung am Oszi) aber mit Last sprich der LED nicht. Da liegen immer 5V. Naja Danke für eure Hilfe... MfG Matthias
Hallo Matthias, mittlerweile sollte Ihre Frage geklärt sein, trotzdem noch ein paar Worte: Sie müssen dem m16 sagen, dass der Pin ein Ausgang sein soll, nach dem Reset sind nämlich alle Eingänge, also in etwa so: sbi DDRB,0 ; PORT B 0 loop: sbi PORTB,0 rcall warte_1s cbi PORTB,0 rcall warte_1s rjmp loop warte_1s: ... Da Sie von DDR nichts wussten folgt, dass Sie den pullup-Widerstand ein- und ausgeschaltet haben, und genau das haben Sie auch (hochohmig) messen können. Noch ein Rat: bei Ihrem jetztigen Kenntnisstand sollten Sie die Finger vom Ändern der fuses lassen, Sie können sich jede Menge Ärger einhandeln. Leben Sie die nächsten paar Tage mit der 1 MHz-Taktfrequenz.
Servus << sbi DDRB,0 ; PORT B 0 loop: sbi PORTB,0 rcall warte_1s cbi PORTB,0 rcall warte_1s rjmp loop warte_1s: ...>> Damit kann ich leider nicht wirklich etwas anfangen, da ich NICHT MIT ASSEMBLER arbeite und davon auch keinen blassen schimmer habe. Ich habe bisher auch die 8015er immer mit BASCOM einer Basic sprache programmiert. Auch wenn jetzt wohl jeder meint, dass Assembler das Mass aller dinge ist, bin ich jedoch der Meinung das Assembler mehr oder weniger überhohlt ist. Ausserdem will ich momentan mal den Port A verwenden der laut Spezifikation auch als I/O arbeitet und nicht unbedingt als AD Wandler eingesetzt werden muss. Mit den Fuse sachen muss ich mal sehn was geht, da ich momentan nicht auf den Brenner usw. zugreifen kann. Trotzdem danke. MfG Matthias
Hallo Matthias, mein letzter Beitrag war wohl zu lange unterwegs. Zu Ihrem letzten Kommentar: woher soll der Hochsprachen-Compiler wissen, ob Sie mit SET/RESET einen Ausgang umschalten oder bei einem Eingang den pullup-Widerstand ein-/ausschalten wollen?
> Auch wenn jetzt wohl jeder meint, dass Assembler das Mass > aller dinge ist, bin ich jedoch der Meinung das Assembler mehr oder > weniger überhohlt ist. Ich würde beide Meinungen als Unsinn bezeichnen.
Wenn Du meinst, dass Assembler "überholt" ist, warum bleibst Du dann nicht einfach bei BASCOM (gibts schließlich auch für AVR)? Warum fängst Du dann überhaupt mit C an??? Und dann rummotzen, dass man in C ja doch so manche Sachen selber machen muss... C ist nunmal eine Hardware-nahe Hochsprache. Und das hat gewaltige Vorteile, wenn man ein Hardwaresystem programmieren will. Aber es wird immer Leute wie Dich geben, die meinen, man müsse die Hardware überhaupt nicht kennen um sie zu programmieren. Und das sind dann die klischeehaften "typischen" BASCOM-Programmierer... Und Assembler hat auch immer noch eine Daseinsberechtigung in bestimmten Fällen.
> Hmm was interessiert mich eigentlich dieses Register? > Sowas sollte der Compiler von selber machen wenn ich ihm sage... Ich würde mich bedanken, weil der Compiler auf diese Weise Sachen versperren würde, die ich sonst machen könnte. Vgl. im BASCOM-AVR Manual Seite "AVR Internal Hardware Port B" in der Tabelle "DDBn Effects on Port B Pins". Deine "Automatik" würde 2 von 4 der Anwendungsmöglichkeiten versperren! Nimm's als gegeben hin, und verwende den assembler-entsprechenden BASCOM Befehl um DDRA zu setzen, also wahrscheinlich SET DDA0 wenn du an PORTA.0 fummelst.
Pardon: Assembler ist keineswegs überholt, schon gar nicht von BASIC, sondern unter bestimmten gegebenen Voraussetzungen ein sehr sinnvolles Werkzeug, z.B. bei den ersten Schritten auf einem unbekannten Controller; zumindest zwingt es zum Lesen des Datenblatts! Und an welcher Stelle, bitte, hatten wir es bis jetzt mit einem AD-Wandler zu tun?
Hä wo hab ich gesagt das ich C verwende? Ich nehme schon immer BASCOM und jetzt für die Megas BASCOM AVR. Und woher der Hochsprachen Compiler das wissen will... Ganz einfach zum einen hab ich bisher beim 8015er die Port auch so geschalten mit SET und RESET und es hat immer funktioniert und zum anderen ist das der Befehl der dort für das Schalten verwendet wird. Das Assembler keine Daseinsberechtigung hat sag ich ja nicht, aber für mich ist Assembler einfach unverständlich, und von der extrem langen Einarbeitungszeit mal ganz zu schweigen. Ausserdem find ich Assembler dermassen unübersichtlich... Und du hast recht mich interessiert der interne Aufbau und wie die Daten verarbeitet werden relativ wenig bis garnicht. Warum sollt ich auch unbedingt wissen müssen in welchen Register jetzt grad die HEX zahl rumeiert? Das ist Sache des Compilers das ganze zu verwalten. Mal ganz davon abgesehn das jeder Controller anders ist... MfG BuLLDoGGe P.S. Entschuldigung wenn sich jemand auf den Schlipps getretten fühlt...ich Assembler Götter...O Mann
> Mal ganz davon abgesehn das jeder Controller anders ist... Eben. Der AVR braucht eine Einstellung für das DDRx Hardwareregister, die definiert, ob das PORTx Hardwareregister als Eingabe oder als Ausgabeport arbeiten soll. Glücklicherweise hat auch BASCOM Befehle dazu s.o. > P.S. Entschuldigung wenn sich jemand auf den Schlipps getretten > fühlt...ich Assembler Götter...O Mann Entschuldigung angenommen. Du hast aber auch eine Art zu schreiben, die nahe an der Kante ist. > ich bin langsam am Verweifeln. Mach dich mal locker. So schwer ist es nicht.
Es ist schwerer als gedacht... Beim alten 8051 bisher hatte ich solche Problem noch nie und ich sitzt jetzt seit 2 Tagen rum und es geht nicht mal das simple schalten einer LED. Frust hoch 5. Wenn ich dran denke was noch alles zu realisieren ist... O Mann. Set Ddra.0 Denn Befehl kann ich mal Compilieren...mal sehn was passiert wenn ichs morgen mal auf den Chip spiel...vll gehts dann entlich. Für heute sind meine Nerven jedenfalls am Ende... Schönen Abend noch euch allen... MfG Matthias
Heute ärgerst du dich, und morgen wirst du dich über die Vorteile vom AVR gegenüber vom 8051 freuen...glaubs mir. Ich habs auch durch ;-)
Wie dem auch sei... Aber um das Lesen des Datenblatts (und evtl. einiger application notes von Atmel) kommen Sie nicht herum, sonst können Sie die AVRs nie wirklich sinnvoll nutzen, d.h. mit einem schnellen 8051er wären Sie besser dran.
Hallo Matthias, Sie kommen noch heute Abend mit dem alten Programm zum Erfolg, vorausgesetzt, Ihre LED leuchtet noch mit 50k Vorwiderstand (die pull-ups beim m16 haben nämlich 20..50k): schließen Sie die LED direkt zwischen m16-PIN und Masse an - und: es blinkt!
Matthias wrote: > Ganz einfach zum einen hab ich bisher beim 8015er die Port auch so > geschalten mit SET und RESET und es hat immer funktioniert und zum > anderen ist das der Befehl der dort für das Schalten verwendet wird. Na na, nicht alle 8051-er über einen Kamm scheren. Viele neuere 8051 haben sogar 2 Funktionsauswahlbits und damit 4 Möglichkeiten: - klassik 8051 open drain mit pullup - push-pull output - input ohne pullup - open drain ohne pullup Und da der Compiler nicht in Deinen Kopf schauen kann, mußt Du ihm schon sagen können, welche Konfiguration Du willst. Peter
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.