#include #include #undef __AVR_ENHANCED__ #include #include #include #define F_CPU 10.0E6 // 10 MHz #include #include "data.h" typedef uint8_t u8; extern inline void smalldelay(unsigned char count) { unsigned char counter; counter = count; __asm__ __volatile__ ( "\t" "dec %0" "\n" "\t" "brne .-4" "\n" : /* outputs */ "+r" (counter) ); } void bigdelay(uint8_t a) { while(--a) { smalldelay(255); } } // 240 works well on the board, at 3.7MHz // the internal RC oscillator runs at 1MHz, so make this 65 // CLKSEL = 0100-0010 0010 // oh, guess what, it was already using that. So 240 works for 1MHz. #define DELAY 240 #define setb(value) PORTB = (PORTB & 0xfe) | (value & 0x01) int main(void) { uint8_t counter = 0; uint8_t current; DDRB = 0x07; PORTB = 0xff; PORTB &= ~0x04; while(1) { PORTB ^= 0x02; current = pgm_read_byte_near(data + counter); //current = __LPM_classic__((uint16_t)(data + counter)); counter++; if (counter >= sizeof(data)) { counter = 0; PORTB &= ~0x04; } // now loop through all 8 bits setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); setb(current); current >>= 1; bigdelay(DELAY); PORTB |= 0x04; } }