PWM mit dem ATTINY26

Gast #237686
Hallo zusammen!
Möchte ein PWM-Signal erzeugen. Soweit wie in dem Dateianhang bin ich
schon gekommen, doch es passiert leider nichts an dem Ausgang!
Würde mich freuen, wenn mir jemand weiterhelfen könnte!

Controller: ATTINY26

MFG
Matthias
Angehängte Dateien:
Gast
Übrigens spaziert dein Mikrocontroller in die Pampa, sobald deine
main()-Funktion fertig ist. Die muß so geschrieben sein, daß der
Controller da nie rauskommt.
Persönliche Seite
Eigentlich sollte der Compiler da sogar meckern, denn die Funktion ist
nicht void definiert und enthält keine Endlosschleife.

Oder ist es vielleicht so, daß dem Compiler das für main völlig egal
ist? Daß er nicht motzt, wenn hinter einer Endlosschleife ein
 'return 1;' fehlt, kann ich ja noch verstehen.
Moderator Persönliche Seite
> Übrigens spaziert dein Mikrocontroller in die Pampa, sobald deine
> main()-Funktion fertig ist.

Nicht in die Pampa, sondern er macht ein exit(), was letztlich (per
default) eine Endlosschleife ist.  Der PWM sollte trotzdem weiter
PWMen.

> Eigentlich sollte der Compiler da sogar meckern, denn die Funktion
> ist nicht void definiert und enthält keine Endlosschleife.

Ja.  Außerdem definiert man main() nicht void. ;-)
Gast
Schönen Dank für die schnellen Antworten!
Ich hab das Programm abgeändert (s.o), doch es funzt immer noch nicht.
Der Port OC1A ist jetzt dauer High.

Hat jemand noch ein Vorschlag???

MFG
Matthias
Angehängte Dateien:
Gast
> Nicht in die Pampa, sondern er macht ein exit(), was letztlich
> (per default) eine Endlosschleife ist.  Der PWM sollte trotzdem
> weiter PWMen.

Ah, das wußte ich noch nicht. Da hat ja einer mitgedacht. Wer kann denn
sowas ahnen? ;-)

> Außerdem definiert man main() nicht void. ;-)

Ist avr-gcc nach C-Norm eine "hosted implementation" oder
"free-standing"? Bei letzterer ist nicht festgelegt, wie main()
auszusehen hat. Es ist nicht mal festgelegt, daß es die überhaupt geben
muß.
Moderator Persönliche Seite
> Ich hab das Programm abgeändert (s.o), doch es funzt immer noch
nicht.
> Der Port OC1A ist jetzt dauer High.

Hmm, lies doch mal das Datenblatt ein bisschen...  Der ATtiny26
scheint sich hier um einiges anders zu benehmen als andere AVRs,
d.h. du kannst PWM-Code, der für einen anderen AVR geschrieben worden
ist, nicht 1:1 übernehmen.

M. E. musst du insbesondere OCR1C noch auf einen sinnvollen Wert
setzen (Datenblatt S. 74 unten, Formel für PWM-Frequenz S. 76 unten).

>> Außerdem definiert man main() nicht void. ;-)

> Ist avr-gcc nach C-Norm eine "hosted implementation" oder
> "free-standing"?

It depends.  Mit der Option -ffreestanding wird er letzteres.
Allerdings sollte man sich sehr genau überlegen, ob man das wirklich
will.  Naturgemäß könnte man für einen Controller ja immer erstmal
sagen: ,,Ist doch freestanding, keine Frage!'', aber man hat ja auch
eine Standardbibliothek, auf die man zurückgreifen möchte.  Im hosted
mode (der der Default ist beim GCC) kann der Compiler bestimmte
Optimierungen vornehmen basierend auf impliziten Annahmen über das
Verhalten von Standardfunktionen.  Das ist manchmal gar nicht so
schlecht.  Man kann simpel einen Sack voll Variablen jeweils mit
memcpy() kopieren, wenn diese aber klein genug sind und der Compiler
gerade Register frei hat, kann er stattdessen auch gleich die Kopie
selbst vornehmen.

Falls man C++ machen möchte, hat man eh' keine Wahl, dort ist
-ffreestanding nicht zulässig.

> Bei letzterer ist nicht festgelegt, wie main() auszusehen hat. Es
> ist nicht mal festgelegt, daß es die überhaupt geben muß.

Ja, wo fängt man dann eigentlich an. ;-)

Die avr-libc-Umgebung geht stets davon aus, dass ein main() gerufen
wird.
Moderator Persönliche Seite
> Der avr-gcc will ein "int main(void)", sonst kommt eine Warnung.

Quark.  Erstens hättest du vor dieser Bemerkung ja mindestens mal
versuchen können, der Diskussion zwischen Rolf und mir zu folgen:

$ cat foo.c
#include <avr/io.h>
void main(void)
{
        DDRB = 0xff;
        for (;;)
                PORTB ^= 0xff;
}
$ avr-gcc -W -Wall -mmcu=atmega8 -ffreestanding -O -o foo.elf foo.c
$

(Keine Warnung.)

Zweitens geht auch im hosted mode immer "int main(int, char **)"
als
Prototyp (bzw. ein dazu äquivalenter).
Gast
Hallo!
Hab es hinbekommen. Hatte es auch fast richtig, nur ich hab
rausgefunden das von dem 8-bit-Counter OCR1C den Wert angibt, bis zu
dem der Zähler zählt und OCR1A gibt an, wann der Ausgang umgeschaltet
wird! Darum muß OCR1C immer größer sein als OCR1A!
Mit eurer Hilfe hab ich mal wieder ein Problem gelöst bekommen!
Wird bestimmt nicht das Letzte sein...

Vielen Dank!

MFG
Matthias

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.