Forum: Mikrocontroller und Digitale Elektronik MSP430 Uhrzeit & ADC12 & Interrupt


von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hallo folgendes Problem beschäftigt mich derzeit:

MSP430F1612
IAR 3.21A
Sprache: C

Ich habe eine Uhrzeit mittels der Bibliotheken von TI am laufen.
Ich nehme dazu den TimerA (TA).

Das geht auch schon eine ganze Weile ganz gut...
Inzwischen habe ich mein Projekt mit nem ADC12 erweitert...allerdings 
habe ich dazu, um die Sache übersichtlicher zu machen, die Uhrzeit und 
den restlichen Kram, den ich noch mache weggelassen.
Es sind also alles Einzel-Projekte...

Jetzt wollte ich die Uhrzeit und die AD-Wandlung zusammenführen.

Ich bekomme wahrscheinlich einen Konflikt mit den Timern, aber ich weiß 
es halt nicht genau...

Ich habe einfach mal meine Code inkl. der RTC_TA.h und RTC_TA.s43 mit 
angehangen.

Der Fehler, der beim Compilieren auftritt ist folgender:
1
Error[e124]: Segment conflict for segment INTVEC. In module "RTC_TA" there is a segment part that is of type RELOCATABLE,
2
while in module "main" there is a segment part that is of type COMMON
Ich meine, Übersetzen kann ich die Sache schon, aber DEUTEN, da hakt es 
gewaltig.

Ich habe auch schon versucht, die Uhrzeit mittels des Basic Timers BT zu 
machen, aber es tritt der gleiche Fehler auf...

Ich möchte mit dem ADC12 alle 125 eine Messung auslösen...so steht es in 
der main() in der Interrupt-Routine ganz unten...
Die Interrupt-Routine für die Uhrzeit (steht in RTC_TA.s43 drin) macht 
aber alle Sekunde einen Interrupt...um halt immer sie Sekunden zu 
erhöhen...

Es wäre Super, wenn sich jemand mal die Sache ansehen könnte.
Wenn mir dann noch jemand meine(n) Denkfehler erklären könnte, dann wäre 
das grandios! ;-)

danke

von Uhu U. (uhu)


Lesenswert?

Ich hab mir deinen Code nicht angesehen - verwende kein .rar auf meinem 
System - aber die Ursache ist mit an Sicherheit grenzender 
Wahrscheinlichkeit, daß du in zwei deiner Module jeweils statisch die 
Interruptvektoren initialisierst.

Das kann man nur einmal machen.

von Mathias U. (munter)


Angehängte Dateien:

Lesenswert?

Hmm...wäre schön, wenn Du trotzdem mal draufschauen würdest.
Hab mal nen *.tar.gz gemacht...hoffe, dass Du auf Deinem System dieses 
Archiv verwendest ;-)

danke

von Supa M. (supa_micha)


Lesenswert?

Der Fehler ist, wie schon gesagt, dass du zweimal eine TimerA Interrupt 
Service Routine definierst. Du müsstest also diese beiden Routinen 
zusammenlegen.

Dazu löst du alle 125 ms einen TimerA Interrupt aus, startest jeweils 
eine  AD-Wandlung und verwendest diese Zeit auch als Referenzzeit für 
deine Uhr. Irgendwo musst du halt nur mal acht nehmen, dass die Uhr auch 
wieder richtig geht :-)

Viele Grüße
Michael

von Mathias U. (munter)


Lesenswert?

Danke erstmal.

Beide ISR in eine zu packen und die Zeit dann aus den 125ms zu holen ist 
etwas unschön, oder?

Kann ich nicht die ISR von der RTC_TA.s43 so lassen, und für die 
AD-Wandlung den TimerB nehmen?

Ich habe schon folgendes versucht, aber ohne Erfolg. Der Fehler tritt 
immer noch auf.
1
// ************************************************************************************************
2
// timer A einstellen
3
// ************************************************************************************************
4
  CCTL0 = CCIE;                                     // CCR0 interrupt enabled
5
  CCR0  = ZEITBASIS;                  // Wert in owndef, Zähl-Zeit bis Interrupt
6
  TACTL = TASSEL0 + MC0;                            // ACLK, upmode
7
  _EINT();
....geändert in:
1
// ************************************************************************************************
2
// timer A einstellen
3
// ************************************************************************************************
4
  TBCCTL0 = CCIE;                                     // CCR0 interrupt enabled
5
  TBCCR0  = ZEITBASIS;                  // Wert in owndef, Zähl-Zeit bis Interrupt
6
  TBCTL = TBSSEL0 + MC0;                            // ACLK, upmode
7
  _EINT();
...und die ISR von
1
// Timer A0 interrupt service routine
2
#pragma vector=TIMERA0_VECTOR
3
__interrupt void Timer_A (void)
4
{
5
//  #define ZEITBASIS (32768/8)
6
//  --> steht in owndef.h drin!
7
//  --> alle 125ms ein tick 
8
  if (Tick == (32768 / ZEITBASIS)) Tick = 0;        // timer zurücksetzen
9
  else Tick++;
10
}
...abgeändert in
1
// Timer A0 interrupt service routine
2
#pragma vector=TIMERB0_VECTOR
3
__interrupt void Timer_B (void)
4
{
5
//  #define ZEITBASIS (32768/8)
6
//  --> steht in owndef.h drin!
7
//  --> alle 125ms ein tick 
8
  if (Tick == (32768 / ZEITBASIS)) Tick = 0;        // timer zurücksetzen
9
  else Tick++;
10
}
Was mache ich denn falsch?
danke

*edit: ach ja, mitAssambler kenn ich mich gar nicht aus, es wird also 
schwierig die ISR vom TI-Beispiel zu bearbeiten...

von Jörg S. (Gast)


Lesenswert?

Mein Vorschlag:
Den ganzen Krimskrams wegschmeissen. Mit den 32kHz den Watchdogtimer 
befeuern und in dessen ISR die Sekunden zählen und AD-Wandeln. Zum 
Watchdog als Standardtimer sollte es auch einige Beispiele bei TI geben

von Mathias U. (munter)


Lesenswert?

...Dann müsste ich aber auch die ISR, die bei der RTC_DT.s43 dabei ist, 
abändern, oder komplett neuschreiben...
Also abändern in Assambler geht schonmal nicht, weil siehe oben...

Warum geht denn meine Sache mit dem TimerB nicht? Das müsste doch auch 
funktionieren.

Kann mir mal bitte einer etwas ausführlicher erklären, was ich machen 
muss, um einerseits die Uhrzeit zu haben, und zweitens alle 125ms nen 
"tick" auszulösen, damit ich dann AD-Wandeln kann.
danke

von Stefan (Gast)


Lesenswert?

In RTC_DT.s43 die Zeile:
'RSEG INTVEC'
ersetzen durch:
'COMMON INTVEC'

Interruptvektoren sind nicht relocatable, sondern stehen immer an einer 
festen Adresse.

von Mathias U. (munter)


Lesenswert?

Cool, damit geht es erstmal...mal sehen, ob es morgen auch noch geht, 
wenn ich wirklich ad-wandeln tue...
Wenn nicht, dann melde mich ich mich nochmal! ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.