PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quarz & AVR = Problem



hellraiser
13.05.2004, 19:51
Hi @ all

dies ist jetzt nicht mein erstes Projekt mit AVRs und RS232 Kommunikation, aber ich häng jetzt hier rum und das verdammte ding will nicht laufen.

Folgendes:
.EQU CLOCK = 4000000
.EQU BAUD = 9600
.EQU UBRRVAL = CLOCK/(BAUD*16)-1

UBRRVAL wird in die Register UBRRL und UBRRH geladen, bevor Transmitter & Receiver gestartet werden.

Soweit so gut - jetzt bekomme ich beim endlosen senden von 1 byte (!) wahlweise 2 oder 3 bytes im terminal zu sehen. Leider ist keines von den bytes identisch mit dem welches ich verschickt habe.

Im Programm gibt es eine 1s Warteschleife (10x Aufrufen von 100ms Schleife).
Bis die abgearbeitet ist vergehen aber ca 3 sekunden (subjektiv gemessen über LED an, Schleifenaufruf, LED aus).
Die Schleifen sind korrekt und wurden schon in anderen Projekten (ja, bei gleicher Taktfrequenz) verwendet.

Sodele... Jetzt habe ich die Befürchtung dass mit meinem Layout was nicht stimmt, da es das erste mal ist, dass ich die masseleitung zwischen den XTAL Pins geroutet habe.
Kann das möglich sein, dass der Quarz aus dem ruder läuft durch induktion oder wie?

Anbei mal ein paar bilder (betreffende Leiterbahnen sind rot nachgezeichnet). Die verwendeten Kondensatoren sind 33p.

Noch ne kleine Anmerkung für die ReicheltFakeFreaks: XTAL und Kondensatoren kommen von reichelt ;)

Habe mal was von Oberton/Unterton/Halbton/Virtelton/Garkeinton Quarzen gehört; jedenfalls steht auf dem Quarz "HOSONIC 4.0000 B236" falls das jemand was sagt...

Hoffe da kann mir jemand helfen. und ich bete zum Lötkolben dass nur die Masseleitung dran schuld ist ;)

smartronik
13.05.2004, 20:41
Oszi dran und messen ob der Quarz überhaupt schwingt und dabei auch gleich die Frequenz messen. Bei Microcontrollern ist das mit dem Quarz digital, geht oder geht nicht, geht etwas gibts da nicht. Da aber überhaupt was rausgesendet wird, gehe ich mal davon aus daß der Takt OK ist.
Ich programmiere AVRs in C mit Codevision, der erzeugt den Code für die Hardware automatisch, da braucht man sich nicht mit rumschlagen, daher kann ich zur Assemblerprogrammierung nichts sagen. Evtl gibts noch irgendein Register was noch gesetzt werden muß. Außerdem muß man dran denken daß der Clock nicht gleich Prozessortakt ist der ist um einen Faktor kleiner (meist 1/4).
Ich benutze Quarze von Bürklin mit 22 pf Kondensatoren. Mit den Reichelt Quarzen hatte ich auch schon große Probleme, allerdings bei PIC-Prozessoren.

hellraiser
13.05.2004, 21:02
naja, der quarz schwingt. komischerweise aber definitiv nicht mit 4MHz.
Werde wohl mal Quarz & C's auswechseln, bevor ich das layout ändere.
Also bist du nicht der meinung, dass es was mit GND zwischen den beiden Leiterbahnen zu tun haben könnte? ist immerhin HF was da auf knapp 10mm parallel nebeneinander verläuft.

edgar
13.05.2004, 21:57
hi hell,

programmiere doch einen timer so,dass du zB einen sekundentakt an deiner LED
bekommst. da merkst du sofort ob dein Quarz OK ist oder nicht.

ciao
schoenes platinchen
ed

smartronik
13.05.2004, 22:44
An der Leitungsführung liegt das nicht, außerdem ist 4 MHz noch keine HF, is doch fast noch Gleichspannung :D

Rue
13.05.2004, 22:59
Hallo,

ich kenn mich zwar mit deinem IC was du hast nicht aus, aber was mir
sofort aufgefallen ist, ist das auf deiner Platine kein einziger Blockkondensator
zu sehen ist. Ein Blockkondensator stellt die notwendigerweise niedrige
Impedanz der Versorgung sicher. Wenn die Gatter im IC zu schalten
beginnen brauchen die für kurze Zeit (ns...us) viel Strom die dann der Kondensator liefert. Wenn keiner da ist, sackt aufgrund der Zuleitungsinduktivitäten die Versorgung kurzzeitig zusammen und in deinem
Prozessor kommt es zu Fehlfunktionen.

Kurz: Löte 100nF Keramik parallel mit 10uF Tantal bzw. low ESR Al-Elko
zwischen die +- Versorgungspins des IC.

