Forum: Mikrocontroller und Digitale Elektronik mega 8 lässt sich nur sporadisch beschreiben


von Nico T. (nico_t)


Lesenswert?

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
     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
Ich hoffe, ich habe euch genug Informationen gegeben
Und danke schonmal für eure Hilfe.

von Spess53 (Gast)


Lesenswert?

Hi

>Mein eigendliches Problem ist nun, dass sich der mega 8 nur sporadisch
>beschreiben lässt.

Welcher ISP-Takt hast du eingestellt?

MfG Spess

von Nico T. (nico_t)


Lesenswert?

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?

von Eumel (Gast)


Lesenswert?

Niedriger ist normalerweise kein Problem. Dauert dann halt etwas länger.

von Spess53 (Gast)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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?

von Spess53 (Gast)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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?

von al3ko (Gast)


Lesenswert?

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?

von Nico T. (nico_t)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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?

von Nico T. (nico_t)


Lesenswert?

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?

von Marian (phiarc) Benutzerseite


Lesenswert?

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... ;)

von Georg G. (df2au)


Lesenswert?

Der Quarzoszillator nimmt durch die zusätzlichen 36pF keinen Schaden. Es 
werden nur die Flanken etwas flacher. Aber das stört auch nicht weiter.

von Nico T. (nico_t)


Lesenswert?

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.

von al3ko (Gast)


Lesenswert?

Nico T. schrieb:
> Wie sähe denn ein Programm für den Mega8 zum Toggeln von PB0 aus?

Ich werfe in den Raum:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main(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_us(500);
12
PORTB &= ~(1<<PB0); //PB0 auf low setzen
13
_delay_us(500);
14
}
15
}

Damit haste dann 1MHz.

Alle Angaben ohne Gewähr.

Gruß

von Nico T. (nico_t)


Lesenswert?

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.)

von al3ko (Gast)


Lesenswert?

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?

von Nico T. (nico_t)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

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

von Nico T. (nico_t)


Lesenswert?

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

von Marian (phiarc) Benutzerseite


Lesenswert?

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...

von HFF (Gast)


Lesenswert?

Wie flasht du denn?

Welches Programm zum Flashen, welche Datei, welche Optionen?

Wie ist die genaue Fehlermeldung?

von Nico T. (nico_t)


Lesenswert?

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
int main(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.

von spess53 (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Schreib mal bitte nach 'out DDRD,r16' noch ein
1
  ldi r16,0xff
2
  out PORTD,r16
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.

von Nico T. (nico_t)


Lesenswert?

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

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.