123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #include "SoftUART.h"
- static uint8_t TX_BitsRemaining;
- static uint8_t TX_Data;
- static uint8_t RX_BitsRemaining;
- static uint8_t RX_Data;
- void SoftUART_Init(void)
- {
-
- STXPORT |= (1 << STX);
- STXDDR |= (1 << STX);
- SRXPORT |= (1 << SRX);
-
- EICRA = (1 << ISC01);
- EIMSK = (1 << INT0);
-
- SoftUART_SetBaud(9600);
-
- TIMSK1 = (1 << OCIE1A);
-
- TIMSK3 = (1 << OCIE3A);
- TCCR3B = ((1 << CS30) | (1 << WGM32));
- }
- ISR(INT0_vect, ISR_BLOCK)
- {
-
- RX_BitsRemaining = 8;
-
- TCNT1 = -(OCR1A >> 1);
-
- if (!(SRXPIN & (1 << SRX)))
- {
-
- EIMSK = 0;
-
- TCCR1B = ((1 << CS10) | (1 << WGM12));
- }
- }
- ISR(TIMER1_COMPA_vect, ISR_BLOCK)
- {
-
- uint8_t SRX_Cached = (SRXPIN & (1 << SRX));
-
- if (RX_BitsRemaining)
- {
-
- RX_Data >>= 1;
- RX_BitsRemaining--;
-
- if (SRX_Cached)
- RX_Data |= (1 << 7);
- }
- else
- {
-
- TCCR1B = 0;
- EIFR = (1 << INTF0);
- EIMSK = (1 << INT0);
-
- if (SRX_Cached)
- RingBuffer_Insert(&UARTtoUSB_Buffer, RX_Data);
- }
- }
- ISR(TIMER3_COMPA_vect, ISR_BLOCK)
- {
-
- if (TX_BitsRemaining)
- {
-
- if (TX_Data & (1 << 0))
- STXPORT &= ~(1 << STX);
- else
- STXPORT |= (1 << STX);
-
- TX_Data >>= 1;
- TX_BitsRemaining--;
- }
- else if (!(RX_BitsRemaining) && !(RingBuffer_IsEmpty(&USBtoUART_Buffer)))
- {
-
- STXPORT &= ~(1 << STX);
-
- TX_Data = ~RingBuffer_Remove(&USBtoUART_Buffer);
- TX_BitsRemaining = 9;
- }
- }
|