mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega16 counter0 & IRQ


Autor: Tom (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei, eine Pulsbreiten / Pulsmodulation aufzubauen.
Aber irgendwie bekomme ich den IRQ nicht zum Ticken.
Vielleicht erbarmt sich ja mal einer und sieht durch was ich falsch
gemacht habe.

Die Funktion "pbInit(BYTE time)" soll den Timer0 mit IRQ aktivieren.


Die Funktion "SIGNAL(SIG_OVERFLOW0)" soll bei Interrupt aufgerufen
werden und eine Leistungssteuerung an Port C aufrufen.

Ich versuche im Moment erst mal den Interrupt bei Überlauf des Counters
1 aufzurufen, später soll auf Vergleichswert Time umgeschrieben werden.
Ich bin für jede Hilfe dankbar.


Grüße

Tom

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann auf die Schnelle nichts entdecken, scheint alles richtig zu
sein (was aber gar nichts heisst:-)
Mega16, PortC: da schrillen bei mir die Alarmglocken. JTAG
abgeschaltet?

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube du setzt die Timer Interrupt Mask (TIMSK) falsch. Bit 0 (das
erste Bit - welches du auf 1 setzt) ist TOIE0 (Timer Overflow Interrupt
Enable). Du benötigts OCIE0.

Ich schreib es in der Form, dann muss man nicht selbst die Bits
zusammensuchen.
TIMSK |= _BV(OCIE0);

oder auch:
 TCCR2 = (_BV(WGM21) | _BV(CS22) | _BV(CS21))
Zum gezielten zurücksetzen eines Bits:
 TIFR &= ~_BV(OCF2)

Vorteil: man sieht auf den ersten Blick, welche Bits gemeint sind.

Das Makro _BV(X) entspricht (1 << X). Bit 0 wird also X mal nach links
geschoben. Die Werte für X sind im iom16.h deklariert.
_BV(X) kann vom Compiler schon zur Compilezeit aufgelöst werden.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erst mal danke das ihr euch durch meinen Code gewühlt habt.

@ Anton:
Ja ich weis ich sollte mit die Flagnahmen und den  (1 << X )
Programmierstiel angewöhnen. Aber irgendwie widerstrebt es mir einfach
den Proz sinnlose schifft Operationen ausführen zu lassen.

Das Register TIMSK. ist richtig gesetzt  auch laut Datenblatt  BIT 1 =
Compare  BIT 0 = Overflow.
Leider ist der mein Kommentar  im Source nicht so ganz stimmig  sonst
währe es einfacher gewesen den Code zu lesen

@ Alle
Mittlerweile habe ich das ganze irgendwie zum Ticken bekommen. Das
heißt der Source ist scheinbar doch IO. warscheinlich war das eine
Kombination von mehreren Porblemen, so dass ich nicht draufgekommen
bin. 1. falscher Interruptvector  2. bei erreichen des zählwertes
Rüpcksetzen des Timers (TCCR0 COM01 COM00 Clear on compare Match) ...
na ja und wenn man seinen ersten IRQ auf einem Atmel programmiert dann
ist man noch zusätzlich verunsichert.

Nochmals vielen Dank an alle

ich hätte noch eine Frage.  Gibt es einen Interruptvector der bei
vergleich mit dem OCR0 register   . TIMSK   BIT 1 =  Compare
angesprungen werden kann? wenn ich  SIGNAL(SIG_OVERFLOW0) als IRQ
Routine angebe gibt das einen reset (klar defaultvector... )

Zweitens wie kann man mehrere irq Routinen in ein c-file schreiben ?
wenn ich 2 mal SIGNAL(..) schreibe mault mein Compiler

Grüße

Tom

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"@ Anton:
Ja ich weis ich sollte mit die Flagnahmen und den  (1 << X )
Programmierstiel angewöhnen. Aber irgendwie widerstrebt es mir einfach
den Proz sinnlose schifft Operationen ausführen zu lassen."

Das ist ein Irrtum. Das wird vom Compiler beim Compilieren gemacht,
nicht zur Laufzeit vom Prozessor. Kostet dich keinen einzigen Takt
(wenn man davon absieht, dass das Compilieren Bruchteile von ms länger
dauert :-)

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom,
der ATmega muss keine sinnlosen shift Operationen bei (1<<X) machen,
wenn X eine feste Zahl ist. Das macht dein PC schon während des
compilierens. Danach steht im Assemblercode auch nur die daraus
resultierende Hex-Zahl drin.

SIGNAL(SIG_OUTPUT_COMPARE0) ist der Interrupthandler, der angesprungen
wird, wenn der Timer bis zum Wert von OCR0 gezählt hat. Sofern man das
Output Compare Zeugs eingestellt hat.

Ich habe das mit SIGNAL(SIG_INTERRUPT2) im gleichen File kombiniert.

Autor: Tom (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke nochmal für eure Hilfe.
den Vector "SIG_OUTPUT_COMPARE0" habe ich gestern komplett überlesen.

Jetzt funktioniert es so wie es soll.

Grüße

Tom

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.