Forum: Mikrocontroller und Digitale Elektronik mega 8 lässt sich beschreiben aber läuft nicht


von Michael S. (michi-s)


Angehängte Dateien:

Lesenswert?

Hallo,
hab das problem, dass ich nen ATmega8 zwar laut PonyProg erfolgreich 
programmieren kann, aber das Programm nicht ausgeführt wird. Ich hab zum 
Testen folgenden Code verwendet:
1
#include <avr/io.h>  
2
3
4
int main(){
5
6
  DDRD = 0x04;
7
  PORTD = 0x04;
8
9
  while(1){
10
  }
11
12
  return 0;
13
}

nun Messe ich an PD2, aber da sind keine 5V dran.

Hab leider aus blödheit anfänglich den 7805 verdreht in die schaltung 
eingebaut und meine an VCC irgendwas mit 7V gemessen zu haben, bin mir 
aber nicht mehr so ganz sicher.

Ist der ATmega jetzt hinüber, obwohl ich ihn noch beschreiben und 
auslesen kann?

Ach ja die Fuses sind wie folgt gesetzt:

CKSEL 1
CKSEL 2
CKSEL 3
SUT 0
BOOTSZ 0
BOOTSZ 1

Sind alle programmed (=0) alle anderen sind unprogrammed, es sollte also 
der interne 1MHz tackt aktiv sein. Was aber in meinem Beispiel ja völlig 
egal ist.

Gruß,
Michi

von Michael S. (michi-s)


Lesenswert?

ahhh shit, mir ist gerade aufgefallen dass der Wiederstand von RESET 
nach VCC fehlt

von Lutz (Gast)


Lesenswert?

1.) Wenn das dann behoben ist und es immer noch nicht läuft, mach mal 
ein Semikolon (leeres statement) in Deine while-Schleife.
2.) Und was die angehängte Schaltung mit PORTD und PORTD2 zu tun hat, 
habe ich auch noch nicht verstanden (zumindest ist es in der Schaltung 
an Port C angeschlossen). Aber ich bin auch gerade erst aufgestanden, da 
bin ich kombinatorisch/logisch noch nicht so drauf ...

von Michael S. (michi-s)


Lesenswert?

