All pastes #838115 Raw Edit

Stuff

public text v1 · immutable
#838115 ·published 2007-12-30 03:27 UTC
rendered paste body
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/io.h>

#define F_CPU 1000000UL  // 1 MHz
#include <util/delay.h>

#define GETBIT( pattern, bit ) ( ( pattern >> bit ) & 1 )
#define SETBIT( pattern, bit ) ( pattern |= ( 1 << bit ) )
#define CLRBIT( pattern, bit ) ( pattern &= ~( 1 << bit ) )
#define FLPBIT( pattern, bit ) ( pattern ^= ( 1 << bit) )

#define TIMER_CLK_DIV8			0x02	///< Timer clocked at F_CPU/8
#define TIMER_CLK_DIV64			0x03

#define TIMER0PRESCALE		TIMER_CLK_DIV8
#define TIMER1PRESCALE		TIMER_CLK_DIV64	
#define TIMER_PRESCALE_MASK		0x07

typedef unsigned char  u08;
typedef unsigned short u16;

typedef void (*funcptr)(void);

struct threaddata {
	u08 enabled;
	u08 id;

	u16 sp;
	u08 sreg;
	u08 pointers[6];
	u08 registers[32];

	funcptr entry;

};

u16 my_threads = 0;
struct threaddata threads[5];
struct threaddata *currthread = threads;



int launchThread ( funcptr entry )
{
	++my_threads;
	threads[my_threads].entry = entry;
	return my_threads;
}

void timer1Init(u08 prescale, u16 topcount)
{
	// set prescaler on timer 1
	TCCR1B = (TCCR1B & ~TIMER_PRESCALE_MASK) | prescale;

	// reset TCNT1
	TCNT1H = 0;
	TCNT1L = 0;

	// enable TCNT1 overflow
	SETBIT(TIMSK, TOIE1);

	// set PWM mode with ICR top-count
	CLRBIT(TCCR1A,WGM10);
	SETBIT(TCCR1A,WGM11);
	SETBIT(TCCR1B,WGM12);
	SETBIT(TCCR1B,WGM13);
	
	// set top count value
	ICR1H = (u08)(topcount>>8);
	ICR1L = (u08)topcount;
}

void launchThread1 ( )
{
	++my_threads;
	//threads[my_threads].entry = entry;
	threads[my_threads].id = 42;
}




void thread1 ()
{
	while( 1 )
	{
		_delay_ms( 100 );
		FLPBIT( PORTC, PC3 );
	}
}

void thread2 ()
{
	while( 1 )
	{
		_delay_ms( 150 );
		FLPBIT( PORTC, PC2 );
	}
}


int main( void )
{
//	SETBIT( DDRC, DDC5 );

	timer1Init( TIMER_CLK_DIV8, 1000);

	threads[0].enabled = 1;

	launchThread1( );
	launchThread( thread1 );
//	launchThread( thread2 );

	timer1Init( TIMER_CLK_DIV8, 500);

	sei();	// enable interrupts

//	sleep_enable();
//	sleep_cpu();;	cli()	// disable interrupts
//	sleep_disable();

	while( 1 ) {
	
		_delay_ms( 100 );
	}
	return 0;
}

//! Interrupt handler for tcnt1 overflow interrupt
SIGNAL(SIG_OVERFLOW1)
{
	if( 0 != currthread )
	{
		currthread->sp = SP;
		currthread->sreg = SREG;

		currthread->entry = threads[0].entry;
//		currthread->registers[0] = r10;
	}

	FLPBIT( PORTC, PC5 );
}