MSP430 Uhrzeit & ADC12 & Interrupt

OP #690450
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
Angehängte Dateien:
#690466
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.
#690554
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
OP #690563
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...
Gast #690583
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
OP #690622
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren