int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer if (CALBC1_16MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_16MHZ; // Set range DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation*/ //configure ACLK to use clock crystal //DIVA is the ACLK divider. //When DIVA0 and DIVA1 Bits are zero, ACLK is divided //by 1 BCSCTL1 &= ~(DIVA0 | DIVA1); //No touch, BCSTL2, only handles SMCLK and MCLK //clear the Low Freq XTal 1 sel bits 0 and 1 to select //32768Hz clk for LFXT1 oscillator //This also routes LFXT1 into ACLK. if LFXT1Sx = 10, ACLK uses VLOCLK instead BCSCTL3 &= ~(LFXT1S0 | LFXT1S1); //set XCAP to 11 to select a 12.5pF crystal capacitance BCSCTL3 |= XCAP1 | XCAP0; BUTTONS_INIT: //configure P1.3 to switch on falling edge interrupts //force the pin to use the typical GPIO P1SEL &= ~(FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON); P1SEL2 &= ~(FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON); //select HIGH to LOW transition P1IES |= FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON; P1IE |= FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON; P1IFG &= ~(FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON); P1DIR &= ~(FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON); P1REN |= FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON; lcd_init(); display_reset(); //FUNCTION_GENERATOR_INIT: fg_init(); //why not, just go back to home clear everything again P1IFG |= FREQ_SEL_BUTTON; _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt }
void display_init(u08 clock_div) { // LED/RESET are output, CLK+MOSI DDRB |= _BV(LED_PIN) | _BV(RST_PIN) | _BV(CLK_PIN) | _BV(MOSI_PIN); // MISO is input DDRB &= ~_BV(MISO_PIN); // LED=HI, MISO=Pullop PORTB |= _BV(LED_PIN) | _BV(MISO_PIN); PORTB &= ~(_BV(RST_PIN) | _BV(CLK_PIN)); // CS is output and HI DDRD |= _BV(CS_PIN); PORTD |= _BV(CS_PIN); // make sure SS_PIN is pull up if(!(DDRB & (1<<SS_PIN))) //SS is input { PORTB |= (1<<SS_PIN); //pull-up on } //init hardware spi switch(clock_div) { case 2: SPCR = (1<<SPE)|(1<<MSTR); //enable SPI, Master, clk=Fcpu/4 SPSR = (1<<SPI2X); //clk*2 = Fcpu/2 break; case 4: SPCR = (1<<SPE)|(1<<MSTR); //enable SPI, Master, clk=Fcpu/4 SPSR = (0<<SPI2X); //clk*2 = off break; case 8: SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //enable SPI, Master, clk=Fcpu/16 SPSR = (1<<SPI2X); //clk*2 = Fcpu/8 break; case 16: SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //enable SPI, Master, clk=Fcpu/16 SPSR = (0<<SPI2X); //clk*2 = off break; case 32: SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1); //enable SPI, Master, clk=Fcpu/64 SPSR = (1<<SPI2X); //clk*2 = Fcpu/32 break; } display_reset(); }
__interrupt void read_buttons(void) { if(!debounce()) return; //wave state can be 0, 1, 2 // 0 is SINE // 1 is SAW TOOTH // 2 is SQUARE static u8 wave_type = 1; //frequency can be 1, 2, 3, 4, 5 //1 100Hz //2 200Hz //3 300Hz //4 400Hz //5 500Hz static u8 frequency = 1; //duty cycle can be 1, 2, 3, 4, 5, 6, 7, 8, 9 //for 10, 20, 30, 40, 50.. % duty cycle static u8 duty_cycle = 10; u8 flags = P1IFG & (FREQ_SEL_BUTTON | WAVE_SEL_BUTTON | DUTY_SEL_BUTTON); display_reset(); switch(flags) { case WAVE_SEL_BUTTON: LCD_FIRST_LINE(); lcd_print("Set Wave Type"); if (wave_type >= 3) wave_type = 1; else wave_type++; LCD_SECOND_LINE(); switch(wave_type) { case 1: lcd_print("Square"); break; case 2: lcd_print("Tri"); break; case 3: lcd_print("Sine"); break; } fg_change_waveform(wave_type); P1IFG &= ~WAVE_SEL_BUTTON; break; case FREQ_SEL_BUTTON: LCD_FIRST_LINE(); if (frequency >= 5) { frequency = 1; } else {frequency ++; } lcd_print("Freq:"); LCD_SECOND_LINE(); print_frequency(frequency); fg_change_frequency(frequency); P1IFG &= ~FREQ_SEL_BUTTON; break; case DUTY_SEL_BUTTON: lcd_print("Duty:"); P1IFG &= ~DUTY_SEL_BUTTON; break; default: P1IFG = 0; } }
void display_init(void) { display_reset(); if ( (md380_radio_config_bank2[0x1d] & 3) != 2 && (md380_radio_config_bank2[0x1d] & 3) != 3 ) { md380_Write_Command_2display(0x11); OSTimeDly(120); md380_Write_Command_2display(0xB1); md380_Write_Data_2display(5); md380_Write_Data_2display(0x3C); md380_Write_Data_2display(0x3C); md380_Write_Command_2display(0xB2); md380_Write_Data_2display(5); md380_Write_Data_2display(0x3C); md380_Write_Data_2display(0x3C); md380_Write_Command_2display(0xB3); md380_Write_Data_2display(5); md380_Write_Data_2display(0x3C); md380_Write_Data_2display(0x3C); md380_Write_Data_2display(5); md380_Write_Data_2display(0x3C); md380_Write_Data_2display(0x3C); md380_Write_Command_2display(0xB4); md380_Write_Data_2display(3); md380_Write_Command_2display(0xC0); md380_Write_Data_2display(0x28); md380_Write_Data_2display(8); md380_Write_Data_2display(4); md380_Write_Command_2display(0xC1); md380_Write_Data_2display(0xC0); md380_Write_Command_2display(0xC2); md380_Write_Data_2display(0xD); md380_Write_Data_2display(0); md380_Write_Command_2display(0xC3); md380_Write_Data_2display(0x8D); md380_Write_Data_2display(0x2A); md380_Write_Command_2display(0xC4); md380_Write_Data_2display(0x8D); md380_Write_Data_2display(0xEE); md380_Write_Command_2display(0xC5); md380_Write_Data_2display(0x1A); md380_Write_Command_2display(0x36); md380_Write_Data_2display(8); md380_Write_Command_2display(0xE0); md380_Write_Data_2display(4); md380_Write_Data_2display(0xC); md380_Write_Data_2display(7); md380_Write_Data_2display(0xA); md380_Write_Data_2display(0x2E); md380_Write_Data_2display(0x30); md380_Write_Data_2display(0x25); md380_Write_Data_2display(0x2A); md380_Write_Data_2display(0x28); md380_Write_Data_2display(0x26); md380_Write_Data_2display(0x2E); md380_Write_Data_2display(0x3A); md380_Write_Data_2display(0); md380_Write_Data_2display(1); md380_Write_Data_2display(3); md380_Write_Data_2display(0x13); md380_Write_Command_2display(0xE1); md380_Write_Data_2display(4); md380_Write_Data_2display(0x16); md380_Write_Data_2display(6); md380_Write_Data_2display(0xD); md380_Write_Data_2display(0x2D); md380_Write_Data_2display(0x26); md380_Write_Data_2display(0x23); md380_Write_Data_2display(0x27); md380_Write_Data_2display(0x27); md380_Write_Data_2display(0x25); md380_Write_Data_2display(0x2D); md380_Write_Data_2display(0x3B); md380_Write_Data_2display(0); md380_Write_Data_2display(1); md380_Write_Data_2display(4); md380_Write_Data_2display(0x13); md380_Write_Command_2display(0x3A); md380_Write_Data_2display(5); md380_Write_Command_2display(0x36); if ( (md380_radio_config_bank2[0x1d] & 3) == 1 ) md380_Write_Data_2display(200); else md380_Write_Data_2display(8); md380_Write_Command_2display(0x29); md380_Write_Command_2display(0x2C); }else{ md380_Write_Command_2display(0x3A); md380_Write_Data_2display(5); md380_Write_Command_2display(0x36); if ( (md380_radio_config_bank2[0x1d] & 3) == 3 ) md380_Write_Data_2display(8); else md380_Write_Data_2display(0x48); md380_Write_Command_2display(0xFE); md380_Write_Command_2display(0xEF); md380_Write_Command_2display(0xB4); md380_Write_Data_2display(0); md380_Write_Command_2display(0xFF); md380_Write_Data_2display(0x16); md380_Write_Command_2display(0xfd); if ( (md380_radio_config_bank2[0x1d] & 3) == 3 ) md380_Write_Data_2display(0x40); else md380_Write_Data_2display(0x4F); md380_Write_Command_2display(0xA4); md380_Write_Data_2display(0x70); md380_Write_Command_2display(0xE7); md380_Write_Data_2display(0x94); md380_Write_Data_2display(0x88); md380_Write_Command_2display(0xEA); md380_Write_Data_2display(0x3A); md380_Write_Command_2display(0xED); md380_Write_Data_2display(0x11); md380_Write_Command_2display(0xE4); md380_Write_Data_2display(0xC5); md380_Write_Command_2display(0xE2); md380_Write_Data_2display(0x80); md380_Write_Command_2display(0xA3); md380_Write_Data_2display(18); md380_Write_Command_2display(0xE3); md380_Write_Data_2display(7); md380_Write_Command_2display(0xE5); md380_Write_Data_2display(0x10); md380_Write_Command_2display(0xF0); md380_Write_Data_2display(0); md380_Write_Command_2display(0xF1); md380_Write_Data_2display(0x55); md380_Write_Command_2display(0xF2); md380_Write_Data_2display(5); md380_Write_Command_2display(0xF3); md380_Write_Data_2display(0x53); md380_Write_Command_2display(0xF4); md380_Write_Data_2display(0); md380_Write_Command_2display(0xF5); md380_Write_Data_2display(0); md380_Write_Command_2display(0xF7); md380_Write_Data_2display(0x27); md380_Write_Command_2display(0xF8); md380_Write_Data_2display(0x22); md380_Write_Command_2display(0xF9); md380_Write_Data_2display(0x77); md380_Write_Command_2display(0xFA); md380_Write_Data_2display(0x35); md380_Write_Command_2display(0xFB); md380_Write_Data_2display(0); md380_Write_Command_2display(0xFC); md380_Write_Data_2display(0); md380_Write_Command_2display(0xFE); md380_Write_Command_2display(0xEF); md380_Write_Command_2display(0xE9); md380_Write_Data_2display(0); OSTimeDly(20); md380_Write_Command_2display(0x11); OSTimeDly(130); md380_Write_Command_2display(0x29); md380_Write_Command_2display(0x2C); } }
void display_init(display_t* display) { display_reset(display); display->surface = SDL_SetVideoMode(800, 350, 0, SDL_HWSURFACE); }
int main () { __builtin_disable_interrupts(); // set the CP0 CONFIG register to indicate that // kseg0 is cacheable (0x3) or uncacheable (0x2) // see Chapter 2 "CPU for Devices with M4K Core" // of the PIC32 reference manual __builtin_mtc0(_CP0_CONFIG, _CP0_CONFIG_SELECT, 0xa4210583); // no cache on this chip! // 0 data RAM access wait states BMXCONbits.BMXWSDRM = 0x0; // enable multi vector interrupts INTCONbits.MVEC = 0x1; // disable JTAG to be able to use TDI, TDO, TCK, TMS as digital DDPCONbits.JTAGEN = 0; __builtin_enable_interrupts(); TRISBbits.TRISB7 = 0; // set up LED1 pin as a digital output // int i,a; // display_init(); // for (i = 0; i<10; ++i) // { // a = 30+i; // display_pixel_set(15,a,1); // display_draw(); // } char input[100]; int i=0; short accels[3]; // accelerations for the 3 axes short mags[3]; // magnetometer readings for the 3 axes short temp; acc_setup(); //initialize accelerometer display_init(); //initialize LED screen float xg, yg, zg; while(1) { start_position[0] = 0; start_position[1] = 0; center_position[0] = 32; center_position[1] = 64; acc_read_register(OUT_X_L_A, (unsigned char *) accels, 6); acc_read_register(OUT_X_L_M, (unsigned char *) mags, 6); acc_read_register(TEMP_OUT_L, (unsigned char *) &temp, 2); xg = (float) accels[0]/16000; yg = (float) accels[1]/16000; zg = (float) accels[2]/16000; sprintf(input,"x: %.2f y: %.2f z: %.2f ", xg,yg,zg); display_reset(); display_draw(); display_ggraph(xg,yg); while(input[i]) { display_message(input[i]); i++; start_position[1] = start_position[1]+5; // if(start_position[1]+5>128) // {start_position[0]+1;} // else // {start_position[1] = start_position[1]+5;} } i = 0; display_draw(); _CP0_SET_COUNT(0); while(_CP0_GET_COUNT()<5000000) {;} } return (0); }