Forum: Mikrocontroller und Digitale Elektronik Anfängerschaltung - ATmega8


von blan (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
so ich versuch mich nun mal nach meinem ersten erfolgreichen versuchen
an meinem STK500 an eine selbst gelötete Platine.
Ich will mir eine kleine Schaltung mit einem ATmega8 und einem MAX232
basteln mit der ich dann über RS232 LEDs an- und ausschalten kann (über
ein Terminal am Computer).
Wie ichs auch schon in der Schule gelernt hab habe ich also die platine
im 2:1 maßstab auf meinem block gezeichnet und schonmal den ATmega8
angeschlossen und wollte von euch nun wissen ob es so klappt wie ich
mir des vorgestellt hab,
vorallem die resetkontakte (x1, x2) der kondensator (c1) und die diode
(d1). das ich noch AVcc, ARef und GND anschließfen muss weiss ich
schon. Und wenn euch noch was einfällt was vll besser gemacht werden
könnte - würd es gern erfahren. danke.

(Es handelt sich um eine Streifen(?) Europlatine, die verbindungsbahnen
gehen von links nach rechts)

mfg blan

von Jan M. (Gast)


Lesenswert?

Das sollte durchaus so funktionieren.
Der Kondensator sollte im Allgemeinen möglichst nah an den IC, <1cm ist
üblich.
Die Diode ist nicht unbedingt nötig, kann aber die Schaltung unter
Umständen schützen. Beachte aber bei der Wahl der Versorgungsspannung
den Spannungsabfall an der Diode.

Genauso, wenn du den Max232 einzeichnest: Die Kondensatoren möglichst
direkt neben den IC (das funktioniert auf Grund der Pinbelegung sehr
schön)

von blan (Gast)


Lesenswert?

danke, das mit dem Kondensator habe ich nicht gewusst. wie siehts denn
mit dem MAX232 und generell anderen ICs aus - brauchen die alle einen
seperaten Kondensator, ich wollte ja hier gleich einen für alles nehmen
was wohl nicht so gut ist oder?
ich bin schonmal beruhigt das der reset funktioniert :)

mfg blan

von Jan M. (Gast)


Lesenswert?

Naja, "brauchen" ist relativ. Es kann durchaus auch komplett ohne
funktionieren, besser ist jedoch, an jedem IC-Anschluss einen
Kondensator sitzen zu haben. (Gut, für den Mega8 verwende ich immer nur
einen, der sitzt als smd mittig unter dem IC).
Und angesichts der Preise für einen einzelnen kleinen Kondensator nimmt
man da besser gleich einen Hunderterpack für 2 Euro und setzt an jeden
IC einen, damit hat man dann schon mal eine Fehlerquelle
ausgeschlossen.

von Hauke Radtki (Gast)


Lesenswert?

Du solltest für jedes IC einen eigenen 100nF kondensator anbringen.
Diese dienen zum filtern der Spannung. Diese könnte von allem möglichem
gestört werden (äußere einstralungen, übersprechen von anderen leitungen
usw) Und sollte direkt am IC sitzen, da ja sonst wieder störungen auf
die Spannung übertragen werden könnten.

von blan (Gast)


Lesenswert?

ok, erstmal vielen dank habt mir sehr geholfen. werde jetzt erstmal den
plan umändern und vervollständigen danach evtl nochmal euch um hilfe
bitten :)

mfg blan

von Sven (Gast)


Lesenswert?

ich hab vor längerem mal so was im eagle gemacht wenn interresse besteht
kann ich das board also eagle datei oder jpg zum ätzen mal posten.

sven

von blan (Gast)


Lesenswert?

ja, bin für jede information dankbar! ist eagle ein vectorgrafik
programm? wenn ja, für welches OS?

mfg blan

von Hannes L. (hannes)


Lesenswert?

> ja, bin für jede information dankbar! ist eagle ein vectorgrafik
> programm? wenn ja, für welches OS?

www.cadsoft.de

...

von blan (Gast)


Angehängte Dateien:

Lesenswert?

hi,
ich hab nun die ganze Schaltung fertig und auch noch optimiert und
wollte gern das es jemand überprüft der sowas schonmal gemacht hat.
außerdem bin ich mir nicht sicher ob ich GND (22), Aref (21) und AVcc
(20) am ATmega8 richtig, also ohne Kondensator, angeschlossen habe.
Falls jemand noch ein fehler auffällt, bitte sagts mir. danke

mfg blan

von Reinhold Rabe (Gast)


Lesenswert?

Das machst du zwar sehr ordentlich, dennoch sind wir im 21. Jahrhundert,
und da gibt's Layoutprogramme ;). Macht viel mehr Spaß damit :)

von Karl heinz B. (kbucheg)


Lesenswert?

Versuch auch die Leds in eine Reihe zu kriegen.
Macht mehr Spass bei der Programmierung von Lauflichtern.

von blan (Gast)


Lesenswert?

wenn du mir ein freies layout programm zeigst werd ich das in zukunft
benutzen :)
aber zu meiner frage, funktioniert die schaltung so? will die
fehlerquelle bei der schaltung schonmal ausschließen. die kreise sind
übrigends unterbrechungen. danke

mfg blan

von Helferlein (Gast)


Lesenswert?

Denke bitte daran, die Leiterbahnen auch unter dem IC's zu trennen, so
dass nicht die rechte Seite der Pins mit der linken Seite der Pins
verbunden ist!

von Hannes L. (hannes)


Lesenswert?

> ein freies layout programm

http://www.cadsoft.de/freeware.htm

...

von blan (Gast)


Lesenswert?

mit frei dachte ich eher an unter (L)GPL gestellte Software, nunja ich
werds mir mal anschaun. kann mir noch jemand folgendes beantworten:

> außerdem bin ich mir nicht sicher ob ich GND (22), Aref (21) und
AVcc
> (20) am ATmega8 richtig, also ohne Kondensator, angeschlossen habe.

mfg blan

von Hannes L. (hannes)


Lesenswert?

Wenn du nicht sicher bist, dann schau doch einfach mal bei ATMEL nach
den AVR-AppNotes, da ist mit Sicherheit etwas zum Schaltungsdesign
dabei. Auch das Datenblatt hat dafür vermutlich ein paar
Informationen.

Da ich es ablehne, in riesengroßen Grafiken herumzuscrollen und dabei
immer nur einen kleinen Ausschnitt zu sehen, kann ich zu deinem Entwurf
nix sagen, sorry.

Aber der ATMega8 sollte als Minimalbeschaltung haben:
- 100nF Kerko zwischen Vcc und GND
- 100nF Kerko zwischen AVcc und AGND
- 100nF Kerko zwischen AREF und AVcc
- 3k3..10k zwischen Reset und Vcc

Bei Benutzung des ADC empfiehlt sich der Einsatz einer Drossel zum
Entkoppeln von AVcc von Vcc, Einzelheiten stehen im Datenblatt.
Weiterhin sollten GND und AGND am gemeinsamen Massepunkt der Platine
(da, wo der Elko und ggf ein weiterer 100nF-Kerko sitzt) verbunden
sein.

Weitere Informationen findest du auch im WIKI (Atrikelsammlung).

Was willst du mit einem GPL-Layoutprogramm, wenn du die
Freeware-Version von Eagle ganz legal kostenlos nutzen darfst?

...

von Pat F. (breaker87)


Lesenswert?

Schau dir mal folgenden Thread an:
http://www.mikrocontroller.net/forum/read-1-380621.html#new

Das ist ein kleines aber Feines Entwicklungsboard mit dem Mega8...


mfg

von blan (Gast)


Lesenswert?

danke, werd mir die sachen mal anschaun und dann mal loslegen.

mfg blan

von blan (Gast)


Lesenswert?

hi ich bins mal wieder. also hab mir jetzt bauteile gekauft aber bin mir
nicht sicher ob ich überhaupt die richtigen erwischt hab. also die
reichelt bestellnummer ist "X7R-2,5 100N". und ist es ein problem
wenn in einem schaltplan ein kondensator eingezeichnet ist der eine
bestimmte polarität hat und mein kondensator (so wie ich es seh) keine
bestimmte polarität hat?

mfg blan

von Hauke Radtki (Gast)


Lesenswert?

nein nur anders herum wäre ungesund.

von Alex Trusk (Gast)


Lesenswert?

freie software:
http://www.mikrocontroller.net/articles/Schaltplaneditoren
-> gschem/pcb
-> kicad
-> tinycad

von zerberus (Gast)


Lesenswert?

Hi blan,

kann mich alex nur anschließen. Ich würde mal gschem und pcb
probieren.
Alles GPL.

http://geda.seul.org/

ich gehe mal davon aus, dass du Linux benutzt, wenn du schon auf GPL
bestehst :)

Ciao
 Z.

von blan (Gast)


Lesenswert?

