mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Taktdiagramm


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

Bewertung
0 lesenswert
nicht lesenswert
MSP430F149 / IAR


Der MSP soll Daten aus einem externen 16 bit ADC Daten auslesen. Das
möchte ich mit eigentlich mit zwei Timern machen. Dazu muss ich das 
Taktdiaramm umsetzten.



Das Teilprogramm #pragma erzeugt zwar den Takt am Ausgang. Sofern
ich irgendwas dazu basteln will, bricht der ganze Takt zusammen.
Werdend des Taktes soll auch der Chip Select des ADC ausgeben
werden, Werte einlesen und im Flash speichern werden. Sowie ich es
vorhabe funktioniert es nicht. Hat jemand einen Rat? Wie man das am
Besten umsetzten kann?

Danke und Gruß

Rico

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie passt der Anhang nicht zu Deinem Text...

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll extern ein serieller (SPI oder IIC?) ADC angeschlossen werden, oder 
ein paralleler? Mit welcher Geschwindigkeit? FLASH ist ziemlich langsam, 
das weißt du, ja?

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut erkannt, mein Code hat nicht viel mit dem Problem zu tun welches
ich beschrieb.

Danke für die Anregung der ADC verfügt über eine SPI Schnittstelle.
Die Übertragungsrate der Werte sollen zwischen 3k und 5k liegen. Ob
er der MSP das schafft, weiß ich nicht. Die Datenerfassung beträgt
40ms, also liegt die Anzahl der erfassten Werte bei 120-200 16bit-
Datenwörtern.

Eine kleine Frage neben bei. Für was steht die Abkürzung MSP430?

Autor: Christian R. (supachris)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Na mit SPI ist das doch viel einfacher, da kannst du doch den 
integrierten USART nehmen. Ich häng mal ein Programm an, was einen 
LTC1864L an USART1 ansteuert und die 16 Bit Werte ausliest. Als 
Taktquelle dient TimerB, bei mir auf 1KHz eingestellt. Musst du halt 
entsprechend anpassen. Wie das geht, steht in den C-Demos von TI.
Gestartet wird das Ganze, indem zu den TimerB Interrupt freigibst.

MSP: Mixed Signal Processor

Der MSP schafft an der SPI Schnittstelle die halbe Taktfrequenz des 
SMCLK als SPI-Takt und somit Bitrate.

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Code, dieser führt mich auf ganz neue Wege. Aber einige
Dinge verstehe ich nicht so recht. Und zwar handelt es sich um die
Präprozessoren:

-#ifdef
-#pragma
-#else
-#endif.

Was machen diese? Und wo kann man diese und die Funktionsweise der
ISR vielleicht mit C-Beispielen nachlesen?


Gruß

Rico

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Präprozessoranweisungen machen den Code kompatibel sowohl zum IAR 
als auch zum GCC Compiler. Die Funktionsweise der ISR sollte klat sein, 
wenn man C kann. Die C-Demos gibts auf der TI Homepage.

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe versucht, dass Programm zum laufen zu bringen, leider ist
mir das nicht gelungen. Und es sind weitere Fragen aufgetaucht. Ich
hoffe, dass du mir weiterhelfen kannst. Ich benutze ein ADS8321 und
müsste  dem LTC1864L ähnlich sein. Den Takt für den ADC erzeuge ich
aus einen externen 7,3728 MHz Quarz.

Interrupts sind mir soweit klar, aber ich weiß nicht, was du mit
freigeben meinst. Sonst habe ich immer die Interrupts aktiviert (Mir
scheint es, dass beides das Selbe ist freigeben= aktivieren). Mit
TBCCTL0= CCIE und _BIS_SR(GIE);
aktivierte ich diese sonst.
Ich stelle mich gerade mit den Interrupts ein wenig an, da ich das auch
noch nicht wirklich gerafft habe. Wie ich diese richtig benutzen
kann. Wenn du darüber noch ein paar Zeilen schreiben könntest, wäre
ich sicherlich schneller in der Materie. Ich schreibe mal in den
C-Code, wann ich meine, dass das Programm einen Interrupt aufruft,
vielleicht ist ja da der Fehler zu finden.

An der Stelle
  extern volatile unsigned char ADC_Results[8192];
tritt ein Fehler auf und zwar ist die Datengröße zu lang. Wodurch
kommt das und wie kann man die Datengröße erweitern?

Danke für die Hilfe

R

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

Bewertung
0 lesenswert
nicht lesenswert
Die Datei!

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> extern volatile unsigned char ADC_Results[8192];

8 KByte großes Array mit nur 2 KByte RAM dürfte etwas schwierig sein...

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal eine Endlosschleife ans Ende Deiner main Funktion.

z. B. for(;;);


Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein 8k Array geht natürlich nur auf dem F1611, wie ich ihn verwende.

