Assembler Scheiß Weiber (ATmega's)

TommyB

Team Bitschubse
17. Mai 2010
2.151
80
48
40
127.0.0.1 ;)
Sprachen
  1. C#
  2. VB.Net
  3. LunaAVR
  4. Assembler
  5. Python
Also...

Bevor ich angemeckert und als Geschlechtsrassist betitelt werde hier die Auflösung:
Ich rede von den Klischee Weibern, also diese Zicken mit denen niemand was zu tun haben will :)

Genauer gesagt ist die Rede vom ATmega168.
Ich hab ja schon mal mein Spass mit den Dingern gehabt. Alles lief, Programm fehlerfrei. Dann das Programm von Polling auf Interrupts umgestellt und es lief auch. Ein paar Sekunden, vielleicht sogar nur eine. Unregelmäßige Abstürze im Controller. Feine Sache. Es hat Ewigkeiten gedauert bis ich herausgefunden habe dass die Betriebsspannung aus dem Netzteil nicht wie geleckt aussah. Eine Diode, ein Kondensator und es lief.

Aber nun hab ich den Scheiß wieder -.-
Wegen Pinmangel (und anschließendem Bauteilmangel) musste ich mein Mädel (ATtiny) in das Weib (ATmega168) wechseln. Das Programm war fix umgeschrieben und drauf geschoben. Über dW auch alles überprüft, Software ist auch darauf fehlerfrei.
Dennoch, das ****** Ding resettet sich geschätzte 10x die Sekunde.
Laut MCUSR durch PowerOn Reset.

Überprüft. Betriebsspannung ist wie geleckt. Ca. 3,5V (3,7V vom Akku durch ne Diode auf nen großen Kondensator). Alles was dran ist ist n Mosfet (ich hab jetzt schon 5x das richtige Wireing überprüft) und tempoär ein paar LEDs um in das MCUSR zu schaun, welche aber nichts an dem Fehler ändern.

Ok, vllt is der Controller schrott, aber denn wären es 2 weitere die ich getestet hab auch.
Zieh ich den mosfet ab läufts (länger). Aber das Ding zieht doch nu so viel Strom auch nicht... 3,3 ohm zwischen µC und Gate gepackt, nix geändert. 1,8K zündet er nicht mehr, mehr hab ich leider nicht grifbereit.
Aber den hab ich auch direkt an den Tiny angeklemmt und da lief alles wunderbest...


What the hack?!
 
Hi Tommy,

Dennoch, das ****** Ding resettet sich geschätzte 10x die Sekunde.
Laut MCUSR durch PowerOn Reset.

Überprüft. Betriebsspannung ist wie geleckt. Ca. 3,5V (3,7V vom Akku durch ne Diode auf nen großen Kondensator).
Die Fuse für Reset (Spannungsschwelle) ist richtig eingestellt ?
Hast du schonmal nen Oszilloskop auf AC gestellt (damit man nur AC mitbekommt) dann auf 0,5V/Div und dann an Vcc gehängt ?
Dann siehst du eventuelle Spannungseinbrüche auf der Betriebsspannung.

Gruß
Dino
 
Du meinst dieses brown out oder wie das heißt? Das ist nicht aktiviert (wäre dann eh bei 2,7V).
Dann wär auch das Bit im Statusregister gesetzt (hab ich auch überprüft). Ist es aber nicht, ausschließlich das für PowerOn Reset.
Auch der Watchdog ist es nicht.

Ich habe leider kein Skop, ich hab nur n Skop Ersatz, sprich n Spannungsteiler an nem Klinkenstecker an der Soundkarte. Aber da schauts wie gesagt sehr gut aus. Minimaler Einbruch wenn er den mosfet zündet, geschätzte 0,2V oder weniger.



Müssten ungefähr +- 5V sein die angezeigt werden würden (da Soundkarte ist aber der DC Offset flöten), Spannung ist 3,69V (Multimeter).
Selbst sollte die Spannung auf 3V einbrechen sollte den das ja trotzdem nicht so stören...
 
Welche Taktquelle und welcher Takt?
(168, oder 168V (oder vielleicht sogar ein 168P/A/PA)?)
 
Intern RC, 8MHz.
Es ist genau der ATmega 168-20PU
 
Narf...

Ok, nu hätt ich gerne ne Erklärung warum ^^

Also, kurz zum Schaltplan:
Der µC misst 2 Spannungen (wer meine Posts hier verfolgt wird es erraten haben) und schaltet dementsprechend ein Pin an (zu niedrig) oder aus (ok oder zu hoch). Das geht auf einen Mosfet (ich glaub Dino hatte mir den empfohlen?) der im Endeffekt daraus aus einer höheren Spannung eine niedrigere macht.

Wie gesagt mit dem Tiny lief es auch alles. StepDown lässt sich ja ergoogeln, is ne 08/15 Standardbeschaltung.
Aber jetzt gehts los:
Ich hab in einem Akt der puren Verzweiflung mal die Kondensatoren die nach dem StepDown hingen abgezogen. Darunter 1 Goldcap Marke "irgendwo ausgelötet", 10V 1000µF. Auf einmal resettet sich der Mega nicht mehr 0.o
Tut er aber wieder sobald Last dran kommt... Ok.

Denn hatte es mich verwundert. Wie bereits oben erwähnt hatte ich auch versucht das Gate über nen 9,1KOhm Widerstand anzuschließen, da feuerte der Mosfet aber nicht mehr. Ok, andererseits hab ich den über einen 91KOhm auf Masse gezogen (muss auch, da sollte sich der µC abschalten der Mosfet auch ausgehen muss).

Ich diesen letzteren Widerstand raus genommen, läuft...


So und nu gehts los:

Welche Widerstände sollte ich nehmen damit ich vom Controller (geht runter bis zu 3V) den Mosfet noch ansteuern kann während ich ihn mit einem anderem Widerstand runter ziehe?

Warum überhaupt Gate über einen Widerstand? (hab ich schon öfters gesehen). Warum der Tiny es ohne schluckt, der Mega aber nicht wäre eine nette Nebeninfo.

Und noch ne nette Nebeninfo für den nächsten Kauf: Welcher Mega ist kein "Weib"? ^^
IO Pins ist hier das wichtigste, Ram/Rom würd ich den 48er noch nicht mal ausreizen. 28pin DIL wäre ok.

Der Mosfet ist der IRLU2905
 
Hi Tommy,

Aber jetzt gehts los:
Ich hab in einem Akt der puren Verzweiflung mal die Kondensatoren die nach dem StepDown hingen abgezogen. Darunter 1 Goldcap Marke "irgendwo ausgelötet", 10V 1000µF. Auf einmal resettet sich der Mega nicht mehr 0.o
Tut er aber wieder sobald Last dran kommt... Ok.
Hast du wirklich alle beide Vcc/AVcc-Anschlüsse mit Keramiks (100nF) und möglichst am Vcc noch nen kleinen Elko mit 10µF dran ? Das sieht nach kurzen Einbrüchen auf der Betriebsspannung aus.

Wenn du über den MOSFET nen Elko auflädst hast du sehr hohe Ströme und bei leerem Elko einen "Kurzschluß". Also für den Atmel keine Spannung.

Denn hatte es mich verwundert. Wie bereits oben erwähnt hatte ich auch versucht das Gate über nen 9,1KOhm Widerstand anzuschließen, da feuerte der Mosfet aber nicht mehr. Ok, andererseits hab ich den über einen 91KOhm auf Masse gezogen (muss auch, da sollte sich der µC abschalten der Mosfet auch ausgehen muss).
Damit der MOSFET abschaltet wenn der Pin hochohmig ist reicht auch nen 1M Ohm vom Gate nach GND.

Welche Widerstände sollte ich nehmen damit ich vom Controller (geht runter bis zu 3V) den Mosfet noch ansteuern kann während ich ihn mit einem anderem Widerstand runter ziehe?

Warum überhaupt Gate über einen Widerstand? (hab ich schon öfters gesehen). Warum der Tiny es ohne schluckt, der Mega aber nicht wäre eine nette Nebeninfo.
Der Widerstand am Gate soll lediglich Ladeströme der Gate-Kapazität veringern. Das Gate wirkt für den treibenden Ausgang des Atmels wie ein Kondensator den er aufladen muß. Sieh mal ins Datenblatt. Bei großen MOSFETs kann da auch mal nen nF zusammenkommen. Bei hohen Schaltfrequenzen gibt das recht nette Ströme.

Nimm sowas wie 47-100 Ohm vor dem Gate und nen 1M vom Gate nach GND. Das sollte passen.

Also ich tippe auf Betriebsspannungeinbrüche die so kurz sind das du sie mit deinem Soundkartenoszi nicht siehst oder die wirkliche Einbruchstiefe nicht siehst. Ein Mega168 hat ja auch gegenüber einem Tiny etwas mehr Eingeweide und zieht darum etwas mehr Strom.

Gruß
Dino
 
Heyho,

Mit deinem Tipp könntest du natürlich Recht haben, ich kann es aber dank meiner begrenzten Mittel leider nicht wirklich messen sondern nur schätzen.

Kondensatoren hatte ich aber schon dran gehabt, wenn auch 100µF + 2x 33nF gesamt (also Vcc + Vacc, is gebrückt). Aber macht das so viel aus? Ich mein der Strom kam direkt von nem Akku. Trotzdem hatte ich es probiert :)
Hab nur leider kein so großes Materiallager um es mit diesen Teilen noch mal zu probieren.

Ich werd mal schau ob ich die Widerstände die du sagtest hier noch finde, sag denn Bescheid :)
 
Kondensatoren hatte ich aber schon dran gehabt, wenn auch 100µF + 2x 33nF gesamt (also Vcc + Vacc, is gebrückt). Aber macht das so viel aus? Ich mein der Strom kam direkt von nem Akku. Trotzdem hatte ich es probiert :)
zu wenig. Mach mindestens 100nF dran und ja, es macht soviel aus. ;)
Jede Leitung wirkt wie eine Spule. Wenn auch nur eine sehr kleine Spule. Sie wirkt also wie ein Tiefpaß der schnelle Stromänderungen blockiert. Das mußt man mit Keramikkondensatoren die direkt an den Betriebsspannungsanschlüssen sitzen abfangen. Wenn die ein paar Zentimeter weg sitzen nutzen sie nicht mehr viel.

Gruß
Dino
 
Naja, die paar cm sind eh relativ da das ganze jetzt erstmal auf nem BreadBoard sitzt ^^
Aber gut zu wissen :)
 
Intern RC, 8MHz.
Es ist genau der ATmega 168-20PU
Falls die Frage mit der Erklärung mir galt:
Du hast den "normalen" Prozessor (also nicht die "Stromspar-Version"). Der kann mit der reduzierten Spannung nur bis 10MHz. Aber Du bleibst ja innerhalb dieser Grenzen. Also alles iO.
Noch 'ne Frage zu dem Puffer-Elko an Dino: Kann man da stattdessen eigentlich auch Kerkos nehmen, wenn der Platz es erfordert, oder spricht da was gegen? (zwei 1206er Huckepack zB - mit je 4,7µF).
Zum Thema: Ich würde auch auf kurze(!), ausreichend heftige Spannungseinbrüche tippen.
 
Noch 'ne Frage zu dem Puffer-Elko an Dino: Kann man da stattdessen eigentlich auch Kerkos nehmen, wenn der Platz es erfordert, oder spricht da was gegen? (zwei 1206er Huckepack zB - mit je 4,7µF).
Zum Thema: Ich würde auch auf kurze(!), ausreichend heftige Spannungseinbrüche tippen.
wäre wegen dem geringeren Innenwiderstand sogar besser ;)
Schau mal bei Reichelt. Da gibt es auch "High Caps" also Multilayer-Keramiks mit bis zu 100µF aber dann nur 6V.

Gruß
Dino
 
Kurze Zwischenfrage:

Ich hab jetzt Timer0 (noch, wird aber noch zu 1 wegen ein paar Bit mehr) für das PWM.
Jetzt ist es mir aufgefallen dass gelegentlich beim Ausschalten des Timers (Code siehe unten) der Ausgang einfach auf 1 bleibt... Wie kann man das am sichersten unterbinden?

Ps.: Der Mosfet und der Mega mögen sich einfach nicht. Hab jetzt noch ein 60dickemilch Ohm Wiederstand gefunden und eingebaut, is auch noch zu niedrig. Der Mega hängt sich auf oder resettet sich. Hmpf...

Also Initialisierung:
Code:
Timer0_Init:

	; Apply power
	INX		TEMP1	, PRR
	ANDI	TEMP1	, ~(1<<PRTIM0)
	OUTX	PRR		, TEMP1

	; Setup. (Fast PWM, Clear OC0A on match, set on bottom, clk/1)
	LDI		TEMP1	, (1<<COM0A1) | (1<<WGM01) | (1<<WGM00)
	OUTX	TCCR0A	, TEMP1
	LDI		TEMP1	, (1<<CS00)
	OUTX	TCCR0B	, TEMP1
	LDI		TEMP1	, 0x00
	OUTX	OCR0A	, TEMP1

RET

Und das stoppen:
Code:
Timer0_Stop:

	; Reset to power on defaults (remove clock)
	LDI		TEMP1	, 0x80
	OUTX	OCR0A	, TEMP1
	CLR		TEMP1
	OUTX	TCNT0	, TEMP1
	OUTX	OCR0A	, TEMP1
	OUTX	TCCR1A	, TEMP1
	OUTX	TCCR1B	, TEMP1

	; Remove power
	INX		TEMP1	, PRR
	ORI		TEMP1	, (1<<PRTIM0)
	OUTX	PRR		, TEMP1

RET

Wie gesagt, Mega168

Edit: Ich hab die Macros vergessen:
Code:
.MACRO INX
  .IF @1 < 0x40
	IN		@0		,	@1
  .ELSE
  	LDS		@0		,	@1
  .ENDIF
.ENDMACRO

.MACRO OUTX
  .IF @0 < 0x40
	OUT		@0		,	@1
  .ELSE
  	STS		@0		,	@1
  .ENDIF
.ENDMACRO
 
Hallo Tommy,

nach dem Reset sind Data-Register und Direction-Register der Ports 0x00, das heißt die Pins sind INPUT und der Pullup-Widerstand ist deaktiviert. Das bedeutet die Pins sind hochohmig. Da du ein MOSFET ansteuerst, muss lediglich die Gate-Kapazität umgeladen werden. Wenn du die OutputCompare-Funktion des Timers deaktivierst, ist wieder die normale Portpin-Funktion verfügbar. Wenn der MOSFET zum Schluss durchgeschaltet war, wird er diesen Zustand beibehalten, da der Portpin hochohmig ist.

Du solltest nach Reset dafür sorgen, dass der Portpin als Ausgang Low geschaltet ist.

Bei deaktivierter OutputCompare-Funktion reicht da sogar eventuell schon ein Finger am Pin, um den MOSFET durchzuschalten.

Dirk
 
Hallo Dirk,

nein, das ist es leider nicht. Der Pin ist aktiv High.
Auch ein CBI hat da nicht geholfen (den Pin per Software auf Low ziehen)

Edit:
Nur falls es Missverständnisse gab: Nach Reset / Anklemmen der Spannung ist alles ok.
Nur sollte so ein Vollhonk wie ich mal auf die Idee kommen den Taster zu drücken um so den Ausgang (also Timer 0) auszuschalten, denn geht's teilweise schief :)
 
Hi Tommy,

jetzt sehe ich es:

Die Compare-Funktion ist nicht ausgeschaltet. Du schreibst in die Register TCCR1A und TCCR1B vom Timer1, du verwendest hier nicht die Register vom Timer0. CBI hat dann natürlich keine Wirkung, der Timer0 steht nur.

Dirk
 
Oh sch**** :D

Glaub das hätt ich die nächsten Wochen noch übersehen, dämliches C&P :D
Daran wirds wohl schon liegen, sec.

Edit: Jepp lag daran. Könnt mir sowas von ins Sitzorgan beißen würd dabei nich die Wirbelsäule brechen :D
Oh Mann, damit hat's gleich noch einen anderen nicht reproduzierbaren Bug eliminiert. Besten Danke :)
Und ich such schon den ganzen Tag…
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)