www.mikrocontroller.net

Forum: Compiler & IDEs Nochmal: PWM beim 2313


Autor: W. Franz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: W. Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so

also einfach nur schreiben:

ISR (TIMER1_COMP1_vect){};

und das wars?

Autor: W. Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt das funzt !!!

hmm is ja auch irgentwie ganz logisch...

danke für die schnelle hilfe...

Autor: W. Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo kann man eigentlich nachlesen wir der
compiler den ganzen stack anlegt???

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: W. Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.