Forum: Mikrocontroller und Digitale Elektronik ATmega läuft nicht los obwohl Quarz schwingt


von Ratsuchender (Gast)


Lesenswert?

Ich habe ein Problem mit meinem ATmega16.
Vor einigen Wochen hatte ich den Controller ohne Probleme verwenden 
können, alles hat wie geplannt funktioniert. Dann habe ich das Projekt 3 
Wochen liegen lassen und wollte nun weiter machen, jedoch läuft der 
Controller allem anschein nach nicht los.
Wie ich bisher bei der Problemsuche vorgegangen bin:
- Versorgungsspannungen überprüft, alle Ok (VCC und AVCC verbunden und 
saubere 5V)
- Reset liegt auf 5V und nicht dauerhaft auf GND.
- Quarz schwingt (kann am Oszilloskop eine 8MHz Sinus Schwingung bei 
8MHz Quarz sehen)
- Programm herunterbrochen auf ein reines Pin Toggeln.
- Optimierung ausgeschalten.

Trotzdem läuft das Programm nicht los. Jedoch lässt sich der Controller 
programmieren und auch die Fuses setzen/auslesen.
Daraufhin habe ich die internen Oszillatoren ausprobiert. Bei 1MHz und 
2MHz internen Takt läuft das Programm los, aber ab 4MHz internen Takt 
startet das Programm nicht mehr.
Dann dachte ich an Watchdog oder Brown Out Detection. Also habe ich 
Brown out per Fuse bits deaktiviert und den Watchdog per Software 
ausgeschaltet. Das hat aber auch keine Verbesserung gebracht.

Hatte schon mal jmd. dieses Verhalten? Ich würde darauf tippen das der 
Controller wohl defekt ist (ESD Schaden oder ähnliches).

von dunno.. (Gast)


Lesenswert?

vielleicht magst du mal deinen code posten, mit dem du das probierst..?

von Ratsuchender (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/delay.h>
3
4
#ifndef F_CPU
5
#define F_CPU 2000000
6
#endif
7
8
int main(void){
9
10
  //WDTCR |= (1<<WDTOE) | (1<<WDE);
11
  //WDTCR &= ~(1<<WDE);
12
13
  DDRD |= (1<<PD5);
14
15
  while(1){
16
    _delay_us(100);
17
    PORTD ^=(1<<PD5);
18
  }
19
}

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

hallo Ratsuchender

hast du am ausgang ein oszi drann haengen oder eine LED ?

gruss
hans

--

von Ratsuchender (Gast)


Lesenswert?

Ein Oszilloskop.

Was mir aufgefallen ist das der Controller direkt nach dem Reset 
scheinbar versucht zu starten (es kommen unregelmässige Impulse am pin 
heraus), dann aber abbricht und nichts mehr tut. Der Quarz schwingt 
weiter.

von Karl H. (kbuchegg)


Lesenswert?

Wenn die Platine schon mal funktioniert hat, dann untersuche sie auf 
abgerissene oder zweifelhafte Kabelverbdinungen, Verschmutzung oder 
dergleichen.
Ein ESD Schaden ist zwar prinzipiell möglich aber sehr unwahrscheinlich. 
Viel wahrscheinlicher ist es, dass da irgendein mechanisches Problem 
vorliegt, das beim Herumschieben der Platine entstanden ist. Und sei es 
nur ein banaler Wackelkontakt in einem Kabel.

von Michael U. (amiga)


Lesenswert?

Hallo,

der (fast nur) ASM-Programmierer fragt sich gerade:

#define F_CPU 2000000

sollte das nicht besser

#define F_CPU 2000000UL

heißen?

Was kommt ohne unsigned long raus? 0?
Was macht _delay_us() mit F_CPU = 0?

Oder liege ich völlig falsch?

Gruß aus Berlin
Michael

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

das tut der sache keinen abbruch. es geht beides.
glaub ich zumindest. ich definiere das immer im IDE.
nie im source code.

von Jackenkoffer (Gast)


Lesenswert?

1)Versuch mal dei schaltung auf der steckplatine aufzubauen, es hilft 
dir beim feststellen ob der µcon. kaput ist , oder deine Platine......

2)Was ich sicher sagen kann ist: wenn der mikrocontroller sich 
programmieren lässt , heißt: er schwingt..., auch bei höheren 
frequenzen( wie du gesagt hast bei 4 MHZ Internal clock ) er würde sich 
nicht programmieren lassen, wenn er nicht schwingen würde.

