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
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?
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?
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.
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
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.
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
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.
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....
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
> 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.
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.