From de05a9b0aaeabf429dabe16b09cab14c84a42902 Mon Sep 17 00:00:00 2001 From: Jake <jake.read@cba.mit.edu> Date: Thu, 1 Nov 2018 15:14:24 -0400 Subject: [PATCH] make servo pwm gen 0-750 --- embedded/atkbbb/atkbbb/atkhandler.c | 9 +++ embedded/atkbbb/atkbbb/atkhandler.h | 3 + embedded/atkbbb/atkbbb/hardware.h | 79 ++---------------------- embedded/atkbbb/atkbbb/main.c | 96 +++++++++++++++++++++++------ 4 files changed, 92 insertions(+), 95 deletions(-) diff --git a/embedded/atkbbb/atkbbb/atkhandler.c b/embedded/atkbbb/atkbbb/atkhandler.c index e97d17c..7834ebd 100644 --- a/embedded/atkbbb/atkbbb/atkhandler.c +++ b/embedded/atkbbb/atkbbb/atkhandler.c @@ -17,6 +17,7 @@ void atk_handle_packet(uint8_t *packet, uint8_t length){ int i = 0; int atk_handler_state = ATK_HANDLER_OUTSIDE; uint8_t testReply[4] = {127, 12, 24, 48}; + uint8_t servoReply[5] = {141, 0, 1, 2, 3}; while(i < length){ // prep for the messy double switch :| switch (atk_handler_state){ @@ -43,6 +44,14 @@ void atk_handle_packet(uint8_t *packet, uint8_t length){ case DELIM_KEY_TRAPEZOID: //pin_toggle(&stlerr); break; + + case DELIM_KEY_SERVOVAL: + ; // empty statement for C error + uint32_t servoval = (uint32_t)(packet[i + 1] << 24) | (uint32_t)(packet[i + 2] << 16) | (uint32_t)(packet[i + 3] << 8) | (uint32_t)(packet[i + 4]); + i += 5; + atk_reply_packet(packet, servoReply, 5); + set_servo((uint16_t)servoval); + break; default: // probably an error diff --git a/embedded/atkbbb/atkbbb/atkhandler.h b/embedded/atkbbb/atkbbb/atkhandler.h index d676f9a..269f684 100644 --- a/embedded/atkbbb/atkbbb/atkhandler.h +++ b/embedded/atkbbb/atkbbb/atkhandler.h @@ -18,6 +18,9 @@ #define DELIM_KEY_RESET 128 #define DELIM_KEY_TRAPEZOID 131 +#define DELIM_KEY_WAIT 132 + +#define DELIM_KEY_SERVOVAL 141 void atk_handle_packet(uint8_t *packet, uint8_t length); diff --git a/embedded/atkbbb/atkbbb/hardware.h b/embedded/atkbbb/atkbbb/hardware.h index e95fe05..10d097e 100644 --- a/embedded/atkbbb/atkbbb/hardware.h +++ b/embedded/atkbbb/atkbbb/hardware.h @@ -19,7 +19,7 @@ // A: 11 B: 0 - 4uS bit, 250kBaud #define SYSTEM_BAUDA 11 #define SYSTEM_BAUDB 0 -#define SYSTEM_NUM_UPS 7 +#define SYSTEM_NUM_UPS 1 pin_t stlclk; pin_t stlerr; @@ -36,81 +36,10 @@ pin_t up0txled; atkport_t atkp0; -// UP1 - -ringbuffer_t up1rbrx; -ringbuffer_t up1rbtx; - -uartport_t up1; - -pin_t up1rxled; -pin_t up1txled; - -atkport_t atkp1; - -// UP2 - -ringbuffer_t up2rbrx; -ringbuffer_t up2rbtx; - -uartport_t up2; - -pin_t up2rxled; -pin_t up2txled; - -atkport_t atkp2; - -// UP3 - -ringbuffer_t up3rbrx; -ringbuffer_t up3rbtx; - -uartport_t up3; - -pin_t up3rxled; -pin_t up3txled; - -atkport_t atkp3; - -// UP4 - -ringbuffer_t up4rbrx; -ringbuffer_t up4rbtx; - -uartport_t up4; - -pin_t up4rxled; -pin_t up4txled; - -atkport_t atkp4; - -// UP 5 - - -ringbuffer_t up5rbrx; -ringbuffer_t up5rbtx; - -uartport_t up5; - -pin_t up5rxled; -pin_t up5txled; - -atkport_t atkp5; - -// UPS - -// UP USB (UP6) - -ringbuffer_t upUrbrx; -ringbuffer_t upUrbtx; - -uartport_t upU; - -pin_t upUrxled; // don't exist -pin_t upUtxled; +uartport_t *ups[SYSTEM_NUM_UPS]; -atkport_t atkp6; +// MAIN FCNS -uartport_t *ups[SYSTEM_NUM_UPS]; +void set_servo(uint16_t val); #endif /* HARDWARE_H_ */ \ No newline at end of file diff --git a/embedded/atkbbb/atkbbb/main.c b/embedded/atkbbb/atkbbb/main.c index b4b1e01..7b47ccb 100644 --- a/embedded/atkbbb/atkbbb/main.c +++ b/embedded/atkbbb/atkbbb/main.c @@ -6,55 +6,111 @@ */ #include <avr/io.h> +#include <avr/interrupt.h> +#include "hardware.h" +#include "fastmath.h" +#include "pin.h" -void servo_set_pwm(uint16_t val){ +void clock_init(void){ + OSC.XOSCCTRL = OSC_XOSCSEL_XTAL_256CLK_gc | OSC_FRQRANGE_12TO16_gc; // select external source + OSC.CTRL = OSC_XOSCEN_bm; // enable external source + while(!(OSC.STATUS & OSC_XOSCRDY_bm)); // wait for external + OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | OSC_PLLFAC0_bm | OSC_PLLFAC1_bm; // select external osc for pll, do pll = source * 3 + //OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | OSC_PLLFAC1_bm; // pll = source * 2 for 32MHz std clock + OSC.CTRL |= OSC_PLLEN_bm; // enable PLL + while (!(OSC.STATUS & OSC_PLLRDY_bm)); // wait for PLL to be ready + CCP = CCP_IOREG_gc; // enable protected register change + CLK.CTRL = CLK_SCLKSEL_PLL_gc; // switch to PLL for main clock +} + +void uarts_init(void){ + rb_init(&up0rbrx); + rb_init(&up0rbtx); + pin_init(&up0rxled, &PORTF, PIN0_bm, 0, 1); + pin_init(&up0txled, &PORTF, PIN1_bm, 1, 1); + uart_init(&up0, &USARTF0, &PORTF, PIN2_bm, PIN3_bm, &up0rbrx, &up0rbtx, &up0rxled, &up0txled); + + uart_start(&up0, SYSTEM_BAUDA, SYSTEM_BAUDB); + + ups[0] = &up0; +} + +void atkps_init(void){ + atkport_init(&atkp0, 0, &up0); +} + +void set_pwm_cca(uint16_t val){ uint8_t vall = (uint8_t) val; uint8_t valh = (uint8_t) (val >> 8); - + TCC0.CCABUFL = vall; TCC0.CCABUFH = valh; } -void servo_pwm_begin(){ +void servo_pwm_begin(void){ PORTC.DIRSET = PIN0_bm; - TCC0.CTRLA = TC_CLKSEL_DIV8_gc; + TCC0.CTRLA = TC_CLKSEL_DIV64_gc; TCC0.CTRLB = TC_WGMODE_SINGLESLOPE_gc | (1 << 4); - uint16_t per = 1024; + uint16_t per = 15000; uint8_t perl = (uint8_t) per; uint8_t perh = (uint8_t) (per >> 8); TCC0.PERBUFL = perl; TCC0.PERBUFH = perh; - servo_set_pwm(512); + // 750: 1ms + // 1500: 2ms + set_pwm_cca(750); +} + +void set_servo(uint16_t val){ + // 0 -> 750 = signal 1000us -> 2000us duty on 20ms period + if (val > 1500){ + val = 1500; + } + set_pwm_cca(750 + val); } int main(void) { - servo_pwm_begin(); + // start clock + clock_init(); + + // start networking hardware + uarts_init(); + atkps_init(); + + // allow interrupts (and set handlers below) + sei(); + PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; + + // lights + pin_init(&stlclk, &PORTE, PIN2_bm, 2, 1); + pin_init(&stlerr, &PORTE, PIN3_bm, 3, 1); + pin_set(&stlerr); - // 'pin' 40 / port e - pin 3 - PORTE.DIRSET = PIN3_bm; - PORTE.DIRSET = PIN2_bm; + // servo begin + servo_pwm_begin(); uint16_t tck = 0; - uint16_t pwm = 256; while (1) { + atkport_scan(&atkp0, 2); tck ++; - - if(!(tck % 800)){ - pwm ++; - if(pwm > 512){ - pwm = 256; - } - servo_set_pwm(pwm); - PORTE.DIRTGL = PIN3_bm; - PORTE.DIRTGL = PIN2_bm; + if(!fastModulo(tck, 4096)){ + pin_toggle(&stlclk); } } } + +ISR(USARTF0_RXC_vect){ + uart_rxhandler(&up0); +} + +ISR(USARTF0_DRE_vect){ + uart_txhandler(&up0); +} \ No newline at end of file -- GitLab