danke, ja ich benutze linux. jetzt hab ich ein kleines problem: meine
schaltung scheint (vll bis aufn reset) zu funktionieren bloß versteh
ich net wieso mein port nur negative spannung (-1.8V) ausgibt um bei
positiv immer bei  0.0V bleibt, kann mir das jemand kurz erläutern das
ich das verstehen kann?

mfg blan

von blan (Gast)


Lesenswert?

hrm kann mir wirklich niemand helfen? ich bekomm aus meinem avr PB0 nur
0,3V / 0,5V (bei 5,12V / 6,9V Spannungszufuhr)... woran kann das
liegen, vorher hab ich irgendwann mal 1,8V bekommen jetzt aber netmehr?
o.O

mfg blan

von Karl heinz B. (kbucheg)


Lesenswert?

Welches Programm?
Hast du den Port auf Ausgang gestellt?
(Deine Volt Zahlen schauen so aus als ob der
Port auf Engang wäre und du nur den Pullup
ein und ausschaltest).

von blan (Gast)


Angehängte Dateien:

Lesenswert?

hier mal der code. außerdem verhält sich der AVR komisch, manchmal is
garkeine spannung drauf (~0.01V) und manchmal scho (~0.5V) ... sehr
merkwürdig.

mfg blan

von johnny.m (Gast)


Lesenswert?

Wieso schaltest Du einen Pin, an dem eine LED hängt, auf Eingang??? Habe
noch keine LED kennengelernt, die Daten sendet oder so...

von Rolf (Gast)


Lesenswert?

Würde ja mal das Programm mehr als einmal laufe lassen.

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#define LED_DDR         DDRB
#define PORT            PORTB
#define LED_0           0

uint8_t i = 0;
uint8_t j = 0;

SIGNAL(SIG_OVERFLOW0)
{
  if(j == 15)
  {
    if(i)
          LED_DDR &= ~(1 << LED_0);
    else
          LED_DDR |=  (1 << LED_0);

        j = 0;
        i = !i;
  }

  j++;
}

int main(void)
{
  TIMSK |= (1 << TOIE0);
  TCNT0  = 0x0;
  TCCR0 |= (1 << CS00) | (1 << CS02);

  PORT &= ~(1 << LED_0);

  sei();

  return 0;
}

von Rolf (Gast)


Lesenswert?

vor Return 0 setze mal ein while(1);

von Rolf (Gast)


Lesenswert?

Falls du deime LED mit der Katode am PORTB PIN0 und mit der Anode an
Plus (nätülich mit Vorwiderstand) angeschlossen hast, sollte es
funktionieren.
Im AVR passt's.

von johnny.m (Gast)


Lesenswert?

Noch ein paar Anmerkungen:
1. Globale Variablen, die in Interrupt-Handlern bearbeitet werden
müssen volatile deklariert sein!
2. Bitte benutze die aktuelle WINAVR-Version. SIGNAL ist veraltet!
3. Endlosschleife am Ende

von Karl heinz B. (kbucheg)


Lesenswert?

Dachte ich mirs doch:

int main(void)
{
  TIMSK |= (1 << TOIE0);
  TCNT0  = 0x0;
  TCCR0 |= (1 << CS00) | (1 << CS02);

  PORT &= ~(1 << LED_0);


PORT also PORTB ist immer noch auf Eingang geschaltet.
DDRB, also LED_DDR kommt mit einem Wert von 0 auf
die Welt und da du das nie änderst, bleibt das auch
auf 0. 0 bedeutet aber Eingang!

 TCCR0 |= (1 << CS00) | (1 << CS02);

 LED_DDR = ( 1 << LED_0 );  // den Pin an dem die LED hängt
                            // auf Ausgang schalten
 PORT &= ~( 1 << LED_0 );

von Karl heinz B. (kbucheg)


Lesenswert?

Ach jetzt seh ichs erst!
Du schaltest die Datenrichtung im Interrupt um!
Wenn du nur eine LED blinken lassen willst, macht man das
so:

SIGNAL(SIG_OVERFLOW0)
{
  if(j == 15)
  {
    if(i)
          PORT &= ~(1 << LED_0);
    else
          PORT |=  (1 << LED_0);

        j = 0;
        i = !i;
  }

  j++;
}

Du legst die Datenrichtung einmal beim Programmstart
in main() fest (mittels LED_DDR) und wechselst dann
über den PORT den Ausgangspin von 0 auf 1 bzw. umgekehrt.

von Rolf (Gast)


Lesenswert?

LED :so funktioniert dein Programm nicht

-|
 |
 |      __
 |-----|__|--+--
 |          _|_
 |          \|/
-|           |
             |
            ---

so ja:
------------+-------------+5V
-|         _|_
 |         \|/
 |      __  |
 |-----|__|-+---
 |
 |
-|

von Rolf (Gast)


Lesenswert?

Funktioniert schon, wie er es macht.

Wenn sein DDR 0 is, ist der PIN tristate, also LED aus.
Wenn sein DDR 1 ist, ist der PIN Low, also LED an.

von Karl heinz B. (kbucheg)


Lesenswert?

In beiden Fällen würde das Programm die LED zum
blinken bringen :-) (wenn denn das Programm richtig
wäre).

