Jump to content

L293D

Members
  • Content Count

    65
  • Joined

  • Last visited

  1. L293D

    __delay_cycles

    Very interesting. So the reason I asked this in the first place was because I would really like to use the SharpLCD library code with the StellarPad. It fails to compile because of the call to __delay_cycles. Should I just define it as a longer delay...like 1 us?
  2. L293D

    __delay_cycles

    Is there a work around for the StellarPad for the __delay_cycles macro? It is used extensively some of the library code for the MSP430, however I do not see a NOP, or __delay_cycles for the StellarPad. The best I could come up with would be to define __delay_cycles(x) as something like delayMicroseconds(x/80) Any help would be appreciated. L293D
  3. L293D

    New Energia release 0101E0011 - 12/17/2013

    Issue with Energia: When I try to compile anything I get this error message: C:\Temp\build409393309414726193.tmp\core.a, -LC:\Temp\build409393309414726193.tmp, -lm] c:/documents and settings/jerodaweaver/desktop/energia11/energia-0101e0011/hardware/tools/msp430/bin/../lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld.exe: cannot open linker script file memory.x: No such file or directory collect2: ld returned 1 exit status Where is the path to ld.exe stored? I checked in preferences.txt and didn't find it. Perhaps I am doing something wrong, however, I have ALL of the other energia builds in the same sort of structure (all extracted into their own folder on the desktop), and have never had any trouble. I am running it on XP SP3. Let me know if anyone else has any ideas here. (Also tried running as an Admin and it didn't make a difference.)
  4. L293D

    Auduino code

    Ok, so I have figured part of this out. Now the only thing I can't figure out is why analogRead doesn't work when I am using an interrupt (CCIE) on TA0. Is that because analogRead uses the same interrupt? If so, does that just mean that I need to setup the ADC manually instead of using analogRead?
  5. L293D

    Auduino code

    I am sure everybody has seen the Auduino code (Grain synth for arduino). I don't really understand the way that the PWM is setup, so I have no idea how to make this work on the MSP430 (or if it even can). Could someone explain how the timers are setup in this code? and the interrupt vector as well? I am just curious how one would setup the timer on one of the MSP430's? // Auduino, the Lo-Fi granular synthesiser // // by Peter Knight, Tinker.it http://tinker.it // // Help: http://code.google.com/p/tinkerit/wiki/Auduino // More help: http://groups.google.com/group/auduino // // Analog in 0: Grain 1 pitch // Analog in 1: Grain 2 decay // Analog in 2: Grain 1 decay // Analog in 3: Grain 2 pitch // Analog in 4: Grain repetition frequency // // Digital 3: Audio out (Digital 11 on ATmega8) // // Changelog: // 19 Nov 2008: Added support for ATmega8 boards // 21 Mar 2009: Added support for ATmega328 boards // 7 Apr 2009: Fixed interrupt vector for ATmega328 boards // 8 Apr 2009: Added support for ATmega1280 boards (Arduino Mega) #include <avr/io.h> #include <avr/interrupt.h> uint16_t syncPhaseAcc; uint16_t syncPhaseInc; uint16_t grainPhaseAcc; uint16_t grainPhaseInc; uint16_t grainAmp; uint8_t grainDecay; uint16_t grain2PhaseAcc; uint16_t grain2PhaseInc; uint16_t grain2Amp; uint8_t grain2Decay; // Map Analogue channels #define SYNC_CONTROL (4) #define GRAIN_FREQ_CONTROL (0) #define GRAIN_DECAY_CONTROL (2) #define GRAIN2_FREQ_CONTROL (3) #define GRAIN2_DECAY_CONTROL (1) // Changing these will also requires rewriting audioOn() #if defined(__AVR_ATmega8__) // // On old ATmega8 boards. // Output is on pin 11 // #define LED_PIN 13 #define LED_PORT PORTB #define LED_BIT 5 #define PWM_PIN 11 #define PWM_VALUE OCR2 #define PWM_INTERRUPT TIMER2_OVF_vect #elif defined(__AVR_ATmega1280__) // // On the Arduino Mega // Output is on pin 3 // #define LED_PIN 13 #define LED_PORT PORTB #define LED_BIT 7 #define PWM_PIN 3 #define PWM_VALUE OCR3C #define PWM_INTERRUPT TIMER3_OVF_vect #else // // For modern ATmega168 and ATmega328 boards // Output is on pin 3 // #define PWM_PIN 3 #define PWM_VALUE OCR2B #define LED_PIN 13 #define LED_PORT PORTB #define LED_BIT 5 #define PWM_INTERRUPT TIMER2_OVF_vect #endif // Smooth logarithmic mapping // uint16_t antilogTable[] = { 64830,64132,63441,62757,62081,61413,60751,60097,59449,58809,58176,57549,56929,56316,55709,55109, 54515,53928,53347,52773,52204,51642,51085,50535,49991,49452,48920,48393,47871,47356,46846,46341, 45842,45348,44859,44376,43898,43425,42958,42495,42037,41584,41136,40693,40255,39821,39392,38968, 38548,38133,37722,37316,36914,36516,36123,35734,35349,34968,34591,34219,33850,33486,33125,32768 }; uint16_t mapPhaseInc(uint16_t input) { return (antilogTable[input & 0x3f]) >> (input >> 6); } // Stepped chromatic mapping // uint16_t midiTable[] = { 17,18,19,20,22,23,24,26,27,29,31,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73, 77,82,86,92,97,103,109,115,122,129,137,145,154,163,173,183,194,206,218,231, 244,259,274,291,308,326,346,366,388,411,435,461,489,518,549,581,616,652,691, 732,776,822,871,923,978,1036,1097,1163,1232,1305,1383,1465,1552,1644,1742, 1845,1955,2071,2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143, 4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286,8779,9301,9854, 10440,11060,11718,12415,13153,13935,14764,15642,16572,17557,18601,19708,20879, 22121,23436,24830,26306 }; uint16_t mapMidi(uint16_t input) { return (midiTable[(1023-input) >> 3]); } // Stepped Pentatonic mapping // uint16_t pentatonicTable[54] = { 0,19,22,26,29,32,38,43,51,58,65,77,86,103,115,129,154,173,206,231,259,308,346, 411,461,518,616,691,822,923,1036,1232,1383,1644,1845,2071,2463,2765,3288, 3691,4143,4927,5530,6577,7382,8286,9854,11060,13153,14764,16572,19708,22121,26306 }; uint16_t mapPentatonic(uint16_t input) { uint8_t value = (1023-input) / (1024/53); return (pentatonicTable[value]); } void audioOn() { #if defined(__AVR_ATmega8__) // ATmega8 has different registers TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20); TIMSK = _BV(TOIE2); #elif defined(__AVR_ATmega1280__) TCCR3A = _BV(COM3C1) | _BV(WGM30); TCCR3B = _BV(CS30); TIMSK3 = _BV(TOIE3); #else // Set up PWM to 31.25kHz, phase accurate TCCR2A = _BV(COM2B1) | _BV(WGM20); TCCR2B = _BV(CS20); TIMSK2 = _BV(TOIE2); #endif } void setup() { pinMode(PWM_PIN,OUTPUT); audioOn(); pinMode(LED_PIN,OUTPUT); } void loop() { // The loop is pretty simple - it just updates the parameters for the oscillators. // // Avoid using any functions that make extensive use of interrupts, or turn interrupts off. // They will cause clicks and poops in the audio. // Smooth frequency mapping //syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4; // Stepped mapping to MIDI notes: C, Db, D, Eb, E, F... //syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL)); // Stepped pentatonic mapping: D, E, G, A, B syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL)); grainPhaseInc = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2; grainDecay = analogRead(GRAIN_DECAY_CONTROL) / 8; grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2; grain2Decay = analogRead(GRAIN2_DECAY_CONTROL) / 4; } SIGNAL(PWM_INTERRUPT) { uint8_t value; uint16_t output; syncPhaseAcc += syncPhaseInc; if (syncPhaseAcc < syncPhaseInc) { // Time to start the next grain grainPhaseAcc = 0; grainAmp = 0x7fff; grain2PhaseAcc = 0; grain2Amp = 0x7fff; LED_PORT ^= 1 << LED_BIT; // Faster than using digitalWrite } // Increment the phase of the grain oscillators grainPhaseAcc += grainPhaseInc; grain2PhaseAcc += grain2PhaseInc; // Convert phase into a triangle wave value = (grainPhaseAcc >> 7) & 0xff; if (grainPhaseAcc & 0x8000) value = ~value; // Multiply by current grain amplitude to get sample output = value * (grainAmp >> 8); // Repeat for second grain value = (grain2PhaseAcc >> 7) & 0xff; if (grain2PhaseAcc & 0x8000) value = ~value; output += value * (grain2Amp >> 8); // Make the grain amplitudes decay by a factor every sample (exponential decay) grainAmp -= (grainAmp >> 8) * grainDecay; grain2Amp -= (grain2Amp >> 8) * grain2Decay; // Scale output to the available range, clipping if necessary output >>= 9; if (output > 255) output = 255; // Output to PWM (this is faster than using analogWrite) PWM_VALUE = output; } So really I would just like someone to explain: // Set up PWM to 31.25kHz, phase accurate TCCR2A = _BV(COM2B1) | _BV(WGM20); TCCR2B = _BV(CS20); TIMSK2 = _BV(TOIE2); and these defines: #define PWM_PIN 3 #define PWM_VALUE OCR2B #define PWM_INTERRUPT TIMER2_OVF_vect and if there is a way to setup one of the timers on the 2452 or 2553 to accomplish the same thing. As always, thanks very much. L293D
  6. L293D

    MIDI Booster Pack

    Does the kit in the 43oh store come with the DAC? I don't see it in the picture (and in the build thread it says it is optional).
  7. L293D

    New MSP430F5529 USB Launchpad Released

    Ok, so I just ordered one, and it mentions that Energia is going to support this board. Is there anyone here who can confirm this? and Confirm when support will be available? L293D
  8. L293D

    Energia Support for 2955 and 2744?

    I guess that answers that. Thanks @@Rei Vilo
  9. Has there been anymore work done on adding support for the 2955 and 2744 to Energia? or did the issues with programming them put an end to development? Are there any plans to add Energia support for the Hercules launchpads just released? L293D
  10. L293D

    Stellaris Launchpad as a Programmer

    My question is similar, except it involves the hardware. If I want to build a PCB, and use the LM4F chip on the PCB, is there some place where I can easily see a basic circuit design? By that I mean, what needs to be pulled up, or down for the chip to run/reset...where I would need to put caps, etc. I know that is a pretty broad question, but what I want to know is...if I program one to for instance...blink an LED...other than VCC, GND, and I would assume RESET has to be pulled high or low (haven't check in the datasheet yet)...what else do I need to get it going? L293D
  11. @@spirilis and @@Rei Vilo - Thank you very much for all of your help. Everything is working now. I understand what I was doing wrong. I really appreaciate it. My hall effect sensors came today - I just hooked it up, put a magnet on a broken bit for my dremel, and started slow, and ended up fast...seemed to be pretty darn close on the RPM. I am very impressed. I think it will be able to handle the massive RPM on my bicycle wheels ;-) Thanks again! L293D
  12. I was almost sure that I already tried that...however, it was almost 1am when I was getting to that part...and I may have been a bit cloudy. I will try again and see what happens. Thanks @@spirilis L293D
  13. I absolutely understand that....so what I want...is to get the FLOAT output from the operation. So what am I doing wrong here? I need the decimal output to calculate the speed, etc.
  14. volatile byte revolutions; unsigned int rpmilli; float speed; long gTest; unsigned long timeold; void setup() { Serial.begin(9600); pinMode(PUSH2, INPUT_PULLUP); attachInterrupt(PUSH2, rpm_fun, FALLING); revolutions = 0; rpmilli = 0; timeold = 0; } void loop() { if (revolutions >= 5) { //Update RPM every 20 counts, increase this for better RPM resolution, //decrease for faster update // calculate the revolutions per milli(second) rpmilli = (revolutions/(millis()-timeold)); //** EDIT: it should be revolutions/(millis()-timeold) unsigned long test = millis()-timeold; gTest = 5/(timeold); // WHEELCIRC = 2 * PI * radius (in meters) // speed = rpmilli * WHEELCIRC * "milliseconds per hour" / "meters per kilometer" // simplify the equation to reduce the number of floating point operations // speed = rpmilli * WHEELCIRC * 3600000 / 1000 // speed = rpmilli * WHEELCIRC * 3600 // speed = rpmilli * 2.6958 * 3600; Serial.println(test,DEC); Serial.println(gTest,DEC); Serial.println(timeold); Serial.println(millis()); Serial.print("RPM:"); Serial.print(rpmilli * 60000,DEC); Serial.print(" Speed:"); Serial.print(speed,DEC); Serial.println(" kph"); Serial.println(""); timeold = millis(); revolutions = 0; gTest = 0; } } void rpm_fun() { revolutions++; } Ok, so I have been beating my head against a wall for hours on this. This line: gTest = 5/(timeold); Shows a 0 on the serial monitor everytime. Now I think I have tried just about every data type for gTest that I can think of and that doesn't seem to change anything. If I multiply instead of dividing the two values, it works just fine...however dividing doesn't work. Any ideas? Obviously, test and gTest are for testing. Using PUSH2 for the interrupt is just a test until my hall effect sensors get here (today). I am working on a computer for my bicycle and need to determine speed. Neither value is negative, nor are they 0, so is it some kind of overflow? If I have made some simple mistake, I would be glad to know what it is so that I don't do it again :-) L293D
×