Einen wunderschönen Sonntag wünsche ich euch erstmal.
Ich habe mir letzte Woche einige Bauteile für das Tutorial zum ATMega8
bestellt.
Mein ISP ist der AVRISP MKII von Atmel,
dazu nutze ich das Atmel Studio 6.
Programmieren tue ich mit Assembler.
Nachdem ich die Grundschaltung auf einer Lochraster-Platine aufgebaut
habe,
schaffte ich es meinen ersten Mega8 durch das setzen der CKOPT Fuse zu
verfusen. Quarzoszi ist richtig bedrahtet gewesen, Sut_CKL wurde auf
EXTCLK_6CK_ 4 oder 64ms (weis ich leider nichtmehr genau) gesetzt.
Danach konnte ich den µC nichtmehr ansprechen.
Gottseidank habe ich mit soetwas schon gerechnet und mit direkt 2 Chips
bestellt.
Nachdem ich den 2 Chip verbaut hatte, beschloss ich erstmal mit dem
Internen Takt zu arbeiten.
Mein eigendliches Problem ist nun, dass sich der mega 8 nur sporadisch
beschreiben lässt.
Manchmal lässt sich das Programm flashen, und mal nicht.
Um Programmierfehler auszuschließen, habe ich den Programmcode abgetippt
sowohl per Copy&Paste ins Studio eingefügt, abgespeichert, und auf den
Chip geflasht.
1
.include"m8def.inc"
2
3
ldir16,0xFF
4
outDDRB,r16;AllePinsamPortBdurchAusgabevon0xFFins
5
;RichtungsregisterDDRBalsAusgangkonfigurieren
6
ldir16,0x00
7
outDDRD,r16;AllePinsamPortDdurchAusgabevon0x00ins
8
;RichtungsregisterDDRDalsEingangkonfigurieren
9
10
loop:
11
inr16,PIND;anPortDanliegendeWerte(Taster)nachr16
12
;einlesen
13
outPORTB,r16;Inhaltvonr16anPortBausgeben
14
rjmploop;Sprungzu"loop:"->Endlosschleife
Ich hoffe, ich habe euch genug Informationen gegeben
Und danke schonmal für eure Hilfe.
ISP Takt 125 kHz
Dazu muss ich nun noch sagen, dass sich die Fuses zu jeder Zeit auslesen
lassen, selbst wenn sich das Programm nicht Flashen lässt.
//EDIT:
Nun ich denke ich habe den Fehler schon gefunden. Nun steht der ISP Takt
auf 250 kHz und es funktioniert.
Muss der ISP Takt immer genau 1/4 des µc Taktes betragen? oder darf er
auchnoch niedriger sein?
Hi
>Muss der ISP Takt immer genau 1/4 des µc Taktes betragen? oder darf er>auch noch niedriger sein?
Er muss kleiner als 1/4 des Taktes sein.
MfG Spess
komischer Weise, seid ich auf genau 1/4 umgestellt habe, funktioniert
das Prommen einwandfrei...
ich denke mal bei so einem kurzen Programm wird es Zeitlich eh keinen
unterschied machen ob ich nun auf 100kHz, 125kHz oder 250 kHz übertrage.
Hat denn eventuell einer von euch ne ahnung, warum mein 1. Mega8
verfused ist? generell sollten die fuses die ich eingestellt habe,
stimmen.
Es sei denn ich habe mich wirklich bei Sut_CKL verklickt und auf
EXTCLK_6CK_4ms anstelle von EXTCLK_6CK_64ms gestellt.
nur wie kriege ich das nun rückgängig?
Hi
>Es sei denn ich habe mich wirklich bei Sut_CKL verklickt und auf>EXTCLK_6CK_4ms anstelle von EXTCLK_6CK_64ms gestellt.
Die Startup-Time hat auf das Programmieren keinen Einfluß. Dadurch wird
nur das Verhalten nach einem Power-On-Reset gesteuert.
Anders sieht es mit der CKOPT-Fuse aus. Damit wird bei externem Takt
jeweils ein 36pf Kondensator von XTAL1 und 2 nach Masse geschaltet.
Vielleicht kommt dein Oszillator damit nicht klar.
Poste mal deine Schaltung. Vielleicht sind dort noch Fehler. Wie sieht
deine Stromversorgung aus?
MfG Spess
Meine Schaltung habe ich nach dem Tutorial hier aufgebaut.
http://www.mikrocontroller.net/wikifiles/f/f6/Mega8_Tutorial.png
Die Stromversorgung habe ich auch aus diesem Tutorial mit dem 7805
http://www.mikrocontroller.net/wikifiles/c/c5/V_Regler.gif
Achso der Spannungswandler wird von einem 12V selbstbau"Labor" Netzteil
befeuert.
Die CKOPT fuse habe ich, soweit ich weiß, auch gesetzt. jedoch habe ich
keinen 36pf kondensator zwischen XTAL1 und 2
Leider habe ich auch keinen 36pf Kondensator zur Hand. Zur Hand hätte
ich folgendes:
100nF WIMA Folie, 47nF Kerko, 10µF Elko, 100µF und 1000µF Elko
Hi
>Die CKOPT fuse habe ich, soweit ich weiß, auch gesetzt. jedoch habe ich>keinen 36pf kondensator zwischen XTAL1 und 2
Diese Kondensatoren werden im Controller durch CKOPT eingeschaltet.
Übliche Quarzoszillatoren vertragen eine Last von 15pF. Damit dürften
die zusätzlichen 36p zu viel für deinen Oszillator sein.
MfG Spess
Habe grade eben das Datenblatt der Oszi's geöffnet. Dort steht "1 to 10
TTL/ 15PF"
Also kann ich nun davon ausgehen, das ich den Quarz schon geschrottet
habe, oder dass er einfach nur nicht vernünftig arbeiten kann.
Wie könnte ich dies beheben?
Ich habe auch irgendwo gelesen, das man einen 2. µC als Taktgeber
benutzen kann, um den "defekten" zurück zu holen.
Wenn ich das richtig verstanden habe, brauche ich einfach einen Port auf
Ausgang schalten und diesen Port (PB0) mit XTAL1 des defekten Mega8
verbinden.
PB0 schalte ich dann in einer endlosschleife ein und aus.
Der defekte µC benötigt ja generell nur irgend einen Takt an XTAL1?
Nico T. schrieb:> Der defekte µC benötigt ja generell nur irgend einen Takt an XTAL1?
Benötigt er nicht den Takt, den du in den Fuses eingestellt hast?
In den Fuses habe ich ja bei SUT_CKSEL, EXTCKL_6CK_Xms eingestellt.
also keinen Speziellen Takt. Wenn ich das richtig verstanden habe,
reagiert der µC dann auf den Takt, der ihm vom QuarzOszillator
vorgegeben wird.
Nico T. schrieb:> Es sei denn ich habe mich wirklich bei Sut_CKL verklickt und auf> EXTCLK_6CK_4ms anstelle von EXTCLK_6CK_64ms gestellt.
Hast Du denn auch wirklich einen externen Oszillator angeschlossen?
Peter
Jap verbaut ist ein Externer Quarzoszillator mit 4.0000000mHz (Die
rechteckigen mit 4 Pins)
Pin 1 nicht beschaltet
Pin 7 GND
Pin 8 XTAL1
Pin 14 VCC +5V
Weiter Oben wurde ja schon geklärt, das ich die CKOPT Fuse wohl nicht
hätte setzen dürfen, da dadurch der Interne Kondensator von 36pF
aktiviert wird (Der Standardmäßige Quarzoszi kann nur mit 15pF)
Dazu noch die unbeantwortete Frage von mir, ob der Quarzoszi dadurch nun
inne Binsen ist, oder einfach nur nicht mehr vernünftig arbeiten kann.
Nico T. schrieb:> Weiter Oben wurde ja schon geklärt, das ich die CKOPT Fuse wohl nicht> hätte setzen dürfen, da dadurch der Interne Kondensator von 36pF> aktiviert wird
Das ist nur im 32kHz Quarz-Mode so. Schau mal ins Datenblatt, was zu
CKOPT bei extern Oszi steht.
Peter
Hi
>Das ist nur im 32kHz Quarz-Mode so. Schau mal ins Datenblatt, was zu>CKOPT bei extern Oszi steht.
Dort steht:
External Clock
To drive the device from an external clock source, XTAL1 should be
driven as shown in Figure
13. To run the device on an external clock, the CKSEL Fuses must be
programmed to “0000”.
By programming the CKOPT Fuse, the user can enable an internal 36pF
capacitor between XTAL1 and GND, and XTAL2 and GND.
MfG Spess
nochmal auf Deutsch^^
Durch Programmieren der CKOPT-Fuse kann ein interner Kondensator (36pF)
zwischen XTAL1 und GND geschaltet werden.
und das wird wohl zu viel für meinen Oszi sein, da er nur 15pf abkann.
Nochmal meine Frage, ist der Oszi dadurch defekt oder arbeitet er
dadurch ncihtmehr sauber?
Ok nach längereme Googeln, bin ich zu der Erkenntnis gekommen ,das der
Quarzoszillator durch den 36pf kondensator wohl nur eine längere
Einschwingphaseund eine langsamere Taktphase erhält.
Kommt das so hin oder habe ich da mist gelesen?
Kann sein, aber wenn du einen zweiten Chip da hast, kannst du auch
einfach in einer Endlosschleife nen IO-Pin toggeln (oder CLKO oder so
nutzen) und damit den Takt vorgeben. Das klappt eigentlich immer.
Aber kaputt ist er deswegen auf keinen Fall... also weder der Oszi noch
der uC... ;)
Wenn der Quarzoszillator also trotzdem anständig arbeitet, sollte ich
doch eine verbindung zum µc bekommen, was jedoch nicht der Fall ist.
Außer die CKOP und SUT_CKSEL Fuse habe ich nicht verstellt.
Wie sähe denn ein Programm für den Mega8 zum Toggeln von PB0 aus?
Vielen dank an dieser Stelle, dafür dass ihr euch mit meinen Problemchen
auseinander setzt.
Vielen Dank für dein Programm.
Habe es ausgetestet, jedoch bringt es leider keine besserung...
18:57:18: [ERROR] Failed to enter programming mode. ispEnterProgMode:
Error status received: Got 0xc0, expected 0x00, ModuleName: TCF (TCF
command: Device:startSession failed.)
Nico T. schrieb:> Vielen Dank für dein Programm.> Habe es ausgetestet, jedoch bringt es leider keine besserung...>> 18:57:18: [ERROR] Failed to enter programming mode. ispEnterProgMode:> Error status received: Got 0xc0, expected 0x00, ModuleName: TCF (TCF> command: Device:startSession failed.)
Worauf bezieht sich die Fehlermeldung?
Funktioniert mein Programm mit dem funktionierenden uC und einer LED an
PB0?
Ja dein Programm an sich funktionert an dem intakten µc mit Standardtakt
von 1mHz.
Nun habe ich PB0 (Die LED hängt auch noch dran) an XTAL1 des verfusten
µC gelegt und den ISP an selbigen geklemmt.
Sobald ich die Fuses auslesen möchte kommt die Fehlermeldung:
[ERROR] Failed to enter programming mode. ispEnterProgMode:
Error status received: Got 0xc0, expected 0x00, ModuleName: TCF (TCF
command: Device:startSession failed.)
Ich weiß nicht ob es eventuell problematisch ist, beide µC's in der
selben schaltung zu haben. Ich benutze quasi mit beiden Controllern die
selben Kondensatoren und den Pulldown Wiederstand für Reset
Ich habs geschafft leute :-)
es lag an einer kalten lötstelle... bzw. ziehe ich die verbindungen mit
Kupferlackdraht... der Draht zwischen (Oszi)Pin8 und XTAL1 war nur an
einem Ende vernünftig "abisoliert"...
Aber warum das Taktgeben durch den 2. µc nicht funktionieren wollte,
bleibt mir ein Rätsel. Denn dieser Draht war richtig abisoliert und
vernünftig gelötet.
Vielen lieben Dank an euch Alle für eure bemühungen.
Lieben Gruß, Nico
Entschuldigung für diese ganze Hin und Her,
jedoch bin ich nun wieder bei meinem 1. Problem (nur Sporadisches
schreiben auf den µc, angelangt.
die ISP Taktfrequenz liegt nun bei 1mHz (µC Takt 4mHz)
Die Fuses lassen sich auslesen aber folgendes Programm nicht flashen:
1
.include "m8def.inc"
2
3
ldi r16, 0xFF
4
out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
; Richtungsregister DDRB als Ausgang konfigurieren
6
ldi r16, 0x00
7
out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
; Richtungsregister DDRD als Eingang konfigurieren
9
10
loop:
11
in r16, PIND ; an Port D anliegende Werte (Taster) nach r16
12
; einlesen
13
out PORTB, r16 ; Inhalt von r16 an Port B ausgeben
14
rjmp loop ; Sprung zu "loop:" -> Endlosschleife
öffne ich jedoch das Programm zum toggeln, funktioniert es einwandfrei.
Als würde irgendwas falsch programmiert sein.
Hi
>die ISP Taktfrequenz liegt nun bei 1mHz (µC Takt 4mHz)
Was ist eigentlich an kleiner so schwer zu verstehen? Nur weil das
Lesen der Fuses funktioniert heißt das noch lange nicht, das auch das
Flashen klappt.
Hast du das automatische Löschen vor dem Flashen aktiviert?
MfG Spess
Entschuldigung ich habe leider das < vor den 1mHz vergessen. Habe es mit
sämtlichen Frequenzen unterhalb 1mHz probiert.
Derzeit ist 500kHz eingestellt.
Erase device before Programming ist aktiviert
Verify Flash after Programming ist auch aktiviert.
//Edit:
Und wie gesagt, es liegt immer ganz an dem Programm welches ich flashen
will
Gehts mit avrdude? ISP-Stecker richtig drauf? Die Leitungen halbwegs
brauchbar verlegt?
Klemm mal einen Logic analyzer, sofern vorhanden, dran, und schau mal,
ob da überhaupt alles ankommt...
AVR DUDE habe ich noch nicht ausgetestet. Logic Analyzer habe ich nicht,
stehe ziemlich am anfang meiner Erfahrungen mit elektrotechnik.
ISP Stecker ist richtig drauf, die leitungen sind alle so kurz wie
möglich und ohne überkreuzungen gelegt.
Da jedoch einige Programme tadellos funktionieren, gehe ich davon aus,
das soweit alles an Daten ankommt.
zum Flashen benutze ich AVR Studio 6, der Programmcode lautet:
1
.include "m8def.inc"
2
3
ldi r16, 0xFF
4
out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
; Richtungsregister DDRB als Ausgang konfigurieren
6
ldi r16, 0x00
7
out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
; Richtungsregister DDRD als Eingang konfigurieren
9
10
loop:
11
in r16, PIND ; an Port D anliegende Werte (Taster) nach r16
12
; einlesen
13
out PORTB, r16 ; Inhalt von r16 an Port B ausgeben
14
rjmp loop ; Sprung zu "loop:" -> Endlosschleife
die LED im ISP(am USB anschluss) Blinkt einmal kurz während der
übertragung, die LED an PB3/Miso oder Mosi (ausm Stehgreif keine ahnung
was es nun ist) reagiert garnicht.
wenn ich z.b.
1
#include<avr/io.h>
2
#include<util/delay.h>
3
4
intmain(void)
5
{
6
DDRB|=(1<<PB0);//PB0 als Ausgang setzen
7
8
while(1)
9
{
10
PORTB|=(1<<PB0);//PB0 auf high setzen
11
_delay_ms(1000);
12
PORTB&=~(1<<PB0);//PB0 auf low setzen
13
_delay_ms(1000);
14
}
15
}
auf den Chip schreibe, funktioniert alles.( die LED im ISP (USB
anschluss blinkt mehrmals)
LED an PB3 blinkt auch während der übertragung, und die LED auf PB0
blinkt im sekundentakt wie vom Programm vorgeschrieben.
Optionen habe ich keine verändert, spricht alles soweit noch im
Auslieferungszustand. nur die Fuses habe ich auf ext Takt umgestellt.
Hi
>zum Flashen benutze ich AVR Studio 6, der Programmcode lautet:>....>die LED im ISP(am USB anschluss) Blinkt einmal kurz während der>übertragung, die LED an PB3/Miso oder Mosi (ausm Stehgreif keine ahnung>was es nun ist) reagiert garnicht.>wenn ich z.b.>....>auf den Chip schreibe, funktioniert alles.( die LED im ISP (USB>anschluss blinkt mehrmals)>LED an PB3 blinkt auch während der übertragung, und die LED auf PB0>blinkt im sekundentakt wie vom Programm vorgeschrieben.
Dein Assemblerprogramm hat eine Länge von genau 7 Word. Das C-Programm
ein mehrfaches. Wahrscheinlich siehst du das Blinken an MOSI gar nicht.
> in r16, PIND ; an Port D anliegende Werte (Taster) nach r16> ; einlesen
Wie sind denn deine Taster angeschlossen?
MfG Spess
damit aktivierst du die internen Pullups bei den Taster Eingängen. Das
setzt vorraus, das du wie üblich negative Logik benutzt, Taster gehen
gegen Masse und ziehen den Eingangspin herunter beim Tasten.
Wenn deine Tasten an + gehen, solltest du an Port D pulldowns vorsehen,
damit die Eingänge bei offenen Tastern definierte Pegel haben.
Nabend, endlich Feierabend.
Ich denke zwar nicht, das die beschaltung der Taster komplikationen beim
Flashen hervorrufen, aber ihr seid hier die Experten ;-)
Meine Taster gehen nach GND und sind nach VCC mit jeweils einem 10K
Pullup Wiederstand versehen.
http://www.mikrocontroller.net/wikifiles/8/8a/Taster.gif