mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit AtMega16


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>was meinst du DDR?
DataDirectionRegister

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRx ist das Datenrichtungsregister von PORTx.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger Krull (krulli) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viel Erfolg ;-)

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.