Portál AbcLinuxu, 4. května 2025 23:08

Dotaz: Problem s IRQ v AVR

31.3.2006 15:13 David Sedláček | skóre: 20 | Žďár nad Sázavou
Problem s IRQ v AVR
Přečteno: 672×
Odpovědět | Admin
Zdravim.

Mam jednoduchy program viz. nize. Ovsem problem je, kdyz se snazim prijmout znak pomoci preruseni generovaneho pri zaplneni prijimaciho bufferu (prijaty znak).

Kdyz nadefinuji makro SIGNAL(SIG_UART_RECV), pri prijeti znaku vsechno zatuhne- respektive cip nejevi znamky prace. Pritom by mel znak prijmout, ulozit a opet se vratit k posledni operaci, nemylim-li se?

Cip je ATtiny2313.

#include < avr/io.h>
#include < stdlib.h>
#include < util/delay.h>
#include < avr/interrupt.h>
#include < avr/pgmspace.h>

#define F_CPU 8000000
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define DATA_1	PB0	//1. pin s prevodnikem
#define DATA_2	PB1
#define CLK	PB7
#define CS	PB6
#define U_REF	5000
#define AD_const (U_REF/256)

typedef unsigned char uc8;
typedef unsigned int ui16;

void usart_transmit(uc8 data);
void usart_transmit_string(const char *s);
void zmerit_u(void);

uc8 newline='\n', c;

void zmerit_u(void)
{
    uc8 i, bity, hodnota1, hodnota2, buffer[10];

    sbi(PORTB,CS);
    _delay_ms(20);
    cbi(PORTB,CS);
    for(i=0,hodnota1=0, hodnota2=0, bity=128;i<8;i++)
    {
        if(bit_is_set(PINB,DATA_1))
    	    hodnota1+=bity;
	if(bit_is_set(PINB,DATA_2))
	    hodnota2+=bity;
	bity>>=1;
	sbi(PORTB,CLK);
	cbi(PORTB,CLK);
    }
    usart_transmit(newline);
    usart_transmit_string(itoa((hodnota1*AD_const), buffer, 10));
    usart_transmit(newline);
    usart_transmit_string(itoa((hodnota2*AD_const), buffer, 10));
}

void usart_transmit(uc8 data)
{
    while(!(UCSRA & (1<< UDRE)));	//pockame na vyprazdneni vysilaciho bufferu
    UDR=data;
}



void usart_transmit_string(const char *s)
{
    register uc8 ch;
    while(ch=*s++)
    {
	usart_transmit(ch);
    }
}

uc8 usart_receive()
{
    while(!(UCSRA&(1<< RXC)));
    return UDR;
}

SIGNAL(SIG_UART_RECV)
{
    c=usart_receive();
}

void main (void)
{
    /*nastavime vstupne vystupni porty*/
    sbi(DDRB,CLK); /*enable port 9 for output*/
    sbi(DDRB,CS);
    sbi(DDRB,PD2);
    cbi(DDRB,DATA_1);
    cbi(DDRB,DATA_2);
    UBRRH=0;
    UBRRL=51;
    UCSRB=(1<< TXEN)|(1<< RXEN)|(1<< RXCIE);
//    UCSRC=(1<< USBS)|(3<< UCSZ0);
sei();
    
    usart_transmit_string("#Starting Ronjamon..\n");
    while(1)
    {
	if(c=='z') zmerit_u();
	else if(c=='h') usart_transmit_string("Ronjamon, sith@wifistar.net\n");
	cbi(PORTB,PD2);
	_delay_ms(1000);
	sbi(PORTB,PD2);
	_delay_ms(1000);
    }
}
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

31.3.2006 18:09 RTOS | skóre: 6
Rozbalit Rozbalit vše Re: Problem s IRQ v AVR
Odpovědět | | Sbalit | Link | Blokovat | Admin
Skus mcu.cz, protože tento dotaz nemá nic společné s PC.
In God We Trust, Inc.
27.11.2006 20:23 Bert | skóre: 15
Rozbalit Rozbalit vše Re: Problem s IRQ v AVR
www.mcu.cz je uz delsi dobu z duvodu nemoci nedostupne.
7.12.2006 14:27 olis
Rozbalit Rozbalit vše Re: Problem s IRQ v AVR
skus mcu.phorum.cz
27.11.2006 18:39 tali
Rozbalit Rozbalit vše Re: Problem s IRQ v AVR
Odpovědět | | Sbalit | Link | Blokovat | Admin
nemalo vy to byt takto?

SIGNAL (SIG_UART_RECV) { // USART RX interrupt

unsigned char c;

c = UDR;

usart_receive();

}
27.2.2009 16:14 xurpha
Rozbalit Rozbalit vše Re: Problem s IRQ v AVR
Odpovědět | | Sbalit | Link | Blokovat | Admin

No, asi je uz pozde na odpoved, ale presto: neni blbost jeste testovat bit UDRE, kdyz jsme v preruseni? Pokud preruseni nastalo, tak je jasne, ze ceka v UDR dalsi byte prijaty z UARTu...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.