PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Signalerzeugung



mr.burns
05.11.2010, 22:09
Hallo,

ich bin noch recht neu in der AVR Programmierung und Suche einwenig Starthilfe für mein Problem.
Ich möchte auf einem Pin eines ATTiny2313 ein zeitlich gesteuertes Signal ausgeben (siehe angehängte Datei).

Also z.B.:
1. 20 ms High-Pegel
1. 20 ms Low-Pegel
1. 40 ms High-Pegel
1. 20 ms Low-Pegel
1. 40 ms High-Pegel
1. 20 ms Low-Pegel

usw.

Wie mach ich das am besten? Über PWM? Oder über Timer? Interrupt?
Für ein paar Tipps wäre ich sehr dankbar,

Danke!

Besserwessi
05.11.2010, 23:31
Da gibt es mehrere Möglichkeiten.

1) Mit Delay funktionen
2) Über einen Timerinterrupt alle 20 ms (CTC Modus)
3) Über einen Timerinterrupt jeweils zur passenden Zeit (Compare Register jeweils anpassen)
4) über eine PWM Ausgang, mit verändern der Einstellungen im Interupt
5) Über die UART oder alternativ auch das SPI Interface mit passendem Takt


Die einfachste Lösung, und noch ziemlich genau wäre wohl der Timerinterrupt.

hardware.bas
06.11.2010, 16:33
Ganz einfach: Mit dem wait-Befehl (Eingabe in Sekunden), in diesem Falle mit dem Befehl Waitms, Eingabe im Millisecunden.
Beispielauszug:
Portb.1 = 1
Waitms 20
portb.1 = 0
Dies erzeugt einen 20ms-Impuls
VG Micha

TobiKa
06.11.2010, 16:38
@hardware.bas
Es geht hier nicht um Bascom!! Wer lesen kann...
Außerdem ist deine Variante die schlechteste die man wählen kann.


Wenn die Pulsweiten nicht ständig wechseln, würde ichn PWM nehmen, einmal konfiguriert, und es läuft ohne das du dich um was kümmern musst. Wenn du eine andere Pulsweite brauchst kannst du sie bequem per Register ändern.

Ändert sich die Pulsweite ständig, dann wie Besserwessi vorgeschlagen hat, n Timerinterrupt alle 20 ms und den Pegel ändern bzw. stehen lassen.

hardware.bas
06.11.2010, 16:56
TobiKa:
mr.burns ist Anfänger und sicherlich interessiert an einem schnellen Erfolgserlebnis. Die Lösung erstmal mit Waitms-Befehlen zu erledigen,
ist m. Era. erstmal das Beste. Ich stimme dem zu, dass mit dieser Läsung
keine Hintergrundprogramme laufen können.
Zu BASCOM. Es war nicht auch nicht Rede, BASCOM auszuschliessen,
noch dazu, wo sie die Sprache der Praktiger ist. VG Micha

TobiKa
06.11.2010, 16:59
1. Ich versteh nicht was du möchtest... schreib erstmal ordentlich!
2. Bascom ist was? Besser? Nö!
3. Wer im C Bereich postet möchte höchstwahrscheinlich keinen Bascom Code.

hardware.bas
06.11.2010, 16:59
Nachtrag:
Sehe erst jetzt, dass ich mich in der falschen Rubrik befand, sorry.
Habe versucht zu helfen aud der Rubrik "letze Beiträge"
Also bitte nicht verübeln. VG Micha

mr.burns
08.11.2010, 07:24
Hallo,

danke erstmal an alle, die hier so schnell geantwortet haben.
Ich bin hier im Forum C-Programmierung und in der Tat an einer Implemenation in C interessiert.
Ich habe bereits viel Erfahrung in C und C++ jedoch auf einem PC und nicht im Bereich Mikrocontroller.
Ich denke ich versuche die Interrupt-basierte Lösung, die Besserwessi vorgeschlagen hat.
PWM kommt weniger in Frage, da sich die Pulsweiten ständig ändern.
Werde mich dan mal ranmachen, wenn ich Probleme habe weis ich ja, wo ich Hilfe bekomme ;-)

Danke nochmal!

RedBaron
08.11.2010, 10:27
Interrupts sind nur dann eine gute Lösung, wenn die Zeitsteuerung nebenläufig erfolgen soll. Wenn die Zeitsteuerung die einzige Aufgabe ist, ist der Einsatz einer Delay- oder Wait-Funktion die bessere Alternative. Ist einfach weniger komplex und kürzer. Interrupts sind außerdem sehr schwer zu debuggen.

Wenn die Zeitsteuerung sehr genau sein sein, empfiehlt es sich einen Timer zu starten und auf dessen Ablauf (Timerregister abfragen) in einer Schleife warten.

TobiKa
08.11.2010, 13:39
Dem kann ich so nicht zustimmen.
Nur weil die eine Sache etwas komplizierter, dafür aber besser ist, sollte man nicht einen anderen Weg nehmen.

Gerade bei Delay bzw. Wait (oder wie sie auch immer heissen) Funktionen, muss man aufpassen das der Compiler sie nicht weg optimiert!

RedBaron
10.11.2010, 10:25
Da wäre doch die Frage angemessen, was denn genau "besser" ist. Unnötige Komplexität ist definitiv schlecht!

TobiKa
10.11.2010, 13:18
Das beantworte ich doch gerne.

Ich finde es nicht unnötig kompliziert einen Timer einzurichten, der den Zustand eines Pins verändert. So könnte man das "Muster" in einem Array ablegen, welches dann (nebenbei) abgearbeitet wird. Das hat nur Vorteile.

Schlecht finde ich die Delay/Wait/... Methode, weil dadurch immer der komplette Programmablauf angehalten wird. Das hat zur Folge das man entweder garnichts anderes mehr mit dem Controller machen kann oder dass das Timing des Signals nicht mehr passt, falls noch etwas anderes zwischendurch gemacht wird.

Ceos
11.11.2010, 09:10
ich persönlich würde ebenfalls die timervariante präferieren ... und mal eine frage ... WO ist das problem mit den wechselnden pulsbreiten ?

du setzt den timer (im CTC modus) so auf, dass er ca. jede 1ms einen takt hochzählt .... im interrupt für den compare holst du dir dann die nächste pulslänge aus einem array oder so und toggelt einen pin deiner wahl

das dauert bei 16Mhz extern nur ca 2µS wenn du "schlampig" programmierst ^^

der timer zählt während du das CTC register änderst gerade einmal die erste millisekunde hoch und die restlichen 19/39 mS kann dein programm machen wozu du lust hast


Unnötige Komplexität ist definitiv schlecht!
definier mal unnötige komplexität genauer .... 4 zeilen + 1 interrupt sind was ?! komplex ? ja ist gut .. na klar ... das ist so als würde ich sagen ... fernsehn umschalten ist unnötig komplex, nur weil die fernbedienung nicht in griffreichweite liegt


außerdem: wenn ich mich einer schlechten lösung bediene, nur weil die auf-/vorgabe es zulässt, wie soll cih mir dann einen ordentlichen programmierstil zulegen!? das ist ungefähr so als wenn cih ins fitness-center gehe und sage ... mein trainer ist nicht da, dann muss ich die hantel auch nur einmal stemmen ... fitter wirste davon sicher nicht