Blinker blinkt zu oft

wer

Neues Mitglied
02. Juli 2012
485
0
0
Sprachen
  1. Assembler
Ich finde diesen blöden Fehler nicht!

Eigentlich soll die LED 5 mal blinken. Aber sie blinkt etwa 70 mal.
Code:
.DEF	temp1	= R16
.DEF	temp2	= R17
.DEF	tempL	= R18		;  Low-Byte für 16 Bit Parameter
.DEF	tempH	= R19		; High-Byte für 16 Bit Parameter

	ldi	temp1, 0x80
	out	DDRA, temp1
	out	PORTA, temp1

	ldi	tempL, 10
L0:	ldi	temp1, 0x80
	out	PINA, temp1

	ldi	temp1, 0
L1:	ldi	temp2, 0
L2:	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	dec	temp2
	brne	L2
	dec	temp1
	brne	L1

	dec	tempL
	brne	L0
Der MC läuft mit 19,6608 MHz.

Wolfgang
 
Über lege mal was geschieht, wenn tempL zu 0 dekrementiert wurde...
Dann kommen die nachfolgenden Programmteile dran. Davor wird nur der Stack (unnötigerweise) initialisiert. Das ganze befindet sich nicht in, sondern noch vor der Hauptschleife.
 
OK, das ist mir auch neu. Aber da war letzten ein Beitrag von Lotadac dazu, denke ich :)
 
Sag ich doch, sofern der Controller einen A-Port besitzt, ist in der entsprechenden Definitionsdatei auch die Adresse des A-Pin-Registers definiert. Folglich kann besagtes Register ausgelesen werden, es kann aber auch beschrieben werden - wobei dann alle "Einsen" das entsprechende Port-Bit toggeln (und damit ggf auch einen Effekt auf das Beinchen haben.)
Im Allgemeinen sind die Pin-Register übrigens direct bit accessible - Du kannst also mittels SBI toggeln...

Was sind denn die "folgenden Programmteile"? bei Dir ist das Listing da zu Ende.
 
Kurze Frage zum togglen über PINA zB ... Unterstützen das nur die neueren Mikrocontroller, oder grundsätzlich alle. Beim Atmega128 habe ich nichts hierzu im Datenblatt gelesen, es kann aber sein dass ich es nur nicht gefunden habe.
 
Kurze Antwort: Beim Mega8 finde ich da auch nichts. Das ist MIR neu. Wenn Du die alt/neu-Grenze also zwischen Mega8 und Mega88 ziehst, scheinst Du recht zu vermuten (der Tiny261 kanns, beim Tiny26 findet mans noch nicht).

PortA.7 wird so insgesamt 6x Hi und 5x lo geschaltet - nach dem dekrement tempL->0 wird die Schleife (L0) verlassen, ohne nochmals umzuschalten.

ABER: entweder ich habe mich hier ganz grob vertan, oder der gesamte Block (vom ersten mal L0-Label = Schleifeneintritt bis Schleifenaustritt mit TempL=0) dauert über den Daumen ca 17.700.000 Takte, also ca 'ne knappe Sekunde.
 
ABER: entweder ich habe mich hier ganz grob vertan, oder der gesamte Block (vom ersten mal L0-Label = Schleifeneintritt bis Schleifenaustritt mit TempL=0) dauert über den Daumen ca 17.700.000 Takte, also ca 'ne knappe Sekunde.
Tatsächlich blinkt er mit einer Frequenz von 3-4Hz etwa 20 Sekunden lang. Danach kommt ein Programmteil, der eine Einschaltmeldung über die ser. Schnittstelle an einen PC liefert usw., was auch erfolgt.

Wolfgang
 
Habs mal ins Studio kopiert und ein NOP angehängt - dort kommt der Simulator nach ca 900ms an.
 
Habs mal ins Studio kopiert und ein NOP angehängt - dort kommt der Simulator nach ca 900ms an.
Soweit die Theorie.
Der MC steckt in einem STK500. Die LED ist eine externe (keine von dem STK500) die über PINA7 und GND geschaltet wird. Sonst keine Besonderheiten.
Oder vielleicht noch diese: Habe vorher das EEPROM-Save Bit in den Fuses gesetzt, weil ich das EEPROM brauche. Das EEPROM wird während der Einschaltmeldung ausgelesen. Klappt aber soweit.

Wolfgang
 
ABER: entweder ich habe mich hier ganz grob vertan, oder der gesamte Block (vom ersten mal L0-Label = Schleifeneintritt bis Schleifenaustritt mit TempL=0) dauert über den Daumen ca 17.700.000 Takte, also ca 'ne knappe Sekunde.

Auf solche Werte komme ich auch, das ergibt dann 900ms. Die Blinkfrequenz müsste so bei 0,55Hz liegen. Komisch, dass die LED mit 3 bis 4Hz blinkt.

Welcher Mikrocontroller ist es denn?
Werden Interrupts genutzt?


Dirk :ciao:
 
Auf solche Werte komme ich auch, das ergibt dann 900ms. Die Blinkfrequenz müsste so bei 0,55Hz liegen. Komisch, dass die LED mit 3 bis 4Hz blinkt.

Welcher Mikrocontroller ist es denn?
Werden Interrupts genutzt?


Dirk :ciao:
Ich komme auf etwas über 5,5Hz! Vielleicht stimmt das ja auch, ich hab 3-4Hz geschätzt. Ja aber, wenn es nur die Frequenz wäre, aber das Teil blinkt ca. 20s lang!!

Es ist ein ATmega1284p. Keine Interrupts. Im Moment gibt es nur noch eine ser. Verbindung zu einem PC. Zunächst schickt der MC eine Einschaltmeldung an den PC, danach (dann in der Hauptschleife) schickt der PC Kommandos, die der MC als Echo zurückschickt. Letzteres funktioniert alles einwandfrei.

Wolfgang
 
Auf solche Werte komme ich auch, das ergibt dann 900ms. Die Blinkfrequenz müsste so bei 0,55Hz liegen...
Fragezeichen
5,5 Perioden in 900ms? Wären doch so um die 6Hz, oder? Da wir grob überschlagen hatten, könnten(!!) die "3-4" Hz etwa passen.
Mehr als den vorliegenden Code haben wir nicht zum spekulieren, aus diesem ist nicht ersichtlich warum/wo das Dekrementieren von tempL verzögert wird.
Hmm... 20s klingt ja fast so, als wenn tempL zwischendurch unterläuft.
 
Fragezeichen
5,5 Perioden in 900ms? Wären doch so um die 6Hz, oder? Da wir grob überschlagen hatten, könnten(!!) die "3-4" Hz etwa passen.
Mehr als den vorliegenden Code haben wir nicht zum spekulieren, aus diesem ist nicht ersichtlich warum/wo das Dekrementieren von tempL verzögert wird.
Hmm... 20s klingt ja fast so, als wenn tempL zwischendurch unterläuft.
Wie kommst Du auf 5,5 Perioden? Na, egal!
Kann es sein, daß der MC ein paar mal reseted wird?
Wodurch?
Das nächste Stück Code wäre der Initialisierungscode für den USART.
Mir fällt keine Unregelmäßigkeit während des Blinkens auf.

Wolfgang
 
Mit den 900ms bin ich mir ziemlich sicher, das gibt dann eine Periodendauer von 1,8s, Blinkfrequenz 0,55Hz. Warum es schneller und oefter als 5mal blinkt, weiss ich im Moment auch nicht. (Bei der Bezeichnung der Register kann man schnell mal anstelle einer 1 ein kleines L schreiben, das fällt nicht besonders auf, zumindest im Forum nicht, vielleicht ist hier im originalen code etwas passiert ... Nur so eine Idee)
 
Mit den 900ms bin ich mir ziemlich sicher, das gibt dann eine Periodendauer von 1,8s, Blinkfrequenz 0,55Hz. Warum es schneller und oefter als 5mal blinkt, weiss ich im Moment auch nicht. (Bei der Bezeichnung der Register kann man schnell mal anstelle einer 1 ein kleines L schreiben, das fällt nicht besonders auf, zumindest im Forum nicht, vielleicht ist hier im originalen code etwas passiert ... Nur so eine Idee)

Innerhalb der 900ms hast Du doch 10 Zustandswechsel an PINA7! Also 5 Perioden.

Wolfgang
 

Ü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)