Multithreading Solution for A13 Temperatur, Servo, Display Roger Zuber, BZTF

Committer:
rogerzuber
Date:
Fri Sep 24 09:50:16 2021 +0000
Revision:
1:12451c43fd61
Parent:
0:680471563758
Schritt 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rogerzuber 0:680471563758 1 #include "mbed.h"
rogerzuber 0:680471563758 2 #include "ShiftOut.h"
rogerzuber 0:680471563758 3
rogerzuber 0:680471563758 4
rogerzuber 0:680471563758 5 #define SET_LATCH() (LATCH = 0)
rogerzuber 0:680471563758 6 #define RESET_LATCH() (LATCH = 1)
rogerzuber 0:680471563758 7
rogerzuber 0:680471563758 8 #define ENABLE_RESET() (RESET = 0)
rogerzuber 0:680471563758 9 #define DISABLE_RESET() (RESET = 1)
rogerzuber 0:680471563758 10
rogerzuber 0:680471563758 11 static char stateArr[8*REGISTER_CNT] = {0};
rogerzuber 0:680471563758 12 static bool hasChanged = false;
rogerzuber 0:680471563758 13
rogerzuber 0:680471563758 14 ShiftOut::ShiftOut(PinName ser, PinName srclk, PinName rclk,
rogerzuber 0:680471563758 15 PinName oe, PinName reset) : DSERIAL(ser), SRCLK(srclk), RCLK(rclk), LATCH(oe), RESET(reset)
rogerzuber 0:680471563758 16 {
rogerzuber 0:680471563758 17 writeByte(0x00); // Reset the values of the registers to 0
rogerzuber 0:680471563758 18 if(RESET != NC){
rogerzuber 0:680471563758 19 DISABLE_RESET();
rogerzuber 0:680471563758 20 }
rogerzuber 0:680471563758 21 }
rogerzuber 0:680471563758 22
rogerzuber 0:680471563758 23 //Pulses the register
rogerzuber 0:680471563758 24 void ShiftOut::updateRegister(){
rogerzuber 0:680471563758 25 SRCLK = 1;
rogerzuber 0:680471563758 26 wait_us(2);
rogerzuber 0:680471563758 27 SRCLK = 0;
rogerzuber 0:680471563758 28 }
rogerzuber 0:680471563758 29 //Updates the output register
rogerzuber 0:680471563758 30 void ShiftOut::updateOutput(){
rogerzuber 0:680471563758 31 RCLK = 1;
rogerzuber 0:680471563758 32 wait_us(2);
rogerzuber 0:680471563758 33 RCLK = 0;
rogerzuber 0:680471563758 34 }
rogerzuber 0:680471563758 35 //Writes a byte to the shift register
rogerzuber 0:680471563758 36 void ShiftOut::writeByte(unsigned char byte){
rogerzuber 0:680471563758 37 hasChanged = true;
rogerzuber 0:680471563758 38 for(int i = 0; i<8*REGISTER_CNT; i++){
rogerzuber 0:680471563758 39 DSERIAL = (byte & 0x01<<i)>>i;
rogerzuber 0:680471563758 40 updateRegister();
rogerzuber 0:680471563758 41 }
rogerzuber 0:680471563758 42 updateOutput();
rogerzuber 0:680471563758 43 }
rogerzuber 0:680471563758 44 //Writes a byte to the shift register
rogerzuber 0:680471563758 45 void ShiftOut::write2Byte(unsigned int word){
rogerzuber 0:680471563758 46 hasChanged = true;
rogerzuber 0:680471563758 47 for(int i = 0; i<8*REGISTER_CNT; i++){
rogerzuber 0:680471563758 48 DSERIAL = (word & 0x01<<i)>>i;
rogerzuber 0:680471563758 49 updateRegister();
rogerzuber 0:680471563758 50 }
rogerzuber 0:680471563758 51 updateOutput();
rogerzuber 0:680471563758 52 }
rogerzuber 0:680471563758 53 //Writes a bit to the shift register
rogerzuber 0:680471563758 54 void ShiftOut::writeBit(unsigned char bit){
rogerzuber 0:680471563758 55 DSERIAL = bit & 0x01;
rogerzuber 0:680471563758 56 updateRegister();
rogerzuber 0:680471563758 57 updateOutput();
rogerzuber 0:680471563758 58 }
rogerzuber 0:680471563758 59 //Writes multiple bits from an array to create an animation
rogerzuber 0:680471563758 60 void ShiftOut::animate(int arr[][8], int lines, int delay_ms){
rogerzuber 0:680471563758 61 hasChanged = true;
rogerzuber 0:680471563758 62 for(int i = 0; i < lines; i++){
rogerzuber 0:680471563758 63 for(int j = 0; j < 8; j++){
rogerzuber 0:680471563758 64 writeBit(arr[i][j]);
rogerzuber 0:680471563758 65 }
rogerzuber 0:680471563758 66 wait_ms(delay_ms);
rogerzuber 0:680471563758 67 }
rogerzuber 0:680471563758 68 }
rogerzuber 0:680471563758 69
rogerzuber 0:680471563758 70 void ShiftOut::animationExample(){
rogerzuber 0:680471563758 71 hasChanged = true;
rogerzuber 0:680471563758 72 int strobe[][8]= {{1,0,0,0,0,0,0,0},
rogerzuber 0:680471563758 73 {0,1,0,0,0,0,0,0},
rogerzuber 0:680471563758 74 {0,0,1,0,0,0,0,0},
rogerzuber 0:680471563758 75 {0,0,0,1,0,0,0,0},
rogerzuber 0:680471563758 76 {0,0,0,0,1,0,0,0},
rogerzuber 0:680471563758 77 {0,0,0,0,0,1,0,0},
rogerzuber 0:680471563758 78 {0,0,0,0,0,0,1,0},
rogerzuber 0:680471563758 79 {0,0,0,0,0,0,0,1}};
rogerzuber 0:680471563758 80
rogerzuber 0:680471563758 81 int nightrider[18][8]= {{1,0,0,0,0,0,0,0},
rogerzuber 0:680471563758 82 {1,1,0,0,0,0,0,0},
rogerzuber 0:680471563758 83 {1,1,1,0,0,0,0,0},
rogerzuber 0:680471563758 84 {0,1,1,1,0,0,0,0},
rogerzuber 0:680471563758 85 {0,0,1,1,1,0,0,0},
rogerzuber 0:680471563758 86 {0,0,0,1,1,1,0,0},
rogerzuber 0:680471563758 87 {0,0,0,0,1,1,1,0},
rogerzuber 0:680471563758 88 {0,0,0,0,0,1,1,1},
rogerzuber 0:680471563758 89 {0,0,0,0,0,0,1,1},
rogerzuber 0:680471563758 90 {0,0,0,0,0,0,0,1},
rogerzuber 0:680471563758 91 {0,0,0,0,0,0,1,1},
rogerzuber 0:680471563758 92 {0,0,0,0,0,1,1,1},
rogerzuber 0:680471563758 93 {0,0,0,0,1,1,1,0},
rogerzuber 0:680471563758 94 {0,0,0,1,1,1,0,0},
rogerzuber 0:680471563758 95 {0,0,1,1,1,0,0,0},
rogerzuber 0:680471563758 96 {0,1,1,1,0,0,0,0},
rogerzuber 0:680471563758 97 {1,1,1,0,0,0,0,0},
rogerzuber 0:680471563758 98 {1,1,0,0,0,0,0,0}};
rogerzuber 0:680471563758 99
rogerzuber 0:680471563758 100 animate(nightrider, 18, 50);
rogerzuber 0:680471563758 101 wait(1);
rogerzuber 0:680471563758 102 animate(strobe, 8, 200);
rogerzuber 0:680471563758 103 }
rogerzuber 0:680471563758 104
rogerzuber 0:680471563758 105 void ShiftOut::writeBitAtPos(unsigned char pin, bool state){
rogerzuber 0:680471563758 106 if(hasChanged){
rogerzuber 0:680471563758 107 clearStateArray();
rogerzuber 0:680471563758 108 hasChanged = false;
rogerzuber 0:680471563758 109 }
rogerzuber 0:680471563758 110 if(pin < 8*REGISTER_CNT){
rogerzuber 0:680471563758 111 stateArr[pin] = state;
rogerzuber 0:680471563758 112 }
rogerzuber 0:680471563758 113 writeArray(stateArr);
rogerzuber 0:680471563758 114 }
rogerzuber 0:680471563758 115
rogerzuber 0:680471563758 116 void ShiftOut::writeArray(char arr[8*REGISTER_CNT]){
rogerzuber 0:680471563758 117 for(int i = (8*REGISTER_CNT)-1; i >= 0; i--) {
rogerzuber 0:680471563758 118 writeBit(arr[i]);
rogerzuber 0:680471563758 119 }
rogerzuber 0:680471563758 120
rogerzuber 0:680471563758 121 }
rogerzuber 0:680471563758 122
rogerzuber 0:680471563758 123 void ShiftOut::clearStateArray(){
rogerzuber 0:680471563758 124 for(int i = 0; i < 8*REGISTER_CNT; i++){
rogerzuber 0:680471563758 125 stateArr[i] = 0;
rogerzuber 0:680471563758 126 }
rogerzuber 0:680471563758 127 }