mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Phänomen mit externem Takt, wo leiegt der Fehler?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, vielleicht kann mir bitte jemand mal auf die Sprünge 
helfen.

Ich betreibe einen MAX7219 zur 7Segmentdarstellung an einem Atmega168 
über SPI.
Die Übertragung funktioniert bestens, sofern ich den internen Takt des 
AVRs von 8Mhz bei folgender Registereinstellung nutze:


  //SPI Schnitstelle konfigurieren
  //SPE gesetzt: SPI aktiv
  //MSTR gesetzt: AVR ist Master
  //SPR0 gesetzt: Takt=Oszilator/16

  SPCR |= ((1 << SPE) | (1 << MSTR) | (1 << SPR0));

Wenn ich jetzt allerdings die Fusebits umstelle, um ein externes 20Mhz 
zu verwenden, kommt auf der Anzeige scheinbar nichts mehr an. Wenn ich 
hingegen die Fuseeinstellung CKDIV8 verwende, läuft das ganze wieder. 
Allerdings möchte ich die 20Mhz ungern durch 8 teilen, da ich den Takt 
an anderer Stelle benötige. Habe daher folgendes versucht:

SPCR |= ((1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0));
Laut Datenblatt müsste der Vorteiler nun ja 128 betragen, aber die 
Anzeige bleibt dunkel.

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bist du dir denn überhaupt sicher dass dein Prozessor mit
den externen 20 MHz läuft?

Wo kommen die 20 MHz denn überhaupt her? Schaltplan dazu?

von Rainer U. (r-u)


Bewertung
0 lesenswert
nicht lesenswert
Womit erzeugst Du die 20MHz? Funktioniert es mit Vorteiler 128 und 8MHz 
intern? Vielleicht funktioniert Dein externer 20MHz einfach nicht..

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rainer U. schrieb:
> Vielleicht funktioniert Dein externer 20MHz einfach nicht..

Sachch ichch dochch!

von Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gehe davon aus, dass der Quarz funktioniert. Ansonsten hätte ich mich ja 
durch die Fuseeinstellung auf externen Crystal selbst ausgespert. LEDs 
testeweise blinken lassen im Sekundentakt geht auch.

Und ja, mit internen 8Mhz und 128er Teiler läuft auch alles.

Könnte auch an dem Steckbrettverhau liegen. Aber warum funktioniert es 
dann z.B. mit Vorteiler 4 und 8Mhz (also 2Mhz) aber nicht mit 20Mhz 
geteilt durch 16 (1,25Mhz) was ja noch langsamer wäre?

von Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Habs auch mal mit dem Oszi nachgemessen, der Takt vom Quarz stimmt.

von ne ne ne (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Benutzt du delay_ms()? oder delay_us() irdendwo?

Zeig mal code + bild vom aufbau

Gruß J

von Oliver S. (oliverso)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Oszi

Analoges Einkanalgerät?

Oliver

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Könnte auch an dem Steckbrettverhau liegen.

In der Tat. Ein verkorkster Clock der dir in der falschen
Phase die richtige Flanke bringt, vielleicht .....

Steckbretter sind immer ganz toll, besonders in Verbindung
mit langen Leitungen und fehlenden Abblock-Kondensatoren
(---> Hilfe, was sind Abblock-Kondensatoren???)

von ne ne ne (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich tippe auf Timing & Initialisierungsprobleme...

Gruß J

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ne ne ne schrieb:
> Timing & Initialisierungsprobleme...

Arduinoquäler schrieb:
> Ein verkorkster Clock der dir in der falschen
> Phase die richtige Flanke bringt, vielleicht .....

von ne ne ne (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ne ich denke eher das mit schnellem Takt die delay_us die gerne beim 
initialiseren von lcds genutzt werden zu schnell wird da F_CPU nicht mit 
geändert wurde...mein tip ins blaue.

Gruß J

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ne ne ne schrieb:
> initialiseren von lcds

Von LCD war bisher nicht die Rede, nur von 7Segment-Ansteuerung.

... und seine LED soll ja angeblich korrekt blinken.

von ne ne ne (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich
>hingegen die Fuseeinstellung CKDIV8 verwende,

Und du setzt die Fuse auch sicher (:also löschen, also null 
reinschreiben)`?

GRuß J

von STM32 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
fMAX des MAX7219 => 10MHz. Bist Du sicher, daß Du da nicht zu schnell 
bist?
Da würde auch für sprechen, daß es wieder geht, wenn Du den Clkdiv 
einschaltest (Ich meine mich erinnern zu können, der teilt durch 8?).

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
STM32 schrieb im Beitrag #4701598:
> fMAX des MAX7219 => 10MHz.

Mehr kann ein AVR mit 20 MHz nicht.

von Jens (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Fehler gefunden, es liegt an meinem alten Netzteil, an dem das 
Steckbrett klemmt. Dieses liefert 5V. Wenn man sich das Clock-Signal 
allerdings auf dem Oszi genauer anschaut, kommt es zu Spannungsspitzen 
die etwa 6V betragen. Dann bricht der MAX7219 ab, da er maximal 5,5V 
verträgt. Nun habe ich provisorisch einen LM317 angeklemmt, der 3,3V 
liefert. Damit laufen alle Taktraten, nur die Spitzen bzw. Überschwinger 
bleiben.

Wie enstehen diese, und wie bekomme ich die weg? Die 100nF 
Abblockkondensatoren des Atmegas bei AREF, AVCC, und VCC sind vorhanden.

Der MAX7219 hat die laut Datenblatt notwendigen 100nF parallel 10µF 
zwischen VCC und GND.

Das angehängte Bild zeigt das CLK-Signal, welches abgelesen etwa 320kHz 
beträgt (20Mhz / 64er Vorteiler = 312,5kHz). Somit gehe ich davon aus, 
das der Quarz richtig läuft.

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Wie enstehen diese,

Durch lange Leitungen oder durch Fehlmessung (Oszilloskop-
Masseverbindung)

Deinen Aufbau willst du ja nicht zeigen, gelle?
Da kommen dann die "Sünden" auf .....

Jens schrieb:
> und wie bekomme ich die weg?

Durch kurze Leitungen und/oder durch Längswiderstände
ca 50-150 Ohm in diesen Leitungen.


(wenn der Motor kaputt ist: am Öl kann's nicht gelegen
haben denn es war ja keins drin)

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> es liegt an meinem alten Netzteil

Nein.

> Dieses liefert 5V. Wenn man sich das Clock-Signal
> allerdings auf dem Oszi genauer anschaut, kommt es zu Spannungsspitzen
> die etwa 6V betragen.

Die Spannungsspitzen liefert aber nicht das Netzteil.

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> kommt es zu Spannungsspitzen die etwa 6V betragen.

Arduinoquäler schrieb:
> Steckbretter sind immer ganz toll, besonders in Verbindung
> mit langen Leitungen und fehlenden Abblock-Kondensatoren
> (---> Hilfe, was sind Abblock-Kondensatoren???)

von Michael U. (amiga)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ungünstige Verhältnisse von Takt/Daten. Habe jetzt nicht im Datenblatt 
des MAX7219 nachgeschaut, was die Timings usw. da sagen. Ungünstiger 
SPI-Mode?
Ich habe auch schon ICs gehabt, die am AVR nicht geneigt waren, mit den 
vom Hersteller angegeben SPI-Modi stabil zu laufen. Das Zeitverhalten 
passte nicht gut genug. Man kann auch einfach mit Mode und Clockphase 
mal rumspielen, ob es sich da ändert.
Dann kann man noch immer messen und Datenblatt genauer lesen. ;)

Gruß aus Berlin
Michael

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> Ungünstiger SPI-Mode?

Auch das habe ich schon angemerkt:

Arduinoquäler schrieb:
> In der Tat. Ein verkorkster Clock der dir in der falschen
> Phase die richtige Flanke bringt, vielleicht .....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.