www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16C timerA0 mit Interrupt


Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend.

Versuche den TimerA0 zu initialisieren samt seines Interrupts, doch 
irgendwie sehe ich nicht das erwartete Resultat..

Vielleicht fällt einem etwas auf..
Vielleicht habe ich etwas vergessen oder falsch gemacht.

Hier ein Ausschnitt:



#include "sfr245.h"
#pragma INTERRUPT /B TimerA0int


void initPort( void);
void initTimerA0( void);
void setTimerA0int( void);
void startTimerA0( void);
void blink( void);
void TimerA0int( void);

int x = 0;



void main(void)
{
  initPort();
  initTimerA0();
  setTimerA0int();
  startTimerA0();

  while(1){ asm("NOP"); }
}

void initPort( void)
{
  pd7 = 0xff;    // outputs
  p7  = 0xff;    // aus
}
void initTimerA0( void)
{
  ta0mr = 0x80;
  ta0   = 0xFFFF;
}
void setTimerA0int( void)
{
  asm("fclr i");
  ta0ic = 0x07;
  ir_ta0ic = 0;      // Interrupt request flag clear.
  asm("fset i");
}
void startTimerA0( void)
{

//  tabsr |= 0x01;
  ta0s = 1;        // start timer

}
void TimerA0int( void)
{
...
}
}


Zusätzlich steht in der sect30.inc:

.
...
  .glb  _TimerA0int
  .lword  _TimerA0int    ; vector 21  (for user) timer A0
...
.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ta0s = 1;      /* start flag     */

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, steht ja doch schon da.

Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, nixe zu entschuldigen..

Danke fürs Lesen.

Apropos..
Habe gelesen, dass sich ein Timer nicht simulieren lässt. Zum Beispiel 
mit dem Simulator der in HEW integriert ist..
Ist da was wahres dran?
Leider bin ich noch zu frisch in der Materie um das "alles" überblicken 
zu können und habs deswegen auch nicht ausprobiert.

Vielleicht fällt anderen Lesern noch was auf.

Grüße

Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aaach. Immer diese Eile.

Vielleicht sollte ich noch hinzufügen, dass der µC mit 16MHz läuft.
Mit tamr0 = 0x80; sollte der Timer alle 2µs runterzählen.
Wenn er also ein "volles" 16bit register "runterzählt" von 0xFFFF auf 
0x0, dann müsste es doch ca. 131ms dauern..
Es dürfte wohl nicht an meiner Ungeduld liegen, dass sich nichts tut.. 
Oder?

Autor: Emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also bei mir (M16C24 aka M30245) ist der Timer A0 auf Vector 20.
Laut Handbuch ist das bei allen M16C/20/60/Tiny gleich.

Hier mein Code - allerdings für A2:
ta2mr   = 0x80;        // use divider f/32
i    = TIMER_TICK_uS(1000);  //get interrupt each ms
ta2    = i;
ta2ic   = TIMER_TA2_PRIO;    // Interrupt priority
cpsrf  = 0;
ta2s   = 1;        // Start Timer

Ansonsten sieht dein Code richtig aus. Einzige Möglichkeiten aus meiner 
Sicht:
1. Int Vector falsch
2. Interrupts disabled (prüf mal das I flag vor deinem "ta0s = 1")
3. definition der Funktionsregister (ta2, ta2ic...) falsch

Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wo Du es erwähnst..
Ich bin heut schon auf einen Code gestoßen indem tatsächlich der TimerA0 
Interrupt der Nummer 20 zugeordnet war..

Hmm. Ich muss das testen, danke erstmal.

Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Emil.

Es lag zwar gleichzeitig noch an etwas anderem, aber Du hattest auch 
Recht.

Was mich wundert ist folgendes: (dieses .if 0) Nachdem ich es gelöscht 
habe läuft es, natürlich in Verbindung mit der Korrektur auf Vector 20. 
(danke nochmal)

    .section  vector,ROMDATA
    .org    _VECTOR_ADR_




.if 0
    .lword  dummy_int    ; vector  0  BRK
    .lword  dummy_int    ; vector  1
    .lword  dummy_int    ; vector  2
..
..
..

.endif


Was sollte dieses .if 0 da? Habt Ihr ne Ahnung?

Guten Abend

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.glb    _uart1recint
.lword  _uart1recint  ; uart1 receive(for user)(vector 20)
.glb  _ta0int
.lword  _ta0int      ; TIMER A0 (for user)

hm, das hat funktioniert, muss also schon 21 sein

Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eigenartig..

So sieht es aus bei mir:

..
..
.lword  dummy_int    ; vector 18  (for user) uart0 receive;;
.lword  dummy_int    ; vector 19  (for user) uart1 transmit
.glb  _TimerA0int
.lword  _TimerA0int    ; vector 20  (for user) uart1 receive
.lword  dummy_int    ; vector 21  (for user) timer A0
.lword  dummy_int    ; vector 22  (for user) timer A1
..
..

Und so klappt es auch, der Interrupt löst aus.


Wenn ich es wie folgt ändere: (gehts nicht)
..
..
.lword  dummy_int    ; vector 18  (for user) uart0 receive;;
.lword  dummy_int    ; vector 19  (for user) uart1 transmit
.lword  dummy_int               ; vector 20  (for user) uart1 receive
.glb  _TimerA0int
.lword  _TimerA0int    ; vector 21  (for user) timer A0
.lword  dummy_int    ; vector 22  (for user) timer A1
..
..

Schaut Euch mal die Kommentare an. Da ist doch was nicht konsistent..
Ich bin verwirrt, das File hat doch HEW erzeugt.
Habe ich womöglich einen falschen µC angegeben?

Autor: luke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt mit Hilfe des Datenblattes für die M30245 Group verifizieren 
können, dass unter anderem folgende Beziehungen bestehen:


TimerA0    20
TimerA1    5
TimerA2    7
TimerA3    23
TimerA4    25

Nun wird auch klar wieso mein Debugger nicht funktioniert hat :)

Guten Abend.

Autor: ArthurDent (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo *,

Das /B in #pragma INTERRUPT /B TimerA0int schaltet auf den 2. 
Registersatz im Controller um. Ich hoffe Du hast in Deiner ISR daran 
gedacht, das wieder abzuschalten. Soweit ich weiss, macht der Compiler 
das naemlich nicht selbststaendig.

Autor: Walter Freywald (mrhanky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Verlassen der ISR wird unter anderem auch das Flag Register 
zurückgesichert. (Bit B wählt hier Bank0 oder 1 aus). Dadurch wird 
automatisch auf die vorherige (normalerweise Bank0) zurückgeschaltet.

Gruß,
Walter.

Autor: ArthurDent (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Walter Freywald

Jau, das habe ich jetzt auch kapiert :-)

So genau hatte ich mich mit dem REIT Befehl noch nicht 
auseinandergesetzt.

Danke !

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.