mikrocontroller.net

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


Autor: Mathias U. (munter)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
Error[e124]: Segment conflict for segment INTVEC. In module "RTC_TA" there is a segment part that is of type RELOCATABLE,
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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathias U. (munter)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Supa Micha (supa_micha)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias U. (munter)
Datum:

Bewertung
0 lesenswert
nicht 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.
// ************************************************************************************************
// timer A einstellen
// ************************************************************************************************
  CCTL0 = CCIE;                                     // CCR0 interrupt enabled
  CCR0  = ZEITBASIS;                  // Wert in owndef, Zähl-Zeit bis Interrupt
  TACTL = TASSEL0 + MC0;                            // ACLK, upmode
  _EINT();
....geändert in:
// ************************************************************************************************
// timer A einstellen
// ************************************************************************************************
  TBCCTL0 = CCIE;                                     // CCR0 interrupt enabled
  TBCCR0  = ZEITBASIS;                  // Wert in owndef, Zähl-Zeit bis Interrupt
  TBCTL = TBSSEL0 + MC0;                            // ACLK, upmode
  _EINT();
...und die ISR von
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
//  #define ZEITBASIS (32768/8)
//  --> steht in owndef.h drin!
//  --> alle 125ms ein tick 
  if (Tick == (32768 / ZEITBASIS)) Tick = 0;        // timer zurücksetzen
  else Tick++;
}
...abgeändert in
// Timer A0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
//  #define ZEITBASIS (32768/8)
//  --> steht in owndef.h drin!
//  --> alle 125ms ein tick 
  if (Tick == (32768 / ZEITBASIS)) Tick = 0;        // timer zurücksetzen
  else Tick++;
}
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...

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias U. (munter)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In RTC_DT.s43 die Zeile:
'RSEG INTVEC'
ersetzen durch:
'COMMON INTVEC'

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

Autor: Mathias U. (munter)
Datum:

Bewertung
0 lesenswert
nicht 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! ;-)

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.