mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer im Compare Betrieb Comp A/B


Autor: Denny Breuer (sunsetraving)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR: 8515 <-- Vorgänger vom Atmega
STK500

So Denn, Ich habe ganze 4 Beiträge gefunden die sich mit Compare 1 
Beschäftigen und 0!! die mehr machen :(

Also Gut.

Ich Programmiere grade einen Frequenzgenerator mit Einstellbarer 
Pulsweite. Bei 50% Pulsweite ist die Sache ganz ein Fach, ich lasse 
einfach PIND 5 toggeln. Aber bei 25% oder 75% ist schon mehr nötig.

Bisher lasse ich den PIND 5 toggeln UND die ISR auslösen. Die ISR 
Schreibt denn, ja nach PIN 0 oder 1 den Wert für 25 oder 75% in das 
OCR1A.

Daraus ergeben Sich aber Performance Nachteile und "ungenaue" 
Pulsweiten. Denn wenn der Interuppt grade gesperrt ist, kann er die PW 
nicht ändern.

Nun hatte ich die Tolle Idee, einfach den Compare B mit zu nutzen. Ich 
musste aber ganz schnell feststellen, das der nen Anderen Pin schaltet. 
Also muss wieder der PIND 5 getoggelt werden. Meine Strategie:

Compare B löst aus --> PIND5 über ISR einschalten --> Compare A löst 
DANACH aus, PIND 5 über TCCR1A ausschalten und Timer Löschen (Von Vorne 
beginnen).

In der Simulation geht das noch, aber in echt gehts nicht. Es gibt nur 
ne Flatline. Frequenzen sind von 100Hz bis 10KHz. Nachmessen tue ich 
über ein DSO.

Hat jemand erfahrung damit oder ist das sogar ein BUG in der CPU???

MFG
Sunsetraving

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AT90S8515, also externer Quarz.
Gehen wir mal vom schlechtesten Fall aus, einem Quarztakt von 1MHz.
Du willst Frequenzen bis 10kHz erzeugen, das sind minimal 100 Takte pro 
Periode, also pro zwei Portpin-Aktionen. Es ist also geradeso noch 
möglich, den Portpin von Hand zu setzen. Bei schnellerem Quarz bleibt 
natürlich mehr Spielraum.

Im Prinzip kann das ein Compare-Interrupt alleine, es spart aber 
vermutlich Rechnerei (bedingte Verzweigerei), mit beiden 
Compare-Interrupts zu arbeiten.

Compare1A könnte
- den Portin setzen (H)
- OCR1A (nicht TCNT1!) einlesen
- zu einer Kopie davon die Periodendauer addieren und nach OCR1A
  zurück schreiben
- zur anderen Kopie die Impulsdauer addieren und in OCR1B schreiben

Compare1B könnte:
- den Portpin rücksetzen (L)

Die Mainloop könnte in aller Ruhe die Werte für Periodendauer und 
Impulsdauer errechnen und bereitstellen und sich um den Rest (Taster, 
Display, usw.) kümmern.

Es gibt vermutlich bessere Konzepte, aber so würde ich es zu lösen 
versuchen.

...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde Dir einen neueren AVR empfehlen, die sind mit weitaus mehr 
Timern und besseren Features (doppelt gepufferte OC-Register) 
ausgestattet. Auf dem 90S8515 verrenkst Du Dir den Arm mit solchen 
Dingen

Autor: Denny Breuer (sunsetraving)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ein Guter Ansatz von dir. Allerdings habe ich die Werte in 
Tabellenform bereits Fest Vorliegen. Hab mit nem script wahnsenig viele 
Werte erechnen lassen und dann ins SRAM geschrieben. Also Rechnen ist 
nicht nötig.

Ich versuche grad mal den Externen Interupt auszulösen, in dem ich 
einfach den OCR1B Pin auf extern I0 lege und dann über die ISR Den Pin 
wieder abschalte und PIND 5 darüber toggel ...

Aber Prinzipiell würde ich schon meine "erste" Verion vorziehen. Aber 
Irgendwie mag der Prozessor nicht. Quarz ist Übrigens auf 3,686MHz..

Mit meiner "NUR COMP A" Methode schaffe ich 90kHz 50% und 40kHz 25%..
Falls es interessiert ;)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade mal ins Datenblatt geschaut.

Wenn Du CTC1-Flag setzt, macht der Timer1 bei Compare1A einen Reset, 
beginnt also bei 0.

Du brauchst dann nur noch in ocr1A die Periodendauer und in OBR1B die 
Impulsdauer einzutragen. Die Interrupts bedienen dann lediglich den 
Portpin (einer setzt, einer löscht). Da sbi und cbi keine Flags 
beeinflusst, ist keine SREG-Sicherung erforderlich. Die ISRs werden also 
recht schnell.

Die Mainloop hat also alle Zeit der Welt, aus irgendwelchen Ereignissen 
die Werte für Periodendauer und Impulsdauer bereitzustellen und in die 
entsprechenden I/O-Register einzutragen.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit meiner "NUR COMP A" Methode schaffe ich 90kHz 50% und 40kHz 25%..
> Falls es interessiert ;)

ja sicher, aber nicht mit gleitendem Tastgrad (alle Zwischenwerte 
möglich), von dem ich ausging. Wenn Du nur 25%, 50% und 75% brauchst, 
dann wird das auch bedeutend schneller gehen.

...

EDIT: Ich ging davon aus, dass variabler Tastgrad und variable Frequenz 
erforderlich sei und Beides möglichst stufenlos (stufenarm) eingestellt 
bzw. während des Betriebes verändert werden soll.

...

Autor: Denny Breuer (sunsetraving)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wenn es denn mal fertig ist ;)

Aber immo arbeite ich mit festen Werten. Wobei ich später einfach 51 
Tabellen haben werde und das EEPROM mal nutze... Wenn es schon mal da 
ist.

Das Problem was ich habe, ich mach das erst seit nem Viertel Jahr und 
was Rechnen mit 16Bit Ints angeht und ohne Flieskomma zahlen.. Da kann 
ich leider die Pulsdauer nicht errechnen :(

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denny Breuer wrote:
> Ja, wenn es denn mal fertig ist ;)

Gut, dann ist mein Ansatz ja gar nicht mal falsch.

>
> Aber immo arbeite ich mit festen Werten. Wobei ich später einfach 51
> Tabellen haben werde und das EEPROM mal nutze... Wenn es schon mal da
> ist.

Da ich nicht weiß, was Dein Gerät mal können soll, kann ich leider nicht 
darauf eingehen, das wäre reine Spekulation.

>
> Das Problem was ich habe, ich mach das erst seit nem Viertel Jahr und
> was Rechnen mit 16Bit Ints angeht und ohne Flieskomma zahlen.. Da kann
> ich leider die Pulsdauer nicht errechnen :(

Nunja, jetzt greift Travel Rec.'s Vorschlag, die ATMegas können in 
Hardware multiplizieren. Aber Multiplikation und Division geht auch in 
Software mit vertretbarem Aufwand, Fließkomma ist da nicht erforderlich.

Denke mal an die Grundschule zurück und multipliziere/dividiere mal 
"schriftlich" (also zifferweise) durch fortgesetzte Addition oder 
Subtraktion. Und setze das dann mal in binär um (mal 2 oder durch 2 
erreicht man durch Schieben/rotieren des Registerinhalts). Du wirst 
staunen, wie effizient das sein kann.

Bei ATMEL (und auf Deiner STK500-CD) sind Appnotes, da ist mit 
Sicherheit eine dabei, die das Multiplizieren und Dividieren in Software 
beschreibt.

...

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.