Ansonsten wird deine ISR höchstens einmal ausgeführt und dann nie 
wieder.

Du solltest eine Schleife ans Ende von Main stellen, in der der Int 
immer wieder aktiviert wird.

Mein Programm arbeitet so: Nach erstmaligem Aktivieren des Timer B 
Interrupts zählt der bis 4096, was bei meinem 4.096MHz Takt aus dem DCO 
1ms ergibt. Dann stimmt der Wert im Timer B CCR0 Register mit dem Timer 
B Register überein, und der Int wird ausgelöst. Sind noch nicht alle 
angeforerten Daten gesampelt, wird der Wert im TBCCR0 um 4096 erhöht, um 
das nächste mal bei 8192 wieder einen Int zu haben. Ich gebe zu, diese 
Sache jittert dann eventuell etwas, weil ja erst mal ein paar Takte 
vergehn, bis die ISR angesprungen wird, und der neue Wert ins TBCCR0 
geschrieben werden kann. Verbessere ich bei Problemen eventuell noch.

In der ISR werden 2 Dummy-Bytes an die SPI geschickt, und nach 
Beendigung des Empfanges jeweils ein Byte aus dem RXBUF1 ausgelesen. Die 
Bytes zusammen ergeben den 16 Bit Wert der letzten ADC-Messung. 
Entsprechend Datenblatt wird das CS Signal generiert. Die Nops 
garantieren, dass das CS wirklich länger Low ist, als der SPI Clock 
anliegt. Ohne die nops geht das vorher auf High wieder.

Mehr ist es nicht. Wenn alle Samples gemacht sind, wird der Interrupt 
wieder deaktiviert. Fertig.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochwas. Die USART1 Receive ISR muss raus, da der Empfang im Polling in 
der Timer B ISR gemacht wird. Die war in meinem Programm ja nicht 
umsonst auskommentiert.

Übrigens erzeigt dein Timer B einen Interrupt mit 134Khz.... (7,bla MHz 
durch 55) Ist das gewollt? Kann der überhaupt die komplette ISR 
ausführen, bis der nächste Interrupt kommt? Paar Takte sind das 
schon....

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die ganzen Antworten.

Wenn ich mehr Speicher benötige als die 2 KB Ram, kann ich dann noch
auf den Flash was speichern? Oder sollten die zwei kB ausreichen?

Den Timer lasse ich erstmal 1 ms warten (also zählt er bis 7372).

Wozu ist das Senden der beiden Bytes (0x00)gut? Und wohin wird es
gesendet, da am Pin slave in und master out (SIMO) nichts angelötet
wurde.

Eine Frage habe ich auch nur zu dem Transmit Control Register und
zwar ist SSEL auf 1 gestellt und damit ist der SMCLK die Quelle für
den Übertragungstakt (SPI). Wenn diese durch den ACLK ersetzt wird,
wird die ISR nicht ausgefüht. Woran kann das liegen?

Die Schleife am Ende der Main habe ich gesetzt. Jetzt hängt aber das
Programm an der Stelle wo der TX Buffer das erste Mal abgefragt
wird, ob er bereit wäre. Der Compiler schreibt, das der Stack zu 100
Prozent voll wäre und der Pointer ist außerhalb des Stacks.
Sicherlich lädt das Programm die Daten in den Stack und irgendwann
ist TX-Buffer nicht mehr sendebereit.


Rico

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich mehr Speicher benötige als die 2 KB Ram, kann ich dann noch
> auf den Flash was speichern? Oder sollten die zwei kB ausreichen?

Du kannst sicherlich Daten ins Flash speichern (wenn Dein Programm im 
RAM ausgeführt wird). Aber dazu benötigst Du Flash-Schreib-Routinen. 
Eine einfache Zuweisung genügt nicht.

> Wozu ist das Senden der beiden Bytes (0x00)gut?

Schau Dir mal ein paar Grundlagen von SPI an z. B.
http://www.mct.de/faq/spi.html

Lesen und Schreiben erfolgt bei SPI immer gleichzeitig. D. h. wenn der 
Master Daten empfangen will muß er einen DatenTransfer anstoßen. Dazu 
schreibt er ein Dummy-Byte in das TX Register und hat anschließend im RX 
Register den Wert den der Slave ausgibt.


Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von TI gibt es C-Beispiele zur Verwendung des MSP

Auf

http://focus.ti.com/docs/prod/folders/print/msp430...

genauer
http://www.ti.com/litv/zip/slac015k

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Datenblätter und Tutorials habe ich schon, zeitweise finde ich
diese ziemlich undurchsichtig und ab und zu auch verwirrend, da mir
einfach die Routine fehlt und das nötige Grundwissen, dass alles zu
Verstehen.

Aber trotzdem 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.