sketchy slow test with LEDs
[cortex-from-scratch] / drivers / tsensor.c
index d1ebcd4..7710b95 100644 (file)
@@ -1,12 +1,11 @@
 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
  * 
  * $LOG$
- * 2019/8/4 - ROBIN KRENS      
+ * 2019/8/28 - ROBIN KRENS     
  * PreInitial version 
  * 
  * $DESCRIPTION$
- * Temperature sensor 
- * [in dev]
+ * TIMERS, non-blocking...
  *
  * */
 
 
 #include <drivers/tsensor.h>
 
-#define PRESCALER 36000 // 1 Mhz
+#define PRESCALER 0xFFFF // 1 MHz (1 microsecond)
+#define MAXBUF 10
 
-int *ccr1, *ccr2, *ccr1b, *ccr2b;
-bool s1, s2;
+int cnt;
+enum status { INIT, WAIT_INIT, INIT_DONE } init_status;
+enum rstatus { READ, READ_INIT, READ_DONE } read_status;
 
- void * update_handler() {
+static struct {
+       uint8_t buf[MAXBUF];
+       uint8_t pos;
+} readbuf;
 
-/*     s1 = false;
-       s2 = false;
-       ccr1 = 0xFFFFFFFF;
-               ccr2 = 0xFFFFFFFF;
-               ccr1b = 0xFFFFFFFF;
-               ccr2b = 0xFFFFFFFF;
-       
-       if(rchkbit(TIM4_SR1, 1)) {
-                       s1 = true;
-               //      printf("CCR1: %p\n", *TIM4_CCR1);
-               //      printf("CCR2: %p\n", *TIM4_CCR2);
-                       ccr1 = *TIM4_CCR1;
-                       ccr2 = *TIM4_CCR2;
-                       rclrbit(TIM4_SR1, 1); 
-       }
-       
-       if(rchkbit(TIM4_SR1, 2)) {
-                       s2 = true;
-                       ccr1b = *TIM4_CCR1;
-                       ccr2b = *TIM4_CCR2;
-                       rclrbit(TIM4_SR1, 2);
-       }
-       
-       if(rchkbit(TIM4_SR1, 6)) {
-       //              printf("TRIGGER\n");
-                       rclrbit(TIM4_SR1, 6);
-       }
+static struct {
+       char cmd;
+       uint8_t pos;
+} sensor_cmd;
 
-       rclrbit(TIM4_SR1, 0);
-//     rclrbit(TIM4_SR1, 9); // OF
-//     rclrbit(TIM4_SR1, 10); // OF
+//
+void read_init();
 
-       // TODO clear overflow tag
-       
-       printf("SR1/CCR1: %p\n", ccr1);
-       printf("SR1/CCR2: %p\n", ccr2);
-       printf("SR2/CCR1: %p\n", ccr1b);
-       printf("SR2/CCR2: %p\n", ccr2b);
-
-       if (s1)
-               printf("EDGE DOWN\n");
-       if (s2)
-               printf("EDGE UP\n");
-
-       s1 = false;
-       s2 = false; */
+static void in_conf() {
+       rwrite(GPIOB_CRL, 0x44444444);
 }
 
-static void reset() {
-       rwrite(GPIOB_CRL, 0x44444444);
+static void out_conf() {
+       rwrite(GPIOB_CRL, 0x46444444); // open drain (with pullup resistor)
 }
 
-void * tmp_update_handler() {
+/* set preload and generate update event */
+static void timer_config(uint16_t preload) {
+       rwrite(TIM4_ARR, preload);
+       rsetbit(TIM4_EGR, 0);
+}
 
-       printf("SR: %p\n", *TIM4_SR1);
-       
-       rclrbit(TIM4_CR1, 0);   /* EMULATOR STOP */
-       rclrbit(TIM4_SR1, 0);
-       rclrbit(TIM4_SR1, 1);
-               reset();
-               tsensor_input(0xFFFF);
+/* static void presence_pulse_conf() {
+
+       current_status = INIT;
+       out_conf();
+       rclrbit(GPIOB_ODR, 6); // low
+       timer_config(480); // > 480 us
+}
 
-//     if(rchkbit(TIM4_SR1, 1)) {
-//             printf("TEST\n");
-//     }
+static void presence_reply_conf() {
 
+       current_status = WAIT_INIT;
+       in_conf();
+       timer_config(100); // > 60 us
 }
 
-void * cnt_complete_handler() {
-       rclrbit(TIM4_CR1, 0);
-       rclrbit(TIM4_SR1, 0);
+static void finish_init() {
+       current_status = INIT_FINISH;
+       timer_config(480);
+} */
+
+/* static void terminate() {
+//     current_status = NULL;
+       in_conf();
        rclrbit(TIM4_DIER, 0);
-       rwrite(GPIOB_CRL, 0x44444444);
-       printf("CNT COMPLETE\n");
-       tsensor_input(0xFFFF);
+       rclrbit(TIM4_CR1, 0);
+} */
+
+
+/* void tsensor_cmd_init() {
+       current_status = WRITE;
+       out_conf();
+       timer_config(60);
+       //rsetbit(TIM4_DIER, 0);
+       //rsetbit(TIM4_CR1, 0); // start
+} */
+
+void write0() {
+       out_conf();
+       rclrbit(GPIOB_ODR, 6); // low
+       timer_config(60);
 }
 
 
-void tsensor_simple(uint16_t preload) {
+/* Handlers for read, write and init pulses */
+
+void * write_handler() {
+
+       rclrbit(TIM4_SR1, 0);
+       rclrbit(TIM4_SR1, 1);
+       if (sensor_cmd.pos < 7) {
        
-       rsetbit(RCC_APB1ENR, 2); // TIM4 enable
+               if ((sensor_cmd.cmd >> sensor_cmd.pos+1) & 0x01) {
+                       printf("1\n");
+                       rwrite(TIM4_CCR1, 150);
+                       rsetbit(TIM4_EGR, 0);
+               }
+                       
+               else {
+                       printf("0");
+                       rwrite(TIM4_CCR1, 600);
+                       rsetbit(TIM4_EGR, 0);
+       
+               }
+               sensor_cmd.pos++;
+       }
+       else {
 
-       rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
-       rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
+               read_init();
+       }
+       
+}
+
+void * reply_handler() {
+
+       rclrbit(TIM4_SR1, 0);
+       rclrbit(TIM4_SR1, 1);
+       switch(read_status) {
+               case(READ_INIT):
+                       in_conf();
+                       read_status = READ;
+                       rsetbit(GPIOB_BSRR, 22); // low (<- reset) 
+                       if (rchkbit(GPIOB_IDR, 6)) {
+                                       printf("high");
+                       }
+                       else {
+                               printf("low");
+                       }
+                       timer_config(600);
+                       break;
+               case(READ):
+                       out_conf();
+                       read_status = READ_INIT;
+                       timer_config(1);
+                       break;
+               case(READ_DONE):
+                       // terminate
+                       break;
+       }
+
+
+} 
+
+
+void read_init() {
+
+
+       rclrbit(TIM4_CR1, 0); // stop
+       rclrbit(TIM4_CCER, 0);
+       rclrbit(TIM4_CCER, 1);
+
+       //rwrite(GPIOB_CRL, 0x46444444); // floating
+       out_conf();
        rsetbit(TIM4_CR1, 2); // only overflow generates update
+       read_status = READ_INIT;
+       timer_config(1); // init 1us
 
-       rwrite(TIM4_PSC, PRESCALER - 1);
-       rwrite(TIM4_ARR, preload);
-       rsetbit(TIM4_EGR, 0);
-       
-       ivt_set_gate(46, cnt_complete_handler, 0);
+       ivt_set_gate(46, reply_handler, 0);
        rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
+       
+       //rclrbit(TIM4_DIER, 0);
 
-       rsetbit(GPIOB_BSRR, 22); // 
+       rclrbit(GPIOB_ODR, 6); // low
        rsetbit(TIM4_DIER, 0);
+
        rsetbit(TIM4_CR1, 0);
 
 }
 
-void run() {
 
-       rsetbit(RCC_APB2ENR, 3); // GPIOB enable
-       rwrite(GPIOB_CRL, 0x47444444); // open drain general
-
-       rsetbit(GPIOB_BSRR, 22); // high
-       tsensor_simple(2000);
-//     tsensor_output(580, 520);
-//     reset();
-//     tsensor_simple(580);
-}
+void write_init() {
 
-void tsensor_output(uint16_t preload, uint16_t compare/*, uint16_t pulses */) {
+       sensor_cmd.cmd = 0x33;
+       sensor_cmd.pos = 0;
 
-       /* GPIO AND CLOCK */
        rsetbit(RCC_APB2ENR, 3); // GPIOB enable
-       rwrite(GPIOB_CRL, 0x4A444444); // PB6 for Channel 1 TIM4 alternate 
        rsetbit(RCC_APB1ENR, 2); // TIM4 enable
-       
        rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
        rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
        rsetbit(TIM4_CR1, 2); // only overflow generates update
+       rwrite(TIM4_PSC, PRESCALER - 1);
+       rwrite(GPIOB_CRL, 0x4A444444);
+       
+
+       timer_config(610);      
 
-       rwrite(TIM4_PSC, PRESCALER - 1); // 1 MHz
-       rwrite(TIM4_ARR, preload); // preload 
-       rwrite(TIM4_CCR1, compare); // compare
-       //rwrite(TIM4_RCR, pulses - 1); /* repeat ONLY IN ADVANCED TIMER */
+       if ((sensor_cmd.cmd >> sensor_cmd.pos) & 0x01) {
+               printf("1\n");
+               rwrite(TIM4_CCR1, 150);
+       }
+       else {
+               printf("0\n");
+               rwrite(TIM4_CCR1, 600);
+       }
+
+       rsetbitsfrom(TIM4_CCMR1, 4, 0x6); // forced high on match
        
-       rsetbit(TIM4_EGR, 0); // update generation  
+       rsetbit(TIM4_CCER, 0);
+       rsetbit(TIM4_CCER, 1);
        
-       rsetbit(TIM4_CR1, 3); // one pulse mode
-       rsetbitsfrom(TIM4_CCMR1, 4, 0x6); // mode
+       // set write handler
+       ivt_set_gate(46, write_handler, 0);
+       rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
        
-       //rsetbit(TIM4_CCMR1, 3); // preload enable
-       //rsetbit(TIM4_CR1, 7); // buffered
+       //rsetbit(TIM4_DIER, 1);
+       rsetbit(TIM4_DIER, 0);
+       rsetbit(TIM4_CR1, 0);
 
-       rsetbit(TIM4_CCER, 0); // enable output channeli 1
-       rsetbit(TIM4_CCER, 1); // active low
-       rsetbit(TIM4_CR1, 0); // start counter
+}
 
-       /* INTERRUPTS */        
-       ivt_set_gate(46, tmp_update_handler, 0);
 
-       rsetbit(TIM4_DIER, 1);
-       rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
+/* void * init_handler() {
+
+       switch(current_status) {
+                       case (INIT):
+                               printf("M: reset\n");
+                               presence_reply_conf();
+                               break;
+                       case (WAIT_INIT):
+                               if (!rchkbit(GPIOB_IDR, 6)) {
+                                       printf("S: yes\n");
+                               }
+                               else {
+                                       printf("S: no\n");
+                               }
+                               finish_init();
+                               break;
+
+                       case (INIT_FINISH): 
+                               printf("M: fin\n");
+                               tsensor_cmd_init();
+                               break;
+
+                       case (WRITE):
+                               printf("M: write\n");
+                               if (sensor_cmd.pos > 7)
+                                       terminate();
+                               else {
+                                       if ((sensor_cmd.cmd >> sensor_cmd.pos) & 0x01) {
+
+                                               printf("1\n");
+                                       }
+                                       else {
+                                               printf("0\n");
+                                       }
+                               }
+                               sensor_cmd.pos++;
+                               break;
+
+                       default:
+                               printf("no status\n");
+                       }
+
+       rclrbit(TIM4_SR1, 0);
+} */
+
+/* TODO: write
+ * uint8_t cmd = 0x33
+ * if (cmd & 0x01)
+ *     1 slot
+ * else 0 slot
+ * cmd = cmd >> 1
+ *
+ * read, similar as pulse response */
+
+
+void * bare_handler() {
+
+//w2   cnt += 1;
+//w2   printf("CHECKING STATUS\n");
+//w2
+//w2   if(rchkbit(GPIOB_IDR, 6)) {
+//w2           printf("port high\n");
+//w2   }
+//w2   else {
+//w2           printf("port low\n");
+//w2   }
        
+
+       cnt += 1;
+       printf("Count event %d\n", cnt);
+       int switchled = cnt % 2;
+       if (switchled) {
+               rwrite(GPIOB_CRL, 0x46444444); //  open drain general for sensor?
+               printf("setting low\n");
+               rclrbit(GPIOB_ODR, 6); // low
+       }
+       else {
+               printf("pulling high \n");
+               rwrite(GPIOB_CRL, 0x44444444); //  open drain general for sensor?
+               //rsetbit(GPIOB_ODR, 6); // high
+               
+       }
+       rclrbit(TIM4_SR1, 0);
 }
 
-void tsensor_input(uint16_t preload) {
 
-       //uint16_t timestamp;   
-       /* GPIO AND CLOCK */
-       //rsetbit(RCC_APB2ENR, 3); // GPIOB enable
-       //rwrite(GPIOB_CRL, 0x44444444); // Input floating (default state)
-       //rsetbit(RCC_APB1ENR, 2); // TIM4 enable
+/* void tsensor_init() {
        
-       //rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
-       //rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
+       sensor_cmd.cmd = 0x33;
+       sensor_cmd.pos = 0;
 
-       rwrite(TIM4_PSC, PRESCALER - 1); // 1 MHz
-       rwrite(TIM4_ARR, preload); // preload 
+       rsetbit(RCC_APB2ENR, 3); // GPIOB enable
+       rsetbit(RCC_APB1ENR, 2); // TIM4 enable
 
+       rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
+       rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
+       rsetbit(TIM4_CR1, 2); // only overflow generates update
+
+       rwrite(TIM4_PSC, PRESCALER - 1);
+       presence_pulse_conf();
+//     rwrite(TIM4_ARR, preload);
+//     rsetbit(TIM4_EGR, 0);
        
-       rsetbit(TIM4_EGR, 0); // update generation  
+       ivt_set_gate(46, init_handler, 0);
+       rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
 
-       rsetbit(TIM4_CCMR1, 0); // input on TI1
-       rsetbit(TIM4_CCMR1, 9); // another input TI2
-       rsetbit(TIM4_CCER, 1); // other polarity for T1, inverted
+//w    rsetbit(GPIOB_ODR, 6); // 
+       rsetbit(TIM4_DIER, 0);
+       rsetbit(TIM4_CR1, 0); // start
 
-       /* TODO: reg funct */
-       rsetbit(TIM4_SMCR, 4); // OLD: 101, new Edge detector
-       rsetbit(TIM4_SMCR, 6); // 
-       
+} */
 
-       // rsetbit(TIM4_SMCR, 2); // RESET rising edge triggers counter and generates update
-       rsetbit(TIM4_SMCR, 2); // OLD: 110
-       rsetbit(TIM4_SMCR, 1);
-       rsetbit(TIM4_SMCR, 0);
-       //rsetbit(TIM4_SMCR, 1); // 110
 
-       //rsetbit(TIM4_CR1, 3); // one pulse mode // NOTE: RESET after finised preload
-       // will catch multiple signal... can set fram
-       
-       rsetbit(TIM4_CCER, 0); // enable capture channel 1 (changed pos)
-       rsetbit(TIM4_CCER, 4); // enable capture channel 2 
-       /* Caught on rising edge, no need to change*/
-       /* Clear capture event flag */
-//     rsetbit(TIM4_CR1, 0); // RESET with no trigger mode start
-
-       // enable capture channel 1 interrupt
-       rsetbit(TIM4_DIER, 1);
-       rsetbit(TIM4_DIER, 2);
-        ivt_set_gate(46, update_handler, 0);
-       rsetbit(NVIC_ISER0, 30);
+void run() {
+
+//w2   cnt = 0;
+//w2   rsetbit(RCC_APB2ENR, 3);
+//w2   rwrite(GPIOB_CRL, 0x48444444); // input with pull up down
+//w2   tsensor_simple(5000); 
+
+       //cnt = 0;
+       //rsetbit(RCC_APB2ENR, 3); // GPIOB enable
+       //rwrite(GPIOB_CRL, 0x46444444); //  open drain general for sensor?
 
+       //rsetbit(GPIOB_BSRR, 22); // low (<- reset) 
+
+//     tsensor_init(); 
+       write_init();
+
+//     tsensor_output(580, 520);
+//     reset();
+//     tsensor_simple(580);
 }
+
+//void tsensor_output(uint16_t preload, uint16_t compare/*, uint16_t pulses */) {
+//     /* GPIO AND CLOCK */
+//     rsetbit(RCC_APB2ENR, 3); // GPIOB enable
+//     rwrite(GPIOB_CRL, 0x4A444444); // PB6 for Channel 1 TIM4 alternate 
+//     rsetbit(RCC_APB1ENR, 2); // TIM4 enable
+//     
+//     rsetbitsfrom(TIM4_CR1, 5, 0x00); // edge-aligned mode
+//     rclrbit(TIM4_CR1, 4); // upcounter (clrbit! not needed to set)
+//     rsetbit(TIM4_CR1, 2); // only overflow generates update
+//
+//     rwrite(TIM4_PSC, PRESCALER - 1); // 1 MHz
+//     rwrite(TIM4_ARR, preload); // preload 
+//     rwrite(TIM4_CCR1, compare); // compare
+//     //rwrite(TIM4_RCR, pulses - 1); /* repeat ONLY IN ADVANCED TIMER */
+//     
+//     rsetbit(TIM4_EGR, 0); // update generation  
+//     
+//     rsetbit(TIM4_CR1, 3); // one pulse mode
+//     rsetbitsfrom(TIM4_CCMR1, 4, 0x6); // mode
+//     
+//     //rsetbit(TIM4_CCMR1, 3); // preload enable
+//     //rsetbit(TIM4_CR1, 7); // buffered
+//
+//     rsetbit(TIM4_CCER, 0); // enable output channeli 1
+//     rsetbit(TIM4_CCER, 1); // active low
+//     rsetbit(TIM4_CR1, 0); // start counter
+//
+//     /* INTERRUPTS */        
+//     ivt_set_gate(46, tmp_update_handler, 0);
+//
+//     rsetbit(TIM4_DIER, 1);
+//     rsetbit(NVIC_ISER0, 30); // interupt 41 - 32
+//     
+//}