From 041cd5e42295a74bd23406e50d93fa99db1ce985 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Sun, 22 Sep 2019 12:18:51 +0200 Subject: [PATCH] clear unnecessary files clock now roughly works (no Timezone support) also setting led brightness via encoder works (every 2nd step works, overflow at FF) --- code/inc/DS3231.h | 2 +- code/inc/adc.h | 7 -- code/inc/print.h | 18 ---- code/src/DS3231.c | 11 +- code/src/adc.c | 25 ----- code/src/main.c | 304 ++++++++++++++++++++++-------------------------------- code/src/print.c | 124 ---------------------- 7 files changed, 130 insertions(+), 361 deletions(-) delete mode 100644 code/inc/adc.h delete mode 100644 code/inc/print.h delete mode 100644 code/src/adc.c delete mode 100644 code/src/print.c diff --git a/code/inc/DS3231.h b/code/inc/DS3231.h index d517c35..8ac4544 100644 --- a/code/inc/DS3231.h +++ b/code/inc/DS3231.h @@ -3,7 +3,7 @@ #include -uint32_t DS3231_read(void); +void DS3231_read(uint8_t dest[3]); void DS3231_write(uint8_t inbuffer[3]); #endif diff --git a/code/inc/adc.h b/code/inc/adc.h deleted file mode 100644 index c67430f..0000000 --- a/code/inc/adc.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _ADC_H -#define _ADC_H - -void adc_setup(void); -int adc_read(unsigned char adc_pin); - -#endif diff --git a/code/inc/print.h b/code/inc/print.h deleted file mode 100644 index 85982e8..0000000 --- a/code/inc/print.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _PRINT_H -#define _PRINT_H - -extern const unsigned char character_Font[26]; -extern const unsigned char number_Font[10]; - -extern unsigned char SR_Buffer[]; - -void clear_SR_Buffer(void); -void print_SR_Buffer(void); -void add_Decimal_Point_to_SR_Buffer(int pos); -void add_Character_to_SR_Buffer(unsigned char character, int pos); -void add_Number_to_SR_Buffer(int number, int pos); -void print_String(char* string); -void add_ASCII_to_SR_Buffer(unsigned char, int pos); - - -#endif diff --git a/code/src/DS3231.c b/code/src/DS3231.c index 2ad37eb..44b2d41 100644 --- a/code/src/DS3231.c +++ b/code/src/DS3231.c @@ -3,17 +3,18 @@ #include #include "i2cmaster.h" -uint32_t DS3231_read(){ +void DS3231_read(uint8_t dest[3]){ + // set address to 0 i2c_start_wait(0xD0); i2c_write(0x00); i2c_stop(); + // read addresses 0, 1 and 2 i2c_start_wait(0xD1); - uint8_t sec = i2c_readAck(); - uint8_t min = i2c_readAck(); - uint8_t std = i2c_readNak(); + dest[0] = i2c_readAck(); + dest[1] = i2c_readAck(); + dest[2] = i2c_readNak(); i2c_stop(); - return ((uint32_t)std<<16) | ((uint32_t)min<<8) | sec; } void DS3231_write(uint8_t inbuffer[3]){ diff --git a/code/src/adc.c b/code/src/adc.c deleted file mode 100644 index 4b10e21..0000000 --- a/code/src/adc.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "adc.h" -#include "pinout.h" -#include - -void adc_setup(void){ - ADMUX = (1 << REFS0); //Versorgungsspannung definieren - ADCSRA|= (1 << ADEN) //enable bit für adc - | (1 << ADPS0) //setze Prescaler für Abtastfrequenz - | (1 << ADPS1) //setze Prescaler für Abtastfrequenz - | (0 << ADPS2); //setze Prescaler für Abtastfrequenz -} - - - -int adc_read(unsigned char adc_pin) { - ADMUX &= 0b11110000; //Alte Port-Select Flags löschen - ADMUX|=adc_pin; //Neuen Eingang setzen - ADCSRA |= (1 << ADSC); // eine Wandlung "single conversion" - while (ADCSRA & (1 << ADSC) ) { // auf Abschluss der Konvertierung warten - } - int ADCresult = ADCL; - ADCresult += (ADCH << 8); - return ADCresult; -} - diff --git a/code/src/main.c b/code/src/main.c index 53baf55..89dffce 100644 --- a/code/src/main.c +++ b/code/src/main.c @@ -1,44 +1,56 @@ -//#define F_CPU 16000000L - #include #include #include //interrupts #include #include #include "pinout.h" -#include "print.h" -#include "adc.h" #include "uart.h" #include "i2cmaster.h" #include "DS3231.h" #define RX_INPUT_BUFFER_SIZE 92 -/*README - DIP1 aktiviert Röhren-Schaltregler -*/ - -volatile int counter = 0; -//char text[22] = {'F','R','o','h','e',' ',' ','W','e','i','h','n','a','c','h','t','e', 'n', ' ',' ', ' ', ' '}; -char text[18] = {'1','2','3','4','5','6','7','8','9','t','s','c','a','f','e',' ', ' ', ' '}; -int offset = 0; -int animationtimer = 0; -int stringlength = 22; -int duty = 125; - - void check_dip_switches(void); -void check_buttons(void); void setup(void); void set_PWM_duty(int dutycycle); -uint8_t parse_nmea_gps(char input_string[RX_INPUT_BUFFER_SIZE], uint8_t output_buffer[3]){ +unsigned char SR_Buffer[6]; +const unsigned char number_Font[10] = { + 0b11011110, //0 + 0b00000110, //1 + 0b11101010, //2 + 0b01101110, //3 + 0b00110110, //4 + 0b01111100, //5 + 0b11111100, //6 + 0b00001110, //7 + 0b11111110, //8 + 0b01111110 //9 +}; + +void clear_SR_Buffer(void) { + for (uint8_t i = 0; i < 6; i++) { + SR_Buffer[i] = 0; + } +} + +void print_SR_Buffer(void) { + PORTC &= ~(LATCH_SR); + + for (uint8_t i = 0; i < 6; i++) { + SPDR = SR_Buffer[i]; + while (!(SPSR & (1 << SPIF))); //warten auf transferabschluss + } + PORTC |= LATCH_SR; +} + +int8_t parse_nmea_gps(char input_string[RX_INPUT_BUFFER_SIZE], uint8_t output_buffer[3]){ char* token = strsep(&input_string, ","); if(!strcmp("$GPRMC", token)){ char* time = strsep(&input_string, ","); if(!strlen(time)){ // no valid time available - return -1; + return -2; } // craft bcd values @@ -53,199 +65,129 @@ uint8_t parse_nmea_gps(char input_string[RX_INPUT_BUFFER_SIZE], uint8_t output_b return 0; } + return -1; } int main(void){ - setup(); - - while(1){ - _delay_ms(500); - - check_dip_switches(); - check_buttons(); - - uint32_t clock = DS3231_read(); - for(uint8_t i=0; i < 6; i++){ - SR_Buffer[5-i] = number_Font[clock & 0x0F]; - clock = clock >> 4; + setup(); + + while(1){ + _delay_ms(200); + + check_dip_switches(); + + uint8_t clock[3]; + DS3231_read(clock); + for(uint8_t i=0; i < 3; i++){ + SR_Buffer[5-(2*i)] = number_Font[clock[i] & 0x0F]; + SR_Buffer[5-(2*i)-1] = number_Font[(clock[i] & 0xF0)>>4]; + } + print_SR_Buffer(); } - print_SR_Buffer(); - } } void check_dip_switches() { - if (PINB & DIP_1) { - PORTC |= ENABLE_TUBE_PSU; - PORTA &= ~ENABLE_TUBE_SUPPLY; - // PORTB |= STATUS_LED_B; - } else { - PORTC &= ~(ENABLE_TUBE_PSU); - PORTA |= (ENABLE_TUBE_SUPPLY); - // PORTB &= ~STATUS_LED_B; - } + if (PINB & DIP_1) { + PORTC |= ENABLE_TUBE_PSU; + PORTA &= ~ENABLE_TUBE_SUPPLY; + // PORTB |= STATUS_LED_B; + } else { + PORTC &= ~(ENABLE_TUBE_PSU); + PORTA |= (ENABLE_TUBE_SUPPLY); + // PORTB &= ~STATUS_LED_B; + } } -void check_buttons(){ - if((PINC & BUTTON_A)){ - // PORTB &= ~STATUS_LED_C; - } -}; - void setup(){ - - DDRA = ENABLE_TUBE_SUPPLY; + + DDRA = ENABLE_TUBE_SUPPLY; DDRB = STATUS_LED_B - | STATUS_LED_C - | MOSI - | CLK; + | STATUS_LED_C + | MOSI + | CLK; DDRC = LATCH_SR - | ENABLE_SR - | DOT - | ENABLE_TUBE_PSU; + | ENABLE_SR + | DOT + | ENABLE_TUBE_PSU; DDRD = RESET_SR - | TUBE_LED; + | TUBE_LED; - - //-------------------------- - // SPI - //-------------------------- + //-------------------------- + // SPI + //-------------------------- SPCR = (1 << SPE) | //enable SPI - (1 << MSTR) | //SPI als Master starten - (1 << SPR0) | //clock-prescaler LSB - (1 << SPR1) | //clock-prescaler MSB - (0 << SPIE) | //complete transfer/ recive interrupt - (0 << CPOL) | - (0 << CPHA) | - (0 << DORD); //MSB first = 0 + (1 << MSTR) | //SPI als Master starten + (1 << SPR0) | //clock-prescaler LSB + (1 << SPR1) | //clock-prescaler MSB + (0 << SPIE) | //complete transfer/ recive interrupt + (0 << CPOL) | + (0 << CPHA) | + (0 << DORD); //MSB first = 0 SPSR = (1 << SPI2X);// | //clock- prescaler double speed PORTC &= ~LATCH_SR; //latch low, sonst startet SPI nicht PORTC |= LATCH_SR; PORTD |= RESET_SR; //Setzte Reset auf HIGH (active LOW) PORTC &= ~(ENABLE_SR); //Aktiviert Shiftregister (active LOW) - - - - //-------------------------- - // Externe Interrupts - //-------------------------- - //External Interrupt Mask Register - - EIMSK |= (1 << INT0) | //Aktiviere Interrupt INT0 - (1 << INT1); //Aktiviere Interrupt INT1 - - //External Interrupt Control Register A - EICRA |= (0 << ISC10) | //Interrupt bei jedem Pegelwechsel auf INT1 - (1 << ISC11) | - (1 << ISC00) | //Interrupt bei jedem Pegelwechsel auf INT0 - (1 << ISC01); - //Pin Change Interrupt Control Register - PCICR |= (1 << PCIE2); //Enabled PCINT16-23 als mögliche Signalquelle für Interrupt - - //Pin Change Mask Register 2 - //PCMSK2 |= (1 << PCINT18) | //PCINT18 als Signalquelle wählen - // (1 << PCINT19); //PCINT19 als Signalquelle wählen - - - //-------------------------- - // Timer + Zeitinterrupts - //-------------------------- - - //PWM-Timer - //OC2A set when upcounting, clear when down counting - TCCR2A = (1< 10){ - animationtimer= 0; - offset++; - PORTB ^= STATUS_LED_B; - if(offset > 15){ - offset = 0; - } - } } //Encoder rotate ISR(INT0_vect) { - if (PIND & ENCODER_B) { - // set_PWM_duty(duty--); - } else { - // set_PWM_duty(duty++); - } + if (PIND & ENCODER_B) { + printf("step-\n\r"); + OCR2A--; + } else { + OCR2A++; + printf("step+\n\r"); + } } //Encoder Button ISR(INT1_vect) { - + printf("button\n\r"); } - ISR(USART0_RX_vect) { static char async_input_buffer[RX_INPUT_BUFFER_SIZE]; @@ -259,15 +201,15 @@ ISR(USART0_RX_vect) else if(async_buffer_pointer > 0){ async_input_buffer[async_buffer_pointer] = 0; // Null terminate string async_buffer_pointer=0; - uint8_t bcd_time[3]; - - /* write to RTC if time is valid */ - if(!parse_nmea_gps(async_input_buffer, bcd_time)){ - DS3231_write(bcd_time); + uint8_t gps_time[3]; + int8_t err = parse_nmea_gps(async_input_buffer, gps_time); + if(!err){ PORTB |= STATUS_LED_C; - } else { - PORTB &= ~STATUS_LED_C; + //if(rtc_time[0] != gps_time[0] || rtc_time[1] != gps_time[1] || rtc_time[2] != gps_time[2]) + DS3231_write(gps_time); } + else if(err == -2) + PORTB &= ~STATUS_LED_C; } } diff --git a/code/src/print.c b/code/src/print.c deleted file mode 100644 index d90c2c1..0000000 --- a/code/src/print.c +++ /dev/null @@ -1,124 +0,0 @@ -#include "pinout.h" -#include "print.h" -#include -#include -#include - -const unsigned char number_Font[10] = { 0b11011110, //0 - 0b00000110, //1 - 0b11101010, //2 - 0b01101110, //3 - 0b00110110, //4 - 0b01111100, //5 - 0b11111100, //6 - 0b00001110, //7 - 0b11111110, //8 - 0b01111110 //9 - }; -const unsigned char character_Font[26] = {0b10111110, //A - 0b11110100, //b - 0b11100000, //c - 0b11100110, //d - 0b11111000, //e - 0b10111000, //F - 0b11011100, //G - 0b10110100, //h - 0b00000100, //i - 0b01000110, //J - 0b10111100, //K - 0b11010000, //L - 0b10011110, //M - 0b10100100, //n - 0b11100100, //o - 0b10111010, //P - 0b00111110, //q - 0b10100000, //r - 0b01111100, //S - 0b11110000, //t - 0b11000100, //u - 0b11000100, //v - 0b11010110, //W - 0b10110110, //X - 0b01110110, //Y - 0b11100110 //Z - }; -const unsigned char blank = 0b00000000; //zeigt nichts an -const unsigned char minus = 0b00100000; //zeigt '-' an -const unsigned char dot = 0b00000001; //aktiviert Dezimalpunkt -unsigned char SR_Buffer[6] = {0b11100110, - 0b11100110, - 0b11100110, - 0b11100110, - 0b11100110, - 0b11100110}; - - - -void clear_SR_Buffer() { - for (uint8_t i = 0; i < 6; i++) { - SR_Buffer[i] = blank; - } -} - -void add_Decimal_Point_to_SR_Buffer(int pos){ - SR_Buffer[pos-1] += dot; -} - -void print_SR_Buffer() { - PORTC &= ~(LATCH_SR); - - for (int i = 0; i < 6; i++) { - SPDR = SR_Buffer[i]; - //SPDR = 0b11100110; - //_delay_us(100); - while (!(SPSR & (1 << SPIF))); //warten auf transferabschluss - } - PORTC |= LATCH_SR; - //_delay_ms(1); - //PORTC &= ~(LATCH_SR); -} - -void print_String(char* string){ - for(int i = 0; i < 6; i++){ - add_ASCII_to_SR_Buffer(string[i],i); - } - print_SR_Buffer(); -} - - -void add_ASCII_to_SR_Buffer(unsigned char character, int pos) { - int ascii_offset = 0; - - if((character > 46) && (character < 57)){ //Char ist Zahl - ascii_offset = 48; - SR_Buffer[pos] = number_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Zahl mit Font Index übereinstimmen - }else if (character > 95 && character < 122) { //Buchstabe ist kleiner Buchstabe - ascii_offset = 97; - SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen - } else if (character > 64 && character < 91){ //Buchstabe groß Buchstabe - ascii_offset = 65; - SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen - } else if (character == 32){ //Charakter ist Blank ' ' - SR_Buffer[pos] = blank; - } else if (character == 45){ //Charakter ist Minus - - SR_Buffer[pos] = minus; - } - -} - -void add_Character_to_SR_Buffer(unsigned char character, int pos) { - int ascii_offset = 0; - - if (character > 96 && character < 122) { //Buchstabe ist kleiner Buchstabe - ascii_offset = 97; - SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen - } else if (character > 65 && character < 91){ //Buchstabe groß Buchstabe - ascii_offset = 65; - SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen - } - -} - -void add_Number_to_SR_Buffer(int number, int pos) { - SR_Buffer[pos-1] = number_Font[number]; -}