Debut of the AJ4VD QRSS Gator
⚠️ WARNING: This page is obsolete
Articles typically receive this designation when the technology they describe is no longer relevant, code provided is later deemed to be of poor quality, or the topics discussed are better presented in future articles. Articles like this are retained for the sake of preservation, but their content should be critically assessed.
I re-wrote the code from the previous entry to do several things. Once of which was to make a gator rather than a fish. It’s more appropriate since I’m planning on housing the transmitter at the University of Florida. To do it, I drew a gator in paint and wrote a python script to convert the image into a series of points. I’ll post it later. One thing to note was that size was a SERIOUS issue. I only have two thousand bytes of code, and every point of that gator was a byte, so it was a memory hog. I helped it dramatically by using repeating segments wherever possible, and some creative math to help out the best I could (i.e., the spines on the back) Here’s what it looks like, and the code below it…
#include <avr/io.h>
#include <util/delay.h>
// front top LED - PA0
// inside top LED - PA1
// inside bot LED - PA2
// front bot LED - PA3
unsigned long int t_unit; // units of time
const int tDit = 100; //units for a dit
const int tDah = 255; //units for a dah
char fsk; // degree of frequency shift to use for CW
char fsk2; // degree of frequency shift to use for HELL
char light = 0; // which lights are on/off
void delay()
{
_delay_loop_2(t_unit);
}
void blink()
{
return;
if (light == 0)
{
PORTA |= (1 << PA0); //on
PORTA |= (1 << PA1); //on
PORTA &= ~(1 << PA2); //off
PORTA &= ~(1 << PA3); //off
light = 1;
}
else
{
PORTA |= (1 << PA2); //on
PORTA |= (1 << PA3); //on
PORTA &= ~(1 << PA0); //off
PORTA &= ~(1 << PA1); //off
light = 0;
}
}
void tick(unsigned long ticks)
{
while (ticks > 0)
{
delay();
delay();
ticks--;
}
}
void pwm_init()
{
//Output on PA6, OC1A pin (ATTiny44a)
OCR1A = 0x00; //enter the pulse width. We will use 0x00 for now, which is 0 power.
TCCR1A = 0x81; //8-bit, non inverted PWM
TCCR1B = 1; //start PWM
}
void set(int freq, int dly)
{
OCR1A = freq;
tick(dly);
}
void fish()
{
char mult = 3;
char f2[] = {2, 3, 4, 5, 6, 7, 4, 3, 7, 4, 7, 7, 6, 5, 4, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 4, 5, 6, 7, 8, 4, 9, 5, 9, 6, 9, 6, 9, 6, 9, 8, 8, 7, 7, 6, 5, 4, 3, 3, 3, 4, 5, 5};
for (int i = 0; i < sizeof(f2); i++)
{
OCR1A = f2[i] * mult;
blink();
tick(20);
OCR1A = 1 * mult;
blink();
tick(20);
}
char f3[] = {1, 2, 3, 4, 3, 2};
char offset = 0;
while (offset < 9)
{
for (char j = 0; j < 3; j++)
{
for (char i = 0; i < sizeof(f3); i++)
{
char val = (f3[i] + 5 - offset) * mult;
if (val < mult || val > 10 * mult)
{
val = mult;
}
OCR1A = val;
blink();
tick(20);
OCR1A = 1 * mult;
blink();
tick(20);
}
}
offset++;
}
}
void id()
{
char f[] = {0, 0, 1, 2, 0, 1, 2, 2, 2, 0, 1, 1, 1, 1, 2, 0, 1, 1, 1, 2, 0, 2, 1, 1, 0, 0};
char i = 0;
while (i < sizeof(f))
{
blink();
if (f[i] == 0)
{
OCR1A = 0;
tick(tDah);
}
if (f[i] == 1)
{
OCR1A = fsk;
tick(tDit);
}
if (f[i] == 2)
{
OCR1A = fsk;
tick(tDah);
}
blink();
OCR1A = 0;
tick(tDit);
i++;
}
}
void slope()
{
char i = 0;
while (i < 25)
{
OCR1A = 255 - i;
i++;
}
while (i > 0)
{
i--;
OCR1A = 255 - i;
}
}
int main(void)
{
DDRA = 255;
blink();
pwm_init();
t_unit = 1000;
fsk = 10;
id(); // set to fast and ID once
//fsk=50;//t_unit = 65536; // set to slow for QRSS
t_unit = 60000;
while (1)
{
;
fish();
id();
}
return 1;
}