Soooo wenig Strom können die Ausgangspins nun
auch wieder nicht liefern.

von Rolf (Gast)


Lesenswert?

Häh?

von johnny.m (Gast)


Lesenswert?

@Rolf:
Dann schau mal in sein Posting oben, wo er seinen Schaltplan drin hat.
Es ist zwar nicht leicht zu lesen, aber er hat die LEDs Low Side
angeschlossen. Und dann funktioniert das so nicht! Außerdem macht man
so etwas einfach nicht. Habe den Eindruck, er hat den Sinn des Data
Direction Register nicht ganz verstanden.

von Karl heinz B. (kbucheg)


Lesenswert?

> Funktioniert schon, wie er es macht.
>
> Wenn sein DDR 0 is, ist der PIN tristate, also LED aus.
> Wenn sein DDR 1 ist, ist der PIN Low, also LED an.

Darüber will ich jetzt erst mal gar nicht nachdenken.
Nicht bei einem ersten Programm von einem Neuling.

DDR legt die Datenrichtung fest
PORT schaltet den Ausgang auf 0/1

Alles andere ist für einen Neuling Käse.

von blan (Gast)


Lesenswert?

okay vielen dank wie es aussieht funktionert es (5,12V). sry, das
problem ist das mein code auf dem STK500 funktioniert hat (mit den
onboard LEDS, ich hoff ich hab die jetzt nicht geschrottet mit 5V). was
mich jetzt bischen wundert das ich nach meinem 1kOhm wiederstand
immernoch 5,12V habe. laut der formel die ich gefunden haben

Rv = (Vges - Vdiode) / Iges
   = (5,12V - 1,9V ) / 0,006A
   = 536 Ohm

sicher wieder irgendein dummer fehler?

mfg blan

von Heinzi (Gast)


Lesenswert?

Gesetz den Fall du hast 2 verschiedene Atmels über eine Pullup Leitung
verbunden. (wie es bei I2C gemacht wird.)

Es verboten sie gegeneinander zu treiben. ALso, wenn beide ihre PINs
als Ausgang schalten und gegensätzliches auf den Bus setzen wollen.

Also macht man es so.

Man schaltet High durch Setzen des DDR auf 0 (Weil PU hochzieht),
und L durch Setzen des DDR auf 1,
der Wert im Portregister muss natürlich 0 sein.

von Karl heinz B. (kbucheg)


Lesenswert?

@Heinzi

Hoer mal.
Ich hab da kein Problem damit, dass man das bei I2C Verbindungen
von 2 Atmels so macht.

Aber hier geht es nicht darum 2 Atmels mittels einer
Pullup Leitung zu verbinden und zu verhindern, dass sich
die gegenseitig zerfleischen.

Hier geht es einfach nur darum, dass ein Neuling auf
seinem ersten selbst gelöteten Board eine LED zum
Blinken bringen will.
Und dazu macht man das 'nach Vorschrift'.

Ein geübter Handwerker kann auch mit einem Schraubenzieher
einen Nagel in die Wand schlagen. Aber einem 14-jährigen
Nachwuchsbastler drücke ich dazu einen Hammer in die Hand.

von johnny.m (Gast)


Lesenswert?

Wenn die LED ausgeschaltet ist, dann hast Du natürlich auch dort die 5
V. Die LEDs auf dem STK500 kannste so leicht nicht schrotten, da die
noch zusätzlich über Transistoren angesteuert werden und so verdrahtet
sind, dass es unmöglich ist, da mit Software was kaputt zu machen.

von ka-long (Gast)


Lesenswert?

Hi,

Miss die Spannung, wenn die Diode leuchtet !

Gruß ka-long

von blan (Gast)


Lesenswert?

oh ok, dann funktioniert bis jetzt alles. danke für die viele hilfe !

mfg blan

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.