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.
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
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