Hallo zusammen, über den 16-Bit-Timer beim ATmega8 generiere ich am PORTD eine Frequenz von ca. 1,15 KHz mit einem externen Quarz. Am Oszilloskop zeigt der Ausgang aber extreme Schwankungen, die sich so gut wie gar nicht an die einprogrammierten Zeiten halten. Der Nulldurchgang zur 1 kommt zwar zur richtigen Zeit, aber danach flattert es nur "irgendwo" rum, mal hier, mal da (im Simulator klappt das Programm zumindest). Betrieben wird der Mikrocontroller auf dem Pollin Board V2. Ich habe momentan keine Ahnung, woran das liegen könnte. Habt ihr eine Idee? Vielen Dank! Matthias
Ohne Code keine Infos! Wie leider so oft, sind unsere Glaskugeln alle ausgefallen. Es gibt eine ganze Reihe Möglichkeiten, mit einem AVR irgendwelche Frequenzen zu erzeugen. Und solange Du nichts darüber sagst, welche dieser Varianten Du benutzt, kann man nur raten... Wenn Du tatsächlich am Port D die Signale ausgibst, heißt das zumindest schon mal, dass Du nicht die Hardware-Compare-Pinansteuerung verwendest. Also vermutlich irgendwas Interrupt-gesteuertes. Und da kann alles Mögliche dazwischenkommen, v.a. andere Interrupts.
Klingt überzeugend :) Alsdann, hier mein Code (hab das Timer-Interval hochgesetzt; Quarz mit 3,93126 MHz): ------------------------------- .include "m8def.inc" .def temp = r16 .def status = r17 .org 0x000 rjmp main .org 0x006 rjmp timer_event main: ldi temp, LOW(RAMEND) ; Stack out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, 0b11111111 ; Ausgang out DDRD, temp ldi temp, 0b00010000 out TIMSK, temp ldi temp, 0xFF out OCR1AL, temp ldi temp, 0xFF out OCR1AH, temp ldi temp, 0b00000001 ; Timer start out TCCR1B, temp sei loop: rjmp loop timer_event: tst status brne an breq aus an: ldi status, 0 sbi PORTD, 0 ldi temp, 0 out TCNT1H, temp out TCNT1L, temp reti aus: ldi status, 1 cbi PORTD, 0 ldi temp, 0 out TCNT1H, temp out TCNT1L, temp reti -------------------------------
Du solltest den CTC-Mode einschalten. WGM12 (Bit 3) in TCCRB, sonst läuft dein Zähler immer bis zum Ende und wird nicht beim Compare-Match auf null gesetzt.
Stimmt, die Rücksetzung hab ich relativ unelegant gelöst. Hab ich jetzt geändert, das Problem besteht allerdings noch immer.
Hmm, solte eigentlich funktionieren! Probier doch mal einen anderen Wert für OCR1A, nicht grade den Endwert. Würde zum Testen die Mitte vorschlagen.
Das sieht eher nach einem Problem mit der Messung aus. Sollten eigentlich saubere Rechteckimpulse sein. Hast du eine Brummschleife drin? Oszi-Schutzleiter liegt auf Masse und evtl. noch der Schutzleiter des Netzgerätes?
Cooler Vergleich! Die Burgen haben aber eine deutlich höhere Auflösung, grins!
lol Messung ist eignetlich korrekt, mit einem anderen, "gekauften" Prüfling, kommen saubere Rechtecksignale an.
Sorry für den Doppelpost. Im Anhang ein Bild wie es richtig aussehen soll (die Zeiten sind unterschiedlich, aber gleicher Versuchsaufbau).
Ist das jetzt ein anderer Conroller? Wie wäre es, wenn du den alten dann wegwirfst? Das sieht mir ganz strange aus. Der DIO soll doch nur 5V oder 0V schalten. Aber der landet ja auch ab und an mal dazwischen. Das geht gar nicht. Ich würd noch nen dritten Controller ausprobieren. Falls der auch ok ist, geht der erste in die Tonne.
Aaaalso :-) Ich habe hier ein gekauftes Gerät mit einem einfachen Microcontroller drin. Dessen Ausgang (von dem stammt das zweite Bild, das richtig ist), möchte ich mit einem ATmega8 simulieren (davon stammt das erste Bild). Ich habe inzwischen auch noch einen anderen ATmega8 probiert, aber gleiches Symptom. Muss ich vielleicht an der äußeren Beschaltung irgendwas wichtiges beachten?
Irgendwie sieht das ganze immer noch stark nach einem Messfehler aus. Das Programm ist zwar nicht so geschickt, aber eine Fehelr sehe ich da drin bisher nicht. KOntrolliert noch einmal genau, wie du dein Signal mißt, evtl. den Controller von der restlichen Beschaltung des Pins trennen um Störungen auszuschließen.
Im Endeffekt wird an den Ausgang ein Funkmodul angeschlossen. Am Empfänger, der sowohl das gekaufte Gerät empfängt als auch mein eigenes, erhalte ich bei dem gekauften das richtige Schaubild, während bei meinem dieses "verkrüppelte" ankommt, womit der Decoder natürlich nicht klarkommt. Da der Anschluss des Oszilloskops ja genau gleich erfolgt beim Empfänger für beide Sender, muss mein Sender falsch sein ;-)
Dann koppel deinen Sender mal ab und guck wie dann das Signal am Pin aussieht..... Denke so eine Info wäre am Anfang schön ganz sinnvoll gewesen.
Andere haben auch schon in diese Richtung gepostet, trotzdem: Die Periodendauer des überlagerten Signals beträgt etwa 20x Pulsbreite des gewünschten Rechtecksignals. Bei einer Umschalt-Rate von ca.1kHz würde das für den überlagerten Sinus sehr stark auf die 50Hz Netzfrequenz hindeuten. Vermutung: Du hast die Masseleitung vom Oszi nicht korrekt mit der GND-Referenz des Outputs verbunden oder hast eine Masseschleife übers Netzteil.
Der Sender ist nicht angeschlossen, Masse ist richtig (ist auf dem Evaluation-Board von Pollin), Port ist auf Ausgang geschaltet. Ich hab den AVR jetzt mal an eine Batterie angeschlossen, aber das Problem ist dasselbe. Als Oszi benutze ich (schäm) meine Soundblaster, was natürlich nicht optimal ist, aber da ja der andere Sender (auch mit Batterie) ein sauberes Rechtecksignal liefert, müsste die Soundblaster ja richtig angeschlossen sein. Langsam bin ich am verzeifeln...
Kann es sein, dass da eine ganze Reihe von AVRs defekt geliefert wurden? Das würde das Problem erklären, aber es ist schon unwahrscheinlich. Ich brauche doch nur dieses gerade Rechtecksignal ;-) Ich habe die Soundblaster über einen npn-Transistor an den AVR angeschlossen, das ist doch korrekt? Wiegesagt, beim anderen Sender klappt es ja :-/
Wie sieht deine Messschaltung aus? Ich denke auch, dass in diesem Fall die Messung falsche Ergebnisse liefert.
Hab grad kein Schaltplanprogramm parat: -------------------------------------------- ______ Soundkarte Links ___ | / | |D0 |/ | AVR |-------|\ npn | | | \ | |GND | | |---------| | | |________ GND | | |_____| -------------------------------------------- Dann halt an XTAL1 und 2 den Quarz mit 22 pF zur Masse, 0,1 µF zwischen VCC und GND, da hab ich auch verschiedene Bauteile erprobt.
Habs grad mal mit den zwei Widerständen angeschlossen aber immernoch gleicher Effekt.
Guten Mittag! Ich konnte jetzt irgendwie ein sauberes Rechtecksignal erzeugen und nun mache ich mich an die korrekten Timings. Der Simulator des AVR Studios zeigt die korrekten Timings an, in der Realität weichen sie aber schon ein Stück ab. Hat der Simulator beim 16-Bit-Timer irgendwelche Probleme?
In meinem Sendeprotokoll gibt es sozusagen zwei Zeitlängen, ca 300 µs und 800 µs. Eine 0 entspricht 800 µs an und 300 µs aus, bei der 1 ist es genau andersrum, also 300 µs an und 800 µs aus. Das Verhältnis der an-Zeiten untereinander stimmt, die aus-Zeiten sind jedoch stets zu lang, obwohl sie im Simulator korrekt sind.
> die aus-Zeiten sind jedoch stets zu lang
Noch mal.
Über welche Differenzen reden wir? Sind das 10%, 50%, 100%.
Macht der Timer in 1 Sekunde eine Millisekunde zuviel oder eine
Halbe?
Hintergund: Auch dein Quarz ist nicht absolut auf der Frequenz
die draufsteht. Ein bischen Abweichung hast du immer.
Wenn dein Timing also nur im kleinen Bereich abweicht, könnte
es sowas sein. Ist der Fehler aber größer, muss man woanders
suchen.
Ich hab jetzt nochmal genau nachgeschaut: Die Pause bei der 0 ist etwa 3x zu lang, also ca. 900 µs (etwas länger als das Signal). Die Pause bei der 1 ist korrekt. Im Programm sind aber die Zeiten des Signals der 1 genauso groß wie die der Pause der 0.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.