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
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.
Ach so also einfach nur schreiben: ISR (TIMER1_COMP1_vect){}; und das wars?
stimmt das funzt !!! hmm is ja auch irgentwie ganz logisch... danke für die schnelle hilfe...
Wo kann man eigentlich nachlesen wir der compiler den ganzen stack anlegt???
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.
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.
> 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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.