Print und SPI auf Arduino Uno?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Print und SPI auf Arduino Uno?

      Hallo,
      ich habe dieses Programm, das ein LDC1000 auslesen soll. Ein entsprechendes Arduino-Programm tut es, aber Bascom printet gar nichts (über USB).
      Ein Print-Test ohne SPI funktioniert allerdings. Woran mag es liegen?

      Quellcode

      1. 'http://electronics598.rssing.com/browser.php?indx=8435866&item=2974
      2. $regfile = "m328def.dat"
      3. $crystal = 16000000
      4. $baud = 9800
      5. '$baud1 = 115200
      6. 'Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      7. Enable Interrupts
      8. Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 16 , Noss = 1
      9. Spiinit
      10. Config Pinb.2 = Output 'manually control ss pin
      11. Ss Alias Portb.2
      12. Set Ss
      13. Dim Prox(2) As Byte 'data read in
      14. Dim Plsb As Byte 'Proximity LSB Address
      15. Dim Pmsb As Byte 'Proximity MSB Address
      16. Plsb = &HA1 '&h21 plus MSb = 1 for read
      17. Pmsb = &HA2 '&h22 plus MSb = 1 for read
      18. Dim Proximity As Word 'combined proximity data
      19. Reset Ss
      20. Spiout Plsb , 1
      21. Spiin Prox(1) , 1
      22. Set Ss
      23. Reset Ss
      24. Spiout Pmsb , 1
      25. Spiin Prox(2) , 1
      26. Set Ss
      27. Proximity = Makeint(prox(1) , Prox(2))
      28. Print Proximity
      29. End
      Alles anzeigen
    • 9800 stand in einem Beispiel ohne SPI wo print funktionniert.
      Hab auch 9600 ausprobiert.
      Aber sowas hätte doch schon mal irgendjemandem auffallen müssen. Komisch.
      Hier der funktionierende Arduino-Code (mit Setzen der Default-Register).
      Hm, vielleicht kommt im Bascom-Programm irgendwie nichts zurück vom LDC1000.

      Quellcode

      1. /*
      2. Author: Pelonomi Moiloa
      3. 24 June 2014
      4. */
      5. #include "SPI.h" // include arduino SPI library
      6. const int CSB = 10; // chip select bit for Arduino Uno
      7. void setup()
      8. {
      9. unsigned int data = 0;
      10. Serial.begin(115200);
      11. // start SPI library/ activate BUS
      12. SPI.begin();
      13. pinMode(CSB, OUTPUT);
      14. SPI.setBitOrder(MSBFIRST);
      15. SPI.setDataMode(SPI_MODE0); // CPOL = 0 and CPH = 0 mode 3 also works
      16. SPI.setClockDivider(SPI_CLOCK_DIV4); // set SCLK @ 4MHz, LDC1000 max is 4MHz DIV2 also works
      17. // set power mode to idle to configure stuff
      18. digitalWrite(CSB, LOW);
      19. SPI.transfer(0x0B);
      20. SPI.transfer(0x00);
      21. digitalWrite(CSB, HIGH);
      22. delay(100);
      23. // Set RpMax
      24. digitalWrite(CSB, LOW);
      25. SPI.transfer(0x01);
      26. SPI.transfer(0x0E);
      27. digitalWrite(CSB, HIGH);
      28. delay(100);
      29. // Set RpMin
      30. digitalWrite(CSB, LOW);
      31. SPI.transfer(0x02);
      32. SPI.transfer(0x3B);
      33. digitalWrite(CSB, HIGH);
      34. delay(100);
      35. // Set Sensor frequency
      36. digitalWrite(CSB, LOW);
      37. SPI.transfer(0x03);
      38. SPI.transfer(0x94);
      39. digitalWrite(CSB, HIGH);
      40. delay(100);
      41. // Set LDC configurationn
      42. digitalWrite(CSB, LOW);
      43. SPI.transfer(0x04);
      44. SPI.transfer(0x17);
      45. digitalWrite(CSB, HIGH);
      46. delay(100);
      47. // Set clock configuration
      48. digitalWrite(CSB, LOW);
      49. SPI.transfer(0x05);
      50. SPI.transfer(0x00);
      51. digitalWrite(CSB, HIGH);
      52. delay(100);
      53. // disable all interrupt modes
      54. digitalWrite(CSB, LOW);
      55. SPI.transfer(0x0A);
      56. SPI.transfer(0x00);
      57. digitalWrite(CSB, HIGH);
      58. // set thresh HiLSB value
      59. digitalWrite(CSB, LOW);
      60. SPI.transfer(0x06);
      61. SPI.transfer(0x50);
      62. digitalWrite(CSB, HIGH);
      63. delay(100);
      64. // set thresh HiMSB value
      65. digitalWrite(CSB, LOW);
      66. SPI.transfer(0x07);
      67. SPI.transfer(0x14);
      68. digitalWrite(CSB, HIGH);
      69. delay(100);
      70. // set thresh LoLSB value
      71. digitalWrite(CSB, LOW);
      72. SPI.transfer(0x08);
      73. SPI.transfer(0xC0);
      74. digitalWrite(CSB, HIGH);
      75. delay(100);
      76. // set thresh LoMSB value
      77. digitalWrite(CSB, LOW);
      78. SPI.transfer(0x09);
      79. SPI.transfer(0x12);
      80. digitalWrite(CSB, HIGH);
      81. delay(100);
      82. // set power mode to active mode
      83. digitalWrite(CSB, LOW);
      84. SPI.transfer(0x0B);
      85. SPI.transfer(0x01);
      86. digitalWrite(CSB, HIGH);
      87. delay(100);
      88. /*
      89. // Read Rpmax
      90. digitalWrite(CSB, LOW);
      91. SPI.transfer(0x81);
      92. data = SPI.transfer(0x00);
      93. Serial.println(data);
      94. digitalWrite(CSB, HIGH);
      95. delay(200);
      96. // Read Rpmin
      97. digitalWrite(CSB, LOW);
      98. SPI.transfer(0x82);
      99. data = SPI.transfer(0x00);
      100. Serial.println(data);
      101. digitalWrite(CSB, HIGH);
      102. delay(200);
      103. // Read thresh HiLSB value
      104. digitalWrite(CSB, LOW);
      105. SPI.transfer(0x86);
      106. data = SPI.transfer(0x00);
      107. Serial.println(data);
      108. digitalWrite(CSB, HIGH);
      109. delay(200);
      110. // Read thresh HiMSB value
      111. digitalWrite(CSB, LOW);
      112. SPI.transfer(0x87);
      113. data = SPI.transfer(0x00);
      114. Serial.println(data);
      115. digitalWrite(CSB, HIGH);
      116. delay(200);
      117. // Read thresh LoLSB value
      118. digitalWrite(CSB, LOW);
      119. SPI.transfer(0x88);
      120. data = SPI.transfer(0x00);
      121. Serial.println(data);
      122. digitalWrite(CSB, HIGH);
      123. delay(200);
      124. // Read thresh LoMSB value
      125. digitalWrite(CSB, LOW);
      126. SPI.transfer(0x89);
      127. data = SPI.transfer(0x00);
      128. Serial.println(data);
      129. digitalWrite(CSB, HIGH);
      130. delay(200);
      131. */
      132. }
      133. void loop()
      134. {
      135. unsigned int val = 0;
      136. unsigned int dataLSB = 0;
      137. unsigned int dataMSB = 0;
      138. unsigned int datafLSB = 0;
      139. unsigned int dataMidB = 0;
      140. unsigned int datafMSB = 0;
      141. unsigned int proximityData = 0;
      142. unsigned long frequencyData = 0; //long to store 24bit long number
      143. byte zeros = 0b00000000;
      144. // Read proximity data LSB register
      145. digitalWrite(CSB, LOW);
      146. SPI.transfer(0xA1);
      147. dataLSB = SPI.transfer(0x00);
      148. //Serial.println(dataLSB);
      149. digitalWrite(CSB, HIGH);
      150. delay(100);
      151. // Read proximity data MSB register
      152. digitalWrite(CSB, LOW);
      153. SPI.transfer(0xA2);
      154. dataMSB = SPI.transfer(0x00);
      155. //Serial.println(dataMSB);
      156. digitalWrite(CSB, HIGH);
      157. delay(100);
      158. // Read frequency data LSB register
      159. digitalWrite(CSB, LOW);
      160. SPI.transfer(0xa3);
      161. datafLSB = SPI.transfer(0x00);
      162. digitalWrite(CSB, HIGH);
      163. delay(10);
      164. // Read frequency data MidB register
      165. digitalWrite(CSB, LOW);
      166. SPI.transfer(0xa4);
      167. dataMidB = SPI.transfer(0x00);
      168. digitalWrite(CSB, HIGH);
      169. delay(10);
      170. // Read frequency data MSB register
      171. digitalWrite(CSB, LOW);
      172. SPI.transfer(0xa5);
      173. datafMSB = SPI.transfer(0x00);
      174. digitalWrite(CSB, HIGH);
      175. delay(10);
      176. proximityData = ((unsigned int)dataMSB << 8) | (dataLSB);
      177. Serial.println(proximityData);//Serial.print(" ");
      178. frequencyData = (zeros << 8)|(datafMSB);
      179. frequencyData = (frequencyData << 8) | (dataMidB);
      180. frequencyData = (frequencyData << 8)| (datafLSB);
      181. // Serial.println(frequencyData);
      182. //Serial.println(datafLSB);
      183. //Serial.println(dataMidB);
      184. //Serial.println(datafMSB);
      185. }
      Alles anzeigen
    • So geht's:
      Config SPI mußte angepasst werden und eine Loop zum Auslesen eingefügt.
      Damit sinnvolle Werte aus dem LDC rauskommen, müssen nach einem Ausstöpseln (also abschalten) des LDC seine Registerwerte neu gesetzt werden.
      Habe das zunächst mit dem Arduino-Programm gemacht.

      Quellcode

      1. 'http://electronics598.rssing.com/browser.php?indx=8435866&item=2974
      2. $regfile = "m328pdef.dat"
      3. $crystal = 16000000
      4. '$baud = 9800
      5. '$baud1 = 115200
      6. 'Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      7. Enable Interrupts
      8. Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
      9. Spiinit
      10. Config Pinb.2 = Output 'manually control ss pin
      11. Ss Alias Portb.2
      12. 'Set Ss
      13. Dim Prox(2) As Byte 'data read in
      14. Dim Plsb As Byte 'Proximity LSB Address
      15. Dim Pmsb As Byte 'Proximity MSB Address
      16. Plsb = &HA1 '&h21 plus MSb = 1 for read
      17. Pmsb = &HA2 '&h22 plus MSb = 1 for read
      18. Dim Proximity As Word 'combined proximity data
      19. Do
      20. Reset Ss
      21. Spiout Plsb , 1
      22. Spiin Prox(1) , 1
      23. Set Ss
      24. Reset Ss
      25. Spiout Pmsb , 1
      26. Spiin Prox(2) , 1
      27. Set Ss
      28. Proximity = Makeint(prox(1) , Prox(2))
      29. Print Proximity
      30. Loop
      31. End
      Alles anzeigen