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
> extern volatile unsigned char ADC_Results[8192];
8 KByte großes Array mit nur 2 KByte RAM dürfte etwas schwierig sein...
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.
Von TI gibt es C-Beispiele zur Verwendung des MSP Auf http://focus.ti.com/docs/prod/folders/print/msp430f149.html#top genauer http://www.ti.com/litv/zip/slac015k
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.