Anfängerschaltung - ATmega8

Gast #350908
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
Angehängte Dateien:
Gast #350909
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)
Gast #350910
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
Gast #350911
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.
Gast #350912
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.
Gast #350917
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
Angehängte Dateien:
Gast #350920
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
Gast #350923
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
#350924
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?

...
Gast #350927
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
Gast #350931
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
Gast #350932
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
Gast #350936
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;
}
Gast #350939
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
#350940
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 );
#350941
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.
Gast #350946
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.
#350947
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.
Gast #350948
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
Gast #350949
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.
#350950
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.
Gast #350951
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren