Forum: Compiler & IDEs Nochmal: PWM beim 2313


von W. Franz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich hab ein Problem mit PWM und dem 2313er.
Ich will nur einen simplen Test programmieren...

Funktion: Taste drücken, der inhalt des
verglechsregisters ändert sich, somit auch die
Impuls/Pausenzeit des PWM-Signals

Problem: wenn ich die taste los lasse, nimmt das
vergleichregister wieder den vorherigen wert an.
und ich weiss einfach nicht warum !!!

Könnte sich einer mal dem Code anschauen???

danke schon mal

von Karl H. (kbuchegg)


Lesenswert?

Weil Du zwar den Output Compare Match Interrupt
eingeschaltet hast, aber keine Behandlungsroutine
dafuer hast.
Der Compiler legt standardmaessig die Interrupt-
Tabelle so an, dass sie in einen Reset muenden,
wenn Du keinen Handler dafuer hast.
Da Du keinen Handler fuer den Compare Match hast,
resettet dein Controller staendig und daher ...
beginnt dein Programm immer wieder von vorne.

von W. Franz (Gast)


Lesenswert?

Ach so

also einfach nur schreiben:

ISR (TIMER1_COMP1_vect){};

und das wars?

von W. Franz (Gast)


Lesenswert?

stimmt das funzt !!!

hmm is ja auch irgentwie ganz logisch...

danke für die schnelle hilfe...

von W. Franz (Gast)


Lesenswert?

Wo kann man eigentlich nachlesen wir der
compiler den ganzen stack anlegt???

von Rolf Magnus (Gast)


Lesenswert?

Einfacher wäre statt eines leeren Interrupt-Handlers, den Interrupt gar
nicht erst einzuschalten. Wozu schaltest du ihn eigentlich überhaupt
ein, wenn du damit eh nichts tust?

> Wo kann man eigentlich nachlesen wir der compiler den ganzen stack
> anlegt???

Wieso Stack? Was hat der damit zu tun? Das dürfte irgendwo in der
avr-libc-Doku stehen.

von W. Franz (Gast)


Lesenswert?

Ja stimmt den Interrupt brauch ich eigentlich gar nicht...

Ich hab zuvor sehr lange Assembler programmiert,
und bin jetzt auf C umgestiegen um etwas mit uC zu machen.
Also würde ich gerne wissen wie der compiler den assembler
code erzeugt, und was er verändert...

Für mich ist es letztendlich schon wichtig wie der Stack im uC steht.
Dann würde ich vielleicht viel schneller in die materie reinkommen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Also würde ich gerne wissen wie der compiler den assembler code
> erzeugt, und was er verändert...

Wenn deine Quelldatei meins.c heißt, dann sagst du einfach auf der
Kommandozeile »make meins.s« und schaust dir die Datei meins.s an.

> Für mich ist es letztendlich schon wichtig wie der Stack im uC
> steht.  Dann würde ich vielleicht viel schneller in die materie
> reinkommen.

Der Stack wird einfach ,von oben', also vom Ende des internen RAMs
nach unten aufgebaut.

Schau dir die avr-libc-Doku an, in der Beschreibung des malloc() habe
ich für das Speicher-Layout zwei oder drei Bildchen.  malloc() und
heap kannst du ja dabei erstmal ignorieren, dann siehst du immer noch,
wo Stack und Variablen liegen.

von peter dannegger (Gast)


Lesenswert?

> Also würde ich gerne wissen wie der compiler den assembler code
> erzeugt, und was er verändert...


Du kannst Dir ein prima List-File erzeugen lassen, wo die C-Zeilen und
der dazugehörende Assembler untereinander stehen.

Da ich mich mit make-Files nicht auskenne, mache ich alles mit einer
Batch (spart außerdem das Eintragen aller Module, da *.c automatisch
expandiert wird):

----------------------------------------------------------
set mcu=tiny26
set main=test
set ac=c:\avr\winavr
path %ac%\bin;%path%
avr-gcc.exe -xc -Os -mmcu=at%mcu% -Wall -g -o main.out *.c
if not exist main.out goto end
avr-objdump.exe -t -h -S main.out >%main%.lst
avr-objcopy.exe -O ihex main.out %main%.hex
avr-size.exe -B main.out
del main.out
:end
----------------------------------------------------------

Wichtig ist der Schalter -g beim Compiler, damit avr-objdump.exe dann
das Listing erzeugen kann.
avr-size.exe gibt dann noch die belegte Flash/SRAM-Größe aus.


Peter

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
Noch kein Account? Hier anmelden.