Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller kommt aus dem Takt ;D


von Bernd (Gast)


Lesenswert?

Hallo,

habe folgendes Problem. Benutze einen Atmega168 um ein paar LEDs 
anzusteuern.
Nur funktioniert das nicht wie gewollt.
Ich wollte eigtl. den internen 8Mhz Taktgenerator verwenden.
Nach langem Fehlersuchen bin ich mit einem Taktfrequenzgenerator an die 
XATL1,2 Eingänge gegangen und habe einen externen Takt von jetzt 8Mhz 
angelegt.
Nachdem ich die Fuses eingestellt hatte - Siehe da es funktioniert.

Ich Frage mich jetzt wieso?  Wieso mit externem Takt aber nicht mit 
internen..?

Viele Gruesse und danke!

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

ich sehe da auf deiner Platine eine offfene Drahtbrücke... daran könnte 
es gelegen haben. Außerdem ist deine Spannungsversorgung instabil, da 
ist ein ripple von 280 mV drauf.

von Little B. (lil-b)


Lesenswert?

bevor wieder jemand anfängt zu flamen:

gibt bitte eine genaue beschreibung deines Fehlers!
Poste den Code für die Initialisierung des Oszillators!

von Bernd (Gast)


Lesenswert?

Drahtbruecken sind alle mit Durchgangspruefer gecheckt...
Stuetzkondensatoren sind verbaut, Spannung ist stabil.

Was soll ich genauer beschreiben?
Eingestellt wurde der Osz. ueber die Fuses AVR Studio... gibts kein 
Code..

von Peter D. (peda)


Lesenswert?

Bernd schrieb:
> Nur funktioniert das nicht wie gewollt.

Woher sollen wir denn wissen, was Du willst?
Geh zum Gedankenleser in den Zirkus.

von Bernd (Gast)


Lesenswert?

Wuerdest du dein Gehirn einschalten, haettest du den Zusammenhang 
zwischen Frage und Gewolltem erkannt GRINS

von Ern B. (ernybert) Benutzerseite


Lesenswert?

Bernd schrieb:
> Wuerdest du dein Gehirn einschalten, haettest du den Zusammenhang
> zwischen Frage und Gewolltem erkannt GRINS

Die Frage ist ja nicht wie du dein Quarz initialisierst, sondern was du 
von deinen LEDs erwartest?

Sollen sie im 1Hz Takt blinken? -> Woher soll das hier einer im Forum 
wissen?

Daher die Frage:
Wie sieht dein Code zu den LEDs aus -> Was erwartest du? -> Was bekommst 
du?
-> Was passiert mit dem internen Osz.? Was passiert beim einschalten des 
externen?

WAS FUNKTIONIERT NICHT ?!? Ohne eine Antwort auf diese Frage wird 
niemand dir helfen können weil niemand den Zusammenhang verstehen kann, 
da du keinen Zusammenhang bescheibst!

Alsbo bitte nicht so vorlaut!

von Flip B. (frickelfreak)


Lesenswert?

Meine Glaskugel sagt, dass clkdiv/8 aktiv war und die led 8x zu langsam 
blinkten.

Flip

von Bernd (Gast)


Lesenswert?

Es ist ein kleiner LED Cube mit 4 Schieberegistern.
Die Ausgaenge der Schieberegister sind immer RGB einer LED dann die 
naechste LED...
1
 /****************************************************************/
2
/** INCLUDES **/
3
/****************************************************************/
4
#define F_CPU 6000000UL
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
/****************************************************************/
9
/** FUNKTIONS-HEADER **/
10
/****************************************************************/
11
12
/****************************************************************/
13
/** MAIN-FUNKTION **/
14
/****************************************************************/
15
#define SET_BIT(PORT, BITNUM)    ((PORT) |=  (1<<(BITNUM)))
16
#define CLEAR_BIT(PORT, BITNUM)  ((PORT) &= ~(1<<(BITNUM)))
17
#define TOOGLE_BIT(PORT, BITNUM) ((PORT) ^=  (1<<(BITNUM)))
18
19
20
21
int main(void)
22
23
{
24
/** Konfigurationen **/
25
26
DDRC = 0b00001111;
27
DDRB = 0b00000110;
28
DDRD = 0b00000010;
29
30
CLEAR_BIT(PORTB,2);  //Output Enable 
31
SET_BIT(PORTC,3);  //SDI
32
33
//Ebenen
34
CLEAR_BIT(PORTC,2);
35
CLEAR_BIT(PORTC,1);
36
CLEAR_BIT(PORTC,0);
37
38
39
/** Hauptschleife **/
40
  for(;;)
41
  {
42
43
  for (int i= 0; i<1;i++)
44
  {
45
          SET_BIT(PORTC,3);  //SDI
46
  
47
48
          CLEAR_BIT(PORTB,1);
49
          _delay_ms(1);
50
          SET_BIT(PORTB,1);
51
          _delay_ms(1);
52
53
54
          SET_BIT(PORTC,3);  //SDI
55
56
57
          CLEAR_BIT(PORTB,1);
58
          _delay_ms(1);
59
          SET_BIT(PORTB,1);
60
          _delay_ms(1);
61
          
62
63
          SET_BIT(PORTC,3);  //SDI
64
65
          CLEAR_BIT(PORTB,1);
66
          _delay_ms(1);
67
          SET_BIT(PORTB,1);
68
          _delay_ms(1);
69
70
        
71
72
  }
73
74
    _delay_ms(500);
75
          
76
77
  
78
  
79
  }
80
81
}

Das ist der Code. Jetzt wird jede halbe Sekunde eine weitere LED 
angemacht, in dem Fall in weiss.

Mit internem Takt funktioniert das ganze halt gar nicht und mit externem 
auch nur alle 2 von 5 versuchen. Dh wenn ich die Stromzufuhr trenne und 
wieder anschliesse funktioniert es auch nicht immer.

Ziel ist, jede LED einzeln ansteuern zu koennen..Farbe etc..
Mit dem Code natuerlich nicht, der schickt jetzt einfach nur einsen 
durch..

von Dietrich L. (dietrichl)


Lesenswert?

Bernd schrieb:
> Mit internem Takt funktioniert das ganze halt gar nicht und mit externem
> auch nur alle 2 von 5 versuchen. Dh wenn ich die Stromzufuhr trenne und
> wieder anschliesse funktioniert es auch nicht immer.

Das riecht aber nach einem HW-Problem. Dann solltest Du Schaltplan, 
Aufbau, Stromversorgung ... zeigen.


Gruß Dietrich

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Schaltplan, sind aber keine Werte notiert.


lg

von opamp (Gast)


Lesenswert?

Bernd schrieb:
> Hier der Schaltplan, sind aber keine Werte notiert.
>
> lg

Der zweite TLC ist das Problem. Musst du noch korrekt dimensionieren.
Außerdem solltest du sternförmige Netze benutzen. Dein Layout kann zu 
Einkoppelungen führen

von Heinrich (Gast)


Lesenswert?

opamp schrieb:
> Der zweite TLC ist das Problem. Musst du noch korrekt dimensionieren.
> Außerdem solltest du sternförmige Netze benutzen. Dein Layout kann zu
> Einkoppelungen führen

Was ist am 2. TLC bitte anders als bei den anderen in seinem Schaltplan?
Bezüglich der Einkopplungen ist der sternförmige Aufbau nicht unbedingt 
nötig, nach seiner Software liegt die Taktfrequenz ja bei kleinen 
1000Hz.

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


Lesenswert?

Bernd schrieb:
> for (int i= 0; i<1;i++)

Hä? Hast du dir mal überlegt, wie oft diese Schleife durchlaufen wird?
Fuse den AVR mal auf 'Int RC Osc.' und lange Startup Zeit (meistens 
64ms). Alsdann löschst du die CKDIV8 Fuse und änderst das Statement

Bernd schrieb:
> #define F_CPU 6000000UL

auf 8000000UL.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

opamp schrieb:
> Der zweite TLC ist das Problem.

Nun muß ich schon wieder zum Gedankenleser gehen, welcher TLCxxx das 
sein soll.
Ein TLC5940 wohl nicht.

Man kanns mit dem Informationsgeiz aber auch übertreiben.

von Bernd (Gast)


Lesenswert?

Matthias Sch. schrieb:
> Hä? Hast du dir mal überlegt, wie oft diese Schleife durchlaufen wird?

Habe den Wert oefter variiert, jetzt gerade braeuchte man auch keine 
:)..

von Bernd (Gast)


Lesenswert?

Peter Dannegger schrieb:
> welcher TLCxxx

Sorry ;D... sind TLC5916.

von opamp (Gast)


Lesenswert?

Heinrich schrieb:
> Was ist am 2. TLC bitte anders als bei den anderen in seinem Schaltplan?

Die anderen stehen an 1., 3. und 4. Stelle. Wenn das kein Unterschied 
ist!?

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


Lesenswert?

Bernd schrieb:
> Matthias Sch. schrieb:
>> Hä? Hast du dir mal überlegt, wie oft diese Schleife durchlaufen wird?
>
> Habe den Wert oefter variiert, jetzt gerade braeuchte man auch keine
> :)..
Ok, das wird mir hier zu blöd - schönes Leben noch.

von Thomas E. (thomase)


Lesenswert?

Bernd schrieb:
> Habe den Wert oefter variiert, jetzt gerade braeuchte man auch keine

Du hast keine Ahnung, wie man ein Schieberegister ansteuert und 
probierst ohne Sinn und Verstand irgendwelchen Unsinn aus.

Du hast 4 TLCs kaskadiert. Damit hast du 32 Ausgänge. Diese 32 Ausgänge 
musst du ansteuern, d.h. du musst 32 Bit ausgeben. Immer.
Mit welchem Takt das geschieht, spielt dabei überhaupt keine Rolle.

Das zuerst ausgegebene Bit landet am letzten Ausgang des vierten SRs.

Wenn diese 32 Bit ausgegeben sind, sind sie aber noch nicht an den 
Ausgängen des jeweiligen TLC. Die Bits müssen jetzt mit einem Impuls auf 
die Ausgänge geschaufelt werden. Dazu dient der LE-Eingang. Dieser 
Eingang ist weder in deiner Skizze zu finden, noch wird er im 
Progrämmchen angesteuert. Die Ausgänge der TLCs haben damit die Werte, 
die beim Einschalten zufällig vorhanden sind. Deswegen geht es manchmal 
und manchmal nicht. Tatsächlich geht es aber überhaupt nicht.

mfg.

von Bernd (Gast)


Lesenswert?

Mir ist wohl bewusst wie so ein Schieberegister funktioniert.
Die Schleife ist lediglich dazu dagewesen das ich nicht nur einsen 
durchschicke, um zu gucken ob die Farben auch funktionieren...

Der LE ist ist die ganze Zeit auf 1, damit die Zustaende direkt auf den 
Ausgang 'pulsiert' werden.

Hat schon bei dem normalen LED Cube funktioniert.

Das es manchnmal ging und manchmal nicht, lag daran das ich den 
Programmer drinnen gelassen habe, nehme ich den raus geht es immer mit 
dem externen Takt.

von opamp (Gast)


Lesenswert?

Bernd schrieb:
> Mir ist wohl bewusst wie so ein Schieberegister funktioniert.

Das ist aber schön, dass du so viel Ahnung hast und wir alle dumme 
Idioten sind.

Übrigens ist es sehr schade, dass sich nicht jeder so klar ausdrücken 
kann wie du. Wir sollten diesen Post als Musterbeispiel verlinken, um zu 
zeigen, wie man ein Problem von Anfang an mit allen nötigen 
Informationen beschreibt, so dass es mit Hilfe aller schnell gelöst 
wird.

von Bernd (Gast)


Lesenswert?

opamp schrieb:
> Das ist aber schön, dass du so viel Ahnung hast und wir alle dumme
> Idioten sind.

Das habe ich nicht gesagt... ;)
Man lernt immer dazu, beim naechsten mal gibts alles auf einmal...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> lag daran das ich den Programmer drinnen gelassen habe,
Welchen?

> nehme ich den raus geht es immer mit dem externen Takt.
Das würde mir zu dneken geben...
Denn die Frage bleibt: Warum?

von Bernd (Gast)


Lesenswert?

Lothar Miller schrieb:
> Das würde mir zu dneken geben...

Atmel AVR ISPmk|| ist der Programmer...

Ja ich frage mich so vieles. Mit dem internen Takt gehts nicht, mit nem 
Quarz gehts nicht, nur wenn ich einen externen Generator anschliesse 
geht es, dann aber auch nur wenn ich vorher den Programmer wieder 
rausziehe..

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> bin ich mit einem Taktfrequenzgenerator an die XATL1,2 Eingänge
> gegangen
"Ksatl Eins Komma Zwei"? Seltsame Pins...

Bernd schrieb:
> nur wenn ich einen externen Generator anschliesse geht es
Welche Signalform mit welcher Amplitude und welcher Frequenz wo 
angeschlossen?

> aber auch nur wenn ich vorher den Programmer wieder rausziehe..
Ich würde mal den Reset kontrollieren...

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Ich würde erstmal einfach nur eine direkt angeschlossene LED (mit 
Vorwiderstand) im Sekundentakt blinken lassen.

Die ganze andere Peripherie soll erstmal wurscht sein. So bekommst du 
heraus, ob du ein Problem mit dem Mikrocontroller und seinem Takt hast, 
oder  mit dem Rest der Schaltung.

Wie immer gilt die Grundregel: Zerlege komplexe Probleme in einfachere, 
bis sie so klein sind, dass du sie beherrschen kannst.

Im Extremfall könnte es darauf hinauslaufen, dass du die LED (mit 
Vorwiderstand) an die Stromversorgung anschließt, um zu sehen, ob die 
Stromversorgung überhaupt funktioniert.

Klingt blöd, aber so macht man das halt. Das Prinzip gilt im Großen wie 
im Kleinen und beschränkt sich nicht nur auf die Elektronik bzw 
Softwareentwicklung.

Deine Herangehensweise ist völlig falsch. Drehe hier an einer Schraube, 
Drücke da mal einen Knopf, biege dort etwas hin. Du hast keine Ahnung, 
was du da tust und warum du es tust. Du hoffst auf den zufälligen 
Erfolg. Mag sein, dass das ab und zu klappt, aber langfristig ist das 
keine Erfolgreiche Strategie.

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.