ner Wiederstand hats nicht gebracht, auch das Semikolon nicht.
ich hab den port D nur zum testen genommen, Port C geht genauso wenig 
:-(

aber merci schon mal für deine hilfe

von Purzel H. (hacky)


Lesenswert?

Es sollte sich immer was bewegen koennen :

int main(){

  DDRD = 0xFF; // alles ausgang
  portd=0xAA;

  while(1){
   portd=0x55;
   nop();
   portd=0xAA;

  }

  return 0;

von Michael S. (michi-s)


Lesenswert?

das brachte leider auch keinen Erfolg

von Lutz (Gast)


Lesenswert?

Der Widerstand zu RESET ist in der Schaltung auch nicht erforderlich, da 
der Pin ja gar nirgends angeschlossen ist (zumindest laut Schaltplan). 
Was (zumindest laut Schaltplan) aber auf jeden Fall an Hardware noch 
fehlt, ist ein 100 nF-Kondensator zwischen VCC und GND (=> 
"Abblockkondensator"). Und wenn das wirklich das vollständige Programm 
ist, sollte es eigentlich funktionieren.
Nur zum Testen kannst Du natürlich bei Port D bleiben, mußt dann 
natürlich auch an PD2 messen.
Mit den Fuses: Am besten noch mal alles in den Auslieferungszustand 
zurückversetzen und dann auslesen, ob es so stimmt.
Und was für den Codingstyle: Statt magic values wie z.B.
1
DDRD = 0x04;
lieber
1
DDRD = (1<<DDD2);
schreiben, das ist viel leichter zu verstehen.
Weiterhin habe ich nun gerade kein Datenblatt parat, aber hast Du bei 
dem PAckage mit VCC und VDD auch wirklich die richtigen Pins erwischt?

von Michael S. (michi-s)


Lesenswert?

den 100nF hab ich weggelassen, weil des 7805 genau neben dem uC liegt, 
da ist der 100nF (c3) ja eh gleich neben dem uC.

klar mess ich dann auch am PD2 wobei ich zum PC2 gewechselt hab, da kann 
man noch schöner messen.

AVCC und AGND waren nicht verbunden, hat aber auch nichts geändert die 
zu verbinden

von Lutz (Gast)


Lesenswert?

Das mit den 100 nF dürfte dann in diesem Fall tatsächlich egal sein, 
da der µC hier nur einmalig schaltet. Trotzdem sollte der 100 nF für den 
µC so dicht wie möglich an den beiden Anschlußpins sitzen; und Dein 100 
nF ist für den 7805 gedacht, damit der vernünftig regeln kann und die 
Ausgangsspannung glättet. Evtl. trotzdem mal einen weiteren 100 nF 
parallel dazulegen (quasi als letzt Hoffnung).

@hacky: Was erwartest Du da bei 1 MHz Takt zu sehen im Gegensatz zu 
0xFF?
while(1){
   portd=0x55;
   nop();
   portd=0xAA;

  }
Außerdem: Wenn schon ein Portpin so nicht geht, werden 8 sich auch nicht 
anders verhalten.

Wenn der µC sich schreiben und korrekt wieder auslesen läßt, würde ich 
auch denken, daß er noch lebt.

Ich würde noch mal
- mit dem Multimeter die Platine unter Saft vorsichtig durchklingeln, ob 
an den relevanten Pins (VCC, VDD etc.) auch die erwarteten Potentiale 
anliegen
- den Mini-Code (es ist auch wirklich nur der gepostete mit dem 
Semikolon?) noch mal in eine neue Datei/Projekt kopieren, neu 
kompilieren und flashen (nachdem der Chip in den Auslieferungszustand 
versetzt wurde, ich hatte mit AVR-Studio mal so ein nicht 
reproduzierbares Problem)

Ansonsten bin ich auch ratlos. Das im Makefile das falsche Device etc. 
eingestellt ist schließe ich doch zu recht aus, oder?

von Michael S. (michi-s)


Angehängte Dateien:

Lesenswert?

haut immer noch nicht hin, ich hab alle vcc und gnd Leitungen gemessen 
und mit Datenblatt verglichen, da ist auf allen (3 x Vcc und 3 x GND) 
das richtige Potential.
Der C3 sitzt nur 2mm vom uC weg. Momentan verwende ich eine externe 
Spannungsversorgung, schließlich will ich nicht immer mit 230V neben den 
Fingern messen.

von Da D. (dieter)


Lesenswert?

btw.,  Das Semikolon in der Endlosschleifen hat wirklich keinen 
Einfluss. Es tut gar nix, und wird damit vom Compiler auch ignoriert. 
Ich denke, du wolltest darauf hinaus, dass der Optimierer die Schlaufe 
evtl. entfernt. Das wird er nicht tun, da das eine Änderung des 
logischen Programmablaufs wäre. Nur endliche Schleifen werden entfernt, 
wenn sie keine sichtbare Auswirkung haben.

von Gast (Gast)


Lesenswert?

> Der Widerstand zu RESET ist in der Schaltung auch nicht erforderlich...

Natürlich muss ein Widerstand, ca. 10K, von RESET nach VCC geschaltet 
sein und besser auch noch ein 100nF von RESET gegen GND.

Dein B2 sollte auch noch einen Ladekondensator bekommen. Da reichen 
100µF.

von Gast (Gast)


Lesenswert?

> meine an VCC irgendwas mit 7V gemessen zu haben

Das könnte den Mega geschossen haben.

> obwohl ich ihn noch beschreiben und auslesen kann?

bist du dir sicher, dass das was du ausliest auch mit dem übereinstimmt 
was du reingeschrieben hast?

von Michael S. (michi-s)


Lesenswert?

ja ich bin mir sicher, da PonyProg Verificaton macht, auch wenn ich es 
schliße und neu öffne und nur den uC auslese, kommt das richtige raus.

der 10k zwischen reset und vcc ist schon drin

von (prx) A. K. (prx)


Lesenswert?

Gast schrieb:

> Natürlich muss ein Widerstand, ca. 10K, von RESET nach VCC geschaltet
> sein und besser auch noch ein 100nF von RESET gegen GND.

Da muss überhaupt keiner hin, denn im AVR ist bereits einer drin. Der 
hat ein bischen mehr als 10K, aber wenn man damit keine Motoren oder 
Relais schaltet langt das auch.

von Michael S. (michi-s)


Lesenswert?

naja es funktioniert nicht mit und nicht ohne, also wird der nicht das 
problem sein



wenn ich den uC wenigstens einfach von der platiene bekähme, aber ich 
hab nicht mal nen heißluft föhn da...

von Gast (Gast)


Lesenswert?

Welchen Oszillator hast du ausgewählt?
Wenn ext.Quarz dann prüf doch bitte mit einem Scope ob der schwingt.

von Michael S. (michi-s)


Lesenswert?

hab zum testen extra den internen ausgewählt, gleich werd ich sehn, ob 
der uC wirklich geschossen ist oder doch was anderes nicht stimmt, ich 
hab ihn grade ausgebügelt ^^ jetzt kommt der neue rein

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.