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
intmain(){
5
6
DDRD=0x04;
7
PORTD=0x04;
8
9
while(1){
10
}
11
12
return0;
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
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 ...
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
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?
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
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?
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.
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.
> 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.
> 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?
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
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.
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...
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