commit 3b0e8e4dec4868f924a6f9e933f9f2204a88eae3 Author: wolfgang Date: Sat Jan 19 15:41:24 2013 +0100 initial diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..2476cd7 --- /dev/null +++ b/.cproject @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..1809849 --- /dev/null +++ b/.project @@ -0,0 +1,27 @@ + + + MyClock + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + de.innot.avreclipse.core.avrnature + + diff --git a/.settings/de.innot.avreclipse.core.prefs b/.settings/de.innot.avreclipse.core.prefs new file mode 100644 index 0000000..85c77fc --- /dev/null +++ b/.settings/de.innot.avreclipse.core.prefs @@ -0,0 +1,28 @@ +avrtarget/ClockFrequency=16000000 +avrtarget/ExtRAMSize=0 +avrtarget/ExtendedRAM=false +avrtarget/MCUType=atmega32 +avrtarget/UseEEPROM=false +avrtarget/UseExtendedRAMforHeap=true +avrtarget/avrdude/BitBangDelay= +avrtarget/avrdude/Bitclock=5 +avrtarget/avrdude/EEPROMFile= +avrtarget/avrdude/EEPROMFromConfig=true +avrtarget/avrdude/FlashFile= +avrtarget/avrdude/FlashFromConfig=true +avrtarget/avrdude/Fuses/ByteValues=238\:217 +avrtarget/avrdude/Fuses/FileName= +avrtarget/avrdude/Fuses/MCUid=atmega32 +avrtarget/avrdude/Fuses/UseFile=false +avrtarget/avrdude/Fuses/Write=true +avrtarget/avrdude/NoChipErase=false +avrtarget/avrdude/NoSigCheck=false +avrtarget/avrdude/NoVerify=false +avrtarget/avrdude/NoWrite=false +avrtarget/avrdude/OtherOptions= +avrtarget/avrdude/ProgrammerID=programmerconfig.2 +avrtarget/avrdude/UseCounter=false +avrtarget/avrdude/WriteEEPROM=false +avrtarget/avrdude/WriteFlash=true +avrtarget/perConfig=false +eclipse.preferences.version=1 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..2b8bd96 --- /dev/null +++ b/src/main.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include + +#include "uartdrv.h" + + + +typedef struct clock_s { + uint8_t hour; + uint8_t minute; + uint8_t second; +} clock_t; + +volatile clock_t clock; +volatile uint8_t tick; +volatile uint16_t captValue = 0; +volatile uint16_t gapValue = 0; + +ISR(TIMER2_OVF_vect) { + //tick = 1; + + clock.second++; + if (clock.second >= 60) { + clock.second = 0; + clock.minute++; + } + if (clock.minute >= 60) { + clock.minute = 0; + clock.hour++; + } + if (clock.hour >= 24) { + clock.hour = 0; + } +} + +ISR(INT0_vect) { + uint16_t tmpCnt = TCNT1; + gapValue = tmpCnt - captValue; + TCNT1 = 0; +} + +ISR(INT1_vect) { + captValue = TCNT1; + tick = 1; +} + + +int main() { + uartdrvInit(); + + clock.hour = 0; + clock.minute = 0; + clock.second = 0; + + + TCCR2 = 0b00000101; + ASSR |= (1 << AS2); + TIMSK |= (1 << TOIE2) | (1 << TICIE1); + + TCCR1A = 0; + TCCR1B = (1 << CS12) | (1 << CS10); + + PIND &= ~(1 << PD2); + PIND &= ~(1 << PD3); + PORTD |= (1 << PD2) | (1 << PD3); + + MCUCR |= (1 << ISC11) | (1 << ISC10) | (1 << ISC01); + GICR |= (1 << INT0) | (1 << INT1); + + + sei(); + + printf("Hello world!\n"); + + + uint8_t start = 0; + uint8_t bit = 0; + + while (1) { + if (tick != 0) { + tick = 0; + + uint16_t pulse = (((uint32_t) captValue) * 1000) / 15625; + uint16_t gap = (((uint32_t) gapValue) * 1000) / 15625; + + if (gap > 1500) { + start = 1; + clock.second = 0; + } + + if (pulse > 70 && pulse < 130) { + bit = 0; + } else if (pulse > 170 && pulse < 230) { + bit = 1; + } else { + bit = 2; + } + + printf("%02d %02d %02d %u %u %u %u \n", clock.hour, clock.minute, clock.second, start, bit, pulse, gap); + + + + start = 0; + //printf("tick\n"); + } + } +} + diff --git a/src/uartdrv.c b/src/uartdrv.c new file mode 100644 index 0000000..0bf09b7 --- /dev/null +++ b/src/uartdrv.c @@ -0,0 +1,93 @@ +#include +#include +#include + +#include "uartdrv.h" +#include "debug.h" + + +volatile uartdrvCmdBuf_t uartdrvCmdBuf; + + + + +void uartdrvInit() { + + // UART + // TXD + DDRD |= (1 << PD1); + + // transmitter enable + UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE); + // 8 data bit, no parity, 1 stop bit + UCSRC = (1 << UCSZ1) | (1 << UCSZ0); + // 19200 Baud @ 16MHz + UBRRL = 51; + UBRRH = 0; + FILE *mystdout = fdevopen(uartdrvPutchar, NULL); + stdout = mystdout; + + uartdrvCmdBuf.idx = 0; + uartdrvCmdBuf.cmd = 0; + uartdrvCmdBuf.cmdStart = 0; + uartdrvCmdBuf.cmdDelay = 0; + uartdrvCmdBuf.cmdReady = 0; +} + +void uartdrvWrite(uint8_t o) { + loop_until_bit_is_clear(PIND, PD2); + loop_until_bit_is_set(UCSRA, UDRE); + UDR = o; +} + + +int uartdrvPutchar(char c, FILE *stream) { + if (c == '\n') + uartdrvPutchar('\r', stream); + uartdrvWrite((uint8_t) c); + return 0; +} + +void uartdrvCmdCycle() { + if (uartdrvCmdBuf.cmdStart == 1) { + uartdrvCmdBuf.cmdDelay++; + if (uartdrvCmdBuf.cmdDelay > UART_CMD_CYCLES) { + uartdrvCmdBuf.idx = 0; + uartdrvCmdBuf.cmdStart = 0; + uartdrvCmdBuf.cmdDelay= 0; + // myPrintf("clear invalid cmd\n"); + } + } +} + +void uartdrvCmdReceived() { + uartdrvWrite(0x7f); + uartdrvWrite(uartdrvCmdBuf.cmd); + uartdrvWrite(0); + uartdrvWrite(0); + uartdrvWrite(0); +} + +ISR(USART_RXC_vect) { + uint8_t c = UDR; + if (uartdrvCmdBuf.cmdReady != 1) { + if (uartdrvCmdBuf.idx == 0) { + uartdrvCmdBuf.cmdStart = 1; + uartdrvCmdBuf.cmd = c; + uartdrvCmdBuf.idx++; + } else if (uartdrvCmdBuf.idx >= 1 && uartdrvCmdBuf.idx <= UART_CMD_BUF_SIZE) { + uartdrvCmdBuf.buf[uartdrvCmdBuf.idx - 1] = c; + uartdrvCmdBuf.idx++; + } + + if (uartdrvCmdBuf.idx == (UART_CMD_BUF_SIZE + 1)) { + + uartdrvCmdBuf.idx = 0; + uartdrvCmdBuf.cmdStart = 0; + uartdrvCmdBuf.cmdDelay = 0; + uartdrvCmdBuf.cmdReady = 1; + } + } +} + + diff --git a/src/uartdrv.h b/src/uartdrv.h new file mode 100644 index 0000000..ee7f544 --- /dev/null +++ b/src/uartdrv.h @@ -0,0 +1,32 @@ +#ifndef UARTDRV_H_ +#define UARTDRV_H_ + +#include +#include + + +#define UART_CMD_BUF_SIZE 4 +#define UART_CMD_CYCLES 10 + +typedef struct uartdrvCmdBuf_s { + uint8_t idx; + uint8_t cmdStart; + uint8_t cmdDelay; + uint8_t cmdReady; + uint8_t cmd; + uint8_t buf[UART_CMD_BUF_SIZE]; +} uartdrvCmdBuf_t; + + +extern void uartInitCallback(); +extern void uartWriteCallback(uint8_t o); + +int uartdrvPutchar(char c, FILE *stream); +void uartdrvInit(); +void uartdrvWrite(uint8_t o); + +void uartdrvCmdCycle(); + +void uartdrvCmdReceived(); + +#endif /* UARTDRV_H_ */