atmega16 idozito megszakitas winavr-ben

Bamer Balazs bamer at db.bme.hu
Thu Nov 24 09:15:50 CET 2005


Szervusz Lista!

Atmega16-ra próbáltam egyszerű mórickaprogit írni az időzítés 
és a HALL érzékelő beolvasásának kipróbálására WinAVR-ben. Az egyszerűbbik 
példaprogramjukat alakítottam át (ez működött is, avarice-s letöltés jó), 
a cél 1 Hz-es ill. 4 Hz-es villogás volt (Hallal átkapcsolhatóan) 4 MHz 
belső RC oszci mellett. RTFM megvolt, kétszer nekifutottam, de nem tudom, 
hol a hiba (nem csinál semmit). Ja, a h és hall változók összehasonlítása 
azért van így, hogy egy jumperrel is lehessen sebességet váltani (-:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

enum { UP, DOWN };
volatile uint8_t direction,hall;

SIGNAL (SIG_OVERFLOW1)
{
 	uint8_t h;
     switch (direction)
     {
         case UP:
                 direction = DOWN;
 		PORTB=_BV(PB5);
             break;
         case DOWN:
                 direction = UP;
 		PORTB=0;
             break;
     }
 	h=PINC;
 	if(h<hall)
 		TCCR1B = _BV (WGM12) | _BV(CS12) | _BV(CS10); //CTC :1024
 	if(h>hall)
 		TCCR1B = _BV (WGM12) | _BV(CS12); //CTC :256
 	hall=h;
}

void ioinit (void)
{
 	unsigned char sreg;
 	sreg=SREG;
 	cli();
     TCCR1A = 0;
     TCCR1B = _BV (WGM12) | _BV(CS12) | _BV(CS10); //CTC :1024
 	TCNT1=0;
 	OCR1A=1952;
     DDRB = _BV (PB5);
     timer_enable_int (_BV (OCIE1A));
     sei ();
}

int main (void)
{
     ioinit ();
     for (;;);
     return (0);
}

 							köszi: Balázs




More information about the Elektro mailing list