3)Außerdem, wenn du die oscillatorfrequenz änderst , ändere auch den 
Quelltext dementsprechend.

4)Falls es ESD war , versuch einen Anderen Port zum blinken zu bringen.

5)das letzte was ich zu deiner sicherheit sagen könnte , bring einen 
kondensator von 100nF zwischen Reset unD Masse ( den Widersrtand von 
üblich 10k lässt du ..., bei programmieren nimmst du den kondensator weg 
) nachdem du programmiert hast , schaltest du den Strom an deiner 
Platine aus, setzt den Kondensator wieder herein und strom wieder an. 
das lässt den controller kurzzeitig auf reset , und dann erst fährt er 
hoch .., ( hab ich auch i-wo gelesen dass es helfen soll )

von Jackenkoffer (Gast)


Lesenswert?

Hoffentlich hilt´s was !!  =)  !!

FG aus Muunich !!

von Ratsuchender (Gast)


Lesenswert?

Ich habe nun eine Testschaltung identisch zu meiner Platine auf dem 
Steckbrett aufgebaut, dabei kann ich jedoch genau das gleiche Verhalten 
beobachten:
- Mit 2MHZ internen Takt läuft der Controller, darüber nicht.
- Externer Quarz schwingt aber Programm arbeitet nicht.

von Michael U. (amiga)


Lesenswert?

Hallo,

Hans Mayer schrieb:
> das tut der sache keinen abbruch. es geht beides.
> glaub ich zumindest. ich definiere das immer im IDE.
> nie im source code.

Glauben ist etwas, was ich beim Programmieren völlig ausschließe...

Ich definiere auch in der IDE und wenn mal im Source, dann mit 
Typangabe.
IMHO interpretiert #define das als Integer, deshalb ja meine Frage.

Gruß aus Berlin
Michael

von Karl H. (kbuchegg)


Lesenswert?

Michael U. schrieb:

> IMHO interpretiert #define das als Integer, deshalb ja meine Frage.

#define interpretiert das überhaupt nicht.
Für #define ist das einfach nur ein Text, der an geeigneter Stelle 
anstelle von F_CPU eingesetzt wird.
Wie dieser Text dann weiter verwendet wird, hängt von der verwendenden 
Stelle ab.
Aber 2000000 ist für einen int schon zu groß, wird also in einem 
arithmetischen Ausdruck beim AVR-gcc auf jeden Fall also mindestens ein 
long sein.

von erde (Gast)


Lesenswert?

@Ratsuchender schonmal an fuses gedacht?? =)

von Ratsuchender (Gast)


Lesenswert?

erde schrieb:
> @Ratsuchender schonmal an fuses gedacht?? =)
Natürlich, sonst hätte ich ja nie von externen Quarz auf internen Takt 
und zurück umstellen können.

von Ratsuchender (Gast)


Lesenswert?

Niemand mehr eine Idee womot sich das Verhalten erklären liese? Wenn 
niemand mehr etwas weis würde ich den Controller als partiell defekt 
erklären.

von ich (Gast)


Lesenswert?

in deinem Programmcode steht  2000000 wie wäre es mit 8000000 ?

von Ratsuchender (Gast)


Lesenswert?

ich schrieb:
> in deinem Programmcode steht  2000000 wie wäre es mit 8000000 ?
Das würde nur in der Zeitdauer des toggelns einen Unterschied machen, 
aber es passiert ab 4MHz gar nichts mehr, keinerlei Reaktion.

Aber um die Frage eindeutig zu beantworten: Ein ändern von F_CPU im 
Quellcode und in der IDE beim einstellen des externen 8MHz Quarzes 
bringt nichts (wie zu erwarten war).

von Paulchen Panther (Gast)


Lesenswert?

Hi,

1. Kondensator zwischen Vcc und GND (100nF) erneuern.
2. Anderen IC verwenden.
3. Ich kennen den Controller nicht, aber bei manchen Controller muss man 
einen Wert in ein Register schreiben, damit er auch bei hohen Frequenzen 
funktioniert.

Gruß
PP

von soundso (Gast)


Lesenswert?

Mal den Programmer abziehen ... der suat manchmal an der Resetleitung 
rum ...

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.