I'm using Arduino's timer 1 with compare match interrupt. I'm trying to send a character over Arduino pin 8.
This is my sending function:
void transmit()
{
if (txBuffer & 0b1) {
digitalWrite(txPin, HIGH);
}
else {
digitalWrite(txPin, LOW);
}
txBuffer >>= 1;
if (txBuffer == 0)
{
digitalWrite(txPin, HIGH);
TIMSK1 &= ~_BV(OCIE1A); //detach
}
}
Now when i try to send 'm' from the txBuffer for example it's 0b01101101 in binary but my code only sends 0b1101101 so, when i try to send the stop bit it adds the 1 to the data bits instead of the stop bit so the send character is not right when i check the output with putty. How do i write my code so my transmitter sends the full byte.
I attached the full code if you want to take a look.
UARTFirstDraft.ino (1.47 KB)
#include "arduino.h"
#include <stdint.h>
#include <inttypes.h>
#define Fosc 16000000
int rxPin = 7;
int txPin = 8;
uint8_t txBuffer;
void setup() {
Serial.begin(9600);
pinMode(txPin, OUTPUT);
pinMode(rxPin, INPUT);
setupInterrupts(9600);
}
void loop() {
ReadMessage();
}
void setupInterrupts(long baud)
{
long cmr = ((Fosc / (64 * baud)) - 1); //compare match register
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0; //counter value to 0
OCR1A = cmr;
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS11) | (1 << CS10); // Set bits for 64 prescaler
//TIMSK1 = _BV(OCIE1A); //attach
interrupts();
}
ISR(TIMER1_COMPA_vect)
{
transmit();
}
void transmit()
{
if (txBuffer & 0b1) {
digitalWrite(txPin, HIGH);
Serial.println("1");
}
else {
digitalWrite(txPin, LOW);
Serial.println("0");
}
txBuffer >>= 1;
if (txBuffer == 0)
{
digitalWrite(txPin, HIGH);
TIMSK1 &= ~_BV(OCIE1A); //detach
}
}
bool getParity(unsigned int n)
{
bool parity = 0;
while (n)
{
parity = !parity;
n = n & (n - 1);
}
return parity;
}
int incomingByte;
void ReadMessage() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
char receivedCharacter = (char) incomingByte;
txBuffer = receivedCharacter;
Serial.println((char)txBuffer);
Serial.println(txBuffer, BIN);
TIMSK1 = _BV(OCIE1A); //attach
}
}
6v6gt
May 29, 2020, 2:50pm
3
void transmit()
{
if (txBuffer & 0b1) {
digitalWrite(txPin, HIGH);
}
else {
digitalWrite(txPin, LOW);
}
txBuffer >>= 1;
if (txBuffer == 0) // what happens if txBuffer contains for example 0b00000111 ?
// does this terminate it prematurely ?
{
digitalWrite(txPin, HIGH);
TIMSK1 &= ~_BV(OCIE1A); //detach
}
}
6v6gt:
void transmit()
{
if (txBuffer & 0b1) {
digitalWrite(txPin, HIGH);
}
else {
digitalWrite(txPin, LOW);
}
txBuffer >>= 1;
if (txBuffer == 0) // what happens if txBuffer contains for example 0b00000111 ?
// does this terminate it prematurely ?
{
digitalWrite(txPin, HIGH);
TIMSK1 &= ~_BV(OCIE1A); //detach
}
}
Oh yeah you are right. I fixed it by just counting the databits that were sent, and making sure it is always 8. Thanks