Gruß Rü

smartronik
13.05.2004, 23:11
Vielleicht auch mal das probieren:



.EQU UBRRVAL = (CLOCK/(BAUD*16))-1

So würde es zumindest zu der Formel aus dem Datenblatt passen :p

UBRR=25 bei 4 MHz und 9600 laut Tabelle 8515 sollte beim ATMEGA auch so sein


So grad nochmal ins richtige Datenblatt geschaut, da gibts noch ein Bit U2x das muß 0 sein, sonst isses die doppelte Geschwindigkeit

UBRRVAL = 25 bzw. 51 wenn U2x gesetzt ist

Anatec
14.05.2004, 09:25
@hellraiser,
da hamm'se dir nen Obertonquarz verkauft. 4.000 bedeutet 4,xxx Mhz.
Ein Grundtonquarz wird immer in Khz angegeben. Auf deinem Quarz müßte also
4000Khz stehen. Obertonquarze schwingen in Digischaltungen (aperiodischer
Betrieb) entweder gar nicht oder fern der Heimat. Steht aber oft in den
Datenblättern der Hersteller, keine Obertonquarze verwenden !!!!

Gruß Gerd H

smartronik
14.05.2004, 14:43
Hab das ganze mal durch den Autocodegenerator gejagt, der initialisiert die serielle Schnittstelle so:

UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

hellraiser
14.05.2004, 15:03
@ smartronic: der code von mir ist i.o. (original derselbe code laeuft in einem anderen projekt ja auch...

@ anatec:
dass es irgendwas mit dem quarz zu tun hat denke ich auch;
jedenfalls ist es kein "garkeintonquarz", denn er schwingt ziemlich genau mit 1.0 MHz (obwohl er mit 4 schwingen sollte).
Das bestätigt auch meine subjektive Messung über die zu lang andauernde delay schleife.

Jetzt habe ich den "4.0000 MHz" durch einen "4000.000 KHz" Quarz ausgetauscht und er schwingt immer noch mit 1.0 MHz.

Habe mal mit dem Terminal herumgespielt. Bei UBRRL=25 läuft der UART auf 2400 (!) Baud (bei dieser Einstellung kommt alles richtig am PC an).

Und UBRRL=25 bei 2400Baud trifft auf einen 1MHZ Takt zu.

Was soll ich den jetzt machen ausser in die Hose? ;)
Der Controller soll eigentlich mit nem PIC kommunizieren und der wurde nicht von mir programmiert und arbeitet fix auf 9600Baud...
Ist zwar alles nur Hobby für mich, aber ich habe irgendwie schon zuviel zeit & geld in das projekt gestopft als dass ich das jetzt dem Mülleimer gebe, bloss weil mir aus irgend einem Grund der Takt nicht so läuft wie er soll... So langsam überleg ich echt, da über fliegende verdrahtung mal nen Quarzosszillator zu hängen (wobei dann auch wieder das design darunter leidet, schliesslich war der auf dem pcb nicht vorgesehen)

hellraiser
14.05.2004, 15:05
@anatec:

was ich noch fragen wollte: für was sind obertonquarze denn dann überhaupt da wenn sie in einer digitalen schaltung nicht funktionieren?!

edgar
14.05.2004, 16:36
fuer oszillatoren in HF schaltungen

fuer ''unwissende'' verkaeufer/kunden

fuer diskussionsstoff in foeren....

ed &-)

leech
14.05.2004, 16:47
Mach mal die Gegenprobe und baue einen 16MHz Quarz ein :)

Mit einem 4MHz-Quarzoszillator dürfte da eigentlich nichts mehr schiefgehen (ausser der MC teilt intern runter oder Reichelt verkauft "umgelabelte" Oszillatoren...)

Rue
14.05.2004, 16:53
Hi,

hab mir mal kurz das Datenblatt von dem Ding angesehen und da ist gleich
eine Frage aufgetaucht:
Hast du überhaupt den Quarzoszillator als CLK-Quelle verwendet:questionm (->CKSEL)
Es gibt da noch so einen internen Oszillator der mit 1MHz läuft.


Gruß Rü

PS: Blockkondensator muß rauf - so wie Schmieröl ins Getriebe

Anatec
14.05.2004, 16:55
@hellraiser,

Auch wenn sie elektrisch zum schwingen gebracht werden, sind Quarze mechanische Gebilde. Daher, ein Quarz wird auf seine Sollfrequenz geschliffen. Gerade in mechanischen Schwingen liegt seine Stärke, eine enorme Resonanzstelle. So ich nun einen Quarz für 10 und mehr Mhz brauche, wirds mechanisch eng. So kam man auf die Idee, die Dinger auf der 3. 5. usw Oberwelle anzuregen und damit die das auch ordentlich tun, werden sie extra dafür geschliffen. Bei solchen Schaltungen ist wichtig, das durch einen Resonanzkreis genau diese Oberwelle angeregt wird.
Eine Digitalschaltung tut dies nicht. Also Grundwellenquarz der eh für seine Grundwelle geschliffen ist. Die beiden KoppelC sollen verhindern, das der Quarz mit Rechtecken angesteuert wird und damit in die Sättigung fährt. Damit der Quarz auf seiner Sollfrequenz schwingt soll er nur so lose als geht an die Schaltung angekoppelt werden. Wenn deine Schaltung trotz Grundwellenquarz falsch schwingt, würde ich die C verkleinern bzw vergrößern, bis er da ist wo er hingehört. Was richtig ist, ist abhängig vom Aufbau des Oszilators im IC.

Gruß Gerd H

hellraiser
14.05.2004, 17:44
Sorry @ all

auf diesen blöden fehler hätte ich auch selbst kommen können.
Dies ist zwar mein drittes Projekt mit nem ATMEGA (vorher hatte ich auf der 90S Serie gebastelt) aber ich habe vergessen die 90S8515 Compatibility Fuse zu setzen :(

Da meine Codes alle auf dem 90S er basieren macht das auch sinn... dummerweise bin ich jetzt erst im datasheet darüber gestolpert, dass beim ATMEGA beim DeviceClear immer der interne Oszillator aktiviert wird... und der liegt bei ca 1200KHz...

Wieder was dazu gelernt. jedenfalls funktioniert jetzt alles
@anatec:
glücklicherweise auch mit dem anderen quarz (hätte mich auch arg gewundert, weil ich die reichelt "4.0000 MHz" Quarze schon des öfteren eingesetzt hatte.

Trotzdem merci für Eure Tips!

smartronik
14.05.2004, 18:47
Ich bin auch schon dran gescheitert, nen ATMEGA162 mit nem Clockout eines CAN-Controllers zu füttern, wollte einen Quarz sparen, hab dann doch ne neue Platine gemacht mit nem extra Quarz.
Will man nen Atmel mit externen Clock betreiben muß man wieder irgendwelche Flags setzen. Damit hab ich auch schon ein paar Chips zerschossen, die sich dann nicht mehr programmieren ließen.
Atmel = miese Hardware aber super zu programieren

Pic = super Hardware aber mies zu programmieren

Warum gibt es keinen Pic, der sich wie ein Atmel programmieren läßt ? :D

Was soll dann das ganze werden, wenn da noch ein Pic mit rein muß, was der Atmel nicht kann?

hellraiser
14.05.2004, 20:39
Das ganze wird ein Lückenfüller für den unteren Teil vom doppelten Radioschacht den Opel neuerdings in den Karren verbaut.

Der PIC ist ein ELM323 (ISO OBD II Bus Interface) den ich mir organisiert habe, um die Schnittstelle zum Diagnoseport nicht auch noch selbst zu entwickeln.

Der AVR soll dann quasi beim einschalten der Zündung den OBD Bus initialisieren, auf dem 4x20 Blue/White LCD einen haufen sinnlosen Quatsch von sich geben und im 250msec takt diverse Sensorwerte auslesen und auf dem Display anzeigen.

Das soll er so lange machen bis die Zündung wieder ausgeschaltet wird.
... Display geht aus, AVR lässt fröhlich alle paar sekunden ne LED blitzen (muss ja schliesslich was zu Tun haben) und fertig das ganze.

Im Moment bin ich gerade dabei mich mit dem Display rumzuschlagen... KSxyz Chipsatz ist nicht so mein ding... eben nur 98% HD Kompatibel *grins

Lowlevel Funktionen hauen soweit alle hin (habe die letzte Woche eben nur noch stress mit dem Seriellen anschluss gehabt... Dumm gelaufen, wenn der Takt nicht stimmt *g

smartronik
14.05.2004, 21:34
Na das ist ja schön, daß es funktioniert :)
Der Elmchip ist doch Sondermüll, hab ich auch noch zwei Stück rumfliegen. Der kann nur ein paar Fahrzeuge und das nichtmal richtig. Die paar Funktionen kann man auch mit dem AVR selbst programmieren. Ich hab sowas mal in Visual Basic gemacht, ist nicht sonderlich schwer.
Mit LCD-Displays im Auto hab ich bei mir in der Firma schlechte Erfahrungen gemacht, die Dinger gehn reihenweise kaputt, vor allem im Winter. Wir haben jetzt VFD-Displays (www.noritake.de), die sind voll Grafikfähig, verschiedene Fonts, 4x20 Zeichen Text, lassen sich softwaremäßig in der Helligkeit einstellen (also nix mit Kontrast und LCD-Beleuchtung basteln) und kosten grad mal so um die 50 Euro.
(ich hab mir so eins bei auch eingebaut, mit nem ATMEGA162, zeigt so alles mögliche an was auf dem CAN-Bus liegt, Drehzahlmesser, Kadedruckanzeige, Tempomat, VMAX-Aufhebung etc. :D, Kollege von mir hat auch ein Spiel für programmiert)

Anatec
14.05.2004, 22:02
@hellraiser,

habe mal bei Reichelt in die Daten geschaut. 4.000MHz sind bei denen Grundwellenquarze. Du siehst, man kann sich auch auf die Typisierung, die vor langen Jahren mal eingeführt wurde nicht mehr verlassen. Es gibt warscheinlich nur noch eine Methode, ausprobieren.....................
Ich kanns ja verstehen, Typenschlüssel sind ein alter Zopf und da müssen wir mal was neues machen. Wir sind doch innovativ, das unterscheidet uns von den Anderen. Hatten wir das nicht schon mal bei den Leistungstransistoren?? grins.

Gruß Gerd H

edgar
15.05.2004, 00:11
hi Gerd,


der witz ist, dass Hell's AVR auch ohne *quarz funktionierte...was bei
der atmel '51 familie nicht moeglich gewesen waere.

da wird man doch verdammt schlau...in diesem forum..:)..

ciao
ed

* haette er abschneiden koennen...da der interne oszillator gewaehlt war.

Peter Dannegger
15.05.2004, 16:44
Du siehst, man kann sich auch auf die Typisierung, die vor langen Jahren mal eingeführt wurde nicht mehr verlassen.
Falsch, Normen gabs nur in der DDR, nannte sich TGL.
Jetzt in der Marktwitschaft ist grenzenlose Freiheit, d.h. jeder Hersteller kocht sein eigenes Bezeichnungssüppchen.

Eine Bezeichnung ohne Herstellerangabe ist also keinen Pfifferling wert.
Erst das Herstellerdatenblatt kann Auskunft darüber geben, was damit eigentlich gemeint ist.

Lustig wirds bei ICs, wenn der eine DIP meint und der andere PLCC.

Dann gibts auch noch Transistoren, die der eine EBC und der andere BCE anschließt oder TO3 statt TO220, alles schon gesehen.


Peter

Anatec
18.05.2004, 00:19
@Peter,


auf jeden Fall schafft das Arbeitsplätze. Bauteildistributoren, sind nicht nur Händler, sondern die menschlichen Suchmaschinen für passende Teile im unergründlichen Herstellertschungel.
TGL war doch langweilig, da konnte man doch die Übersicht behalten. Alle Chips waren genormt und neu entwickelte Schaltungen funktionierten auf Anhieb. Baugruppen waren untereinander austauschbar und die Reparatur recht einfach.
Von V4000 Chips konntest du nicht erwarten, das sie untereinander rumspinnen, es sei denn du versaust das Layout total.
Da isses doch heute viiiel schöner, einen V4000 als Generator und nen Honkong HEF dahinter, das geht ab. So dämlich kann man gar nicht denken als was die da zusammenspinnen. Wenn du dann den 4000er mit 32 Bremskondensatoren versehen hast, klappts auch mit der Elektronik.

Du hast Recht, wenn ich heute was baue erkundige ich mich vorneweg nach dem Hersteller der Bauteile. Auch bei Reichelt. So gehe ich unliebsamen Nebeneffekten aus dem Weg. Wenn zB.Phillips ne Chip herstellt, dann macht der das was er soll. Von denen bekommt man auch einen vorbildlichen Support. Da zahle ich gern 5Cent mehr.

Gruß Gerd H

hellraiser
02.09.2004, 23:16
@smartronik:


(ich hab mir so eins bei auch eingebaut, mit nem ATMEGA162, zeigt so alles mögliche an was auf dem CAN-Bus liegt, Drehzahlmesser, Kadedruckanzeige, Tempomat, VMAX-Aufhebung etc. :D, Kollege von mir hat auch ein Spiel für programmiert)
Soderle. Ende letzten Monat bin ich mit dem ding einigermassen fertig geworden, was das auslesen von diversen Werten wie rpm, speed, kühlmitteltemp, aussentemp angeht...

Jetzt kommt der Haken, den ich nach deinem Zitat schon lange vermutet hatte:
die ersten paar minuten funzt der ELM323... nach ca 6-7 minuten nach dem bus init hängt sich die kommunikation auf und der elm meldet bei jedem query immer nur error bis zum nächsten bus init... und dabei polle ich die 4-5 werte nur im sekundentakt ;)

Hast du den code für dein projekt noch? in C oder ASM?
wenn das bei dir richtig funzt wäre ich dir über den CAN Lowlevel code sehr dankbar! :)