Forum: Mikrocontroller und Digitale Elektronik Probleme mit AtMega16


von Matthias (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.


von senex24 (Gast)


Lesenswert?

Auch bei 10k sollte man, wenn nicht gerade die Sonne hereinscheint, 
etwas bei der LED sehen. Ich vermute eher, dass DDR nicht gesetzt wurde.

von Matthias (Gast)


Lesenswert?

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

von Rahul, der Trollige (Gast)


Lesenswert?

>was meinst du DDR?
DataDirectionRegister

von johnny.m (Gast)


Lesenswert?

DDRx ist das Datenrichtungsregister von PORTx.

von Stefan (Gast)


Lesenswert?


von Matthias (Gast)


Lesenswert?

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

von senex24 (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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

von senex24 (Gast)


Lesenswert?

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?

von Rolf Magnus (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von senex24 (Gast)


Lesenswert?

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?

von Matthias (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

Ach, tatsächlich. Ganz unten im ersten Posting steht tatsächlich "BASCOM 
AVR"... Tja dann...

von Matthias (Gast)


Lesenswert?

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

von Holger K. (krulli) Benutzerseite


Lesenswert?

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 ;-)

von guru (Gast)


Lesenswert?

Viel Erfolg ;-)

von senex24 (Gast)


Lesenswert?

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.

von senex24 (Gast)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.