Dobrý den,<br><br>mo¾ná mi unikají souvislosti ale proè v programu nemáte funci main?<br>SwUart_Init se spustí automaticky po resetu Atmega8?<br><br>Já dávám inicializace registrù do funce main a na jejím konci vkládám nekoneènou smyèku(pak u¾ to jede podle pøeru¹ení)...<br>
<br>Zdenìk<br><br><div class="gmail_quote">2010/2/6 Kamil Rezac <span dir="ltr"><<a href="mailto:krezac@gmail.com">krezac@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ahoj, pokousim se tu prihnout sw seriak (je to zalozene na rutine z<br>
avrlib) a deje se mi to, ze i kdyz na konci zpracovani bytu (interrupt<br>
z output compare casovace) vymazu (zapisem 1) flag pro externi<br>
preruseni, tak stejne nastane... V errate jsem nic nenasel, takze to<br>
urcite bude mezi zidli a klavesnici.... Na obrazku z osciloskopu je<br>
horni stopa vstup ('i' na 9600bps), dolni (PB4) se meni pri preruseni<br>
(at uz casovace nebo INT1 - viz kod). Jak je videt, nastane falesna<br>
detekce sestupne hrany - startbitu (ta spicka uprostred dolni stopy<br>
jsou dve preruseni po sobe - casovac a pak ext, odzkouseno) a tak se<br>
prijme jeste falesny byte 0xff. KJoukam do toho uz vcera cely vecer a<br>
dneska od rana a nic... :( Samozrejme by se to dalo ahakovat, ale<br>
zajima me, co je blbe...<br>
<br>
Kod a obrazek z osciloskopu prikladam<br>
Predem dik za nakopnuti<br>
KR<br>
<br>
// UART receive pin defines<br>
// This pin must correspond to the<br>
// External Interrupt 1 (INT1) pin for your processor<br>
#define UARTSW_RX_PORT PORTD ///< UART Receive Port<br>
#define UARTSW_RX_DDR DDRD ///< UART Receive DDR<br>
#define UARTSW_RX_PORTIN PIND ///< UART Receive Port Input<br>
#define UARTSW_RX_PIN PD3 ///< UART Receive Pin<br>
<br>
// calculate division factor for requested baud rate, and set it<br>
//UartswBaudRateDiv = (u08)(((F_CPU/256L)+(baudrate/2L))/(baudrate*1L));<br>
#define BAUDRATE_DIV<br>
(uint8_t)(((ROBBUS_CPU_FREQ/64)+(ROBBUS_SWUART_BAUDRATE/2L))/(ROBBUS_SWUART_BAUDRATE*1L))<br>
<br>
static PtrSwUartHandler_t g_handler;<br>
<br>
// uartsw receive status and data variables<br>
static volatile uint8_t UartswRxData;<br>
static volatile uint8_t UartswRxBitNum;<br>
<br>
static volatile uint8_t first = 1;<br>
<br>
<br>
void SwUart_Init(PtrSwUartHandler_t handler) {<br>
<br>
// initialize ports<br>
UARTSW_RX_DDR &= ~(1<<UARTSW_RX_PIN);<br>
UARTSW_RX_PORT &= ~(1<<UARTSW_RX_PIN);<br>
<br>
// initialize timer 2<br>
TCNT2 = 0;<br>
TCCR2 = (1<<CS22); // normal mode 1:64 prescaler<br>
<br>
//PORTD |= (1<< PD2);<br>
// setup the receiver<br>
// OC2 interrupt disabled<br>
TIMSK &= ~(1<<OCIE2);<br>
// INT0 trigger on rising/falling edge<br>
MCUCSR |= (1<<ISC11); // non-invert: falling edge<br>
// enable INT1 interrupt<br>
GICR |= (1<<INT1);<br>
}<br>
<br>
ISR(INT1_vect) {<br>
PORTB ^= (1<<PB4);<br>
// this must be is a start bit<br>
<br>
// disable INT1 interrupt<br>
GICR &= ~(1<<INT1);<br>
// schedule data bit sampling 1.5 bit periods from now<br>
OCR2 = TCNT2 + BAUDRATE_DIV + BAUDRATE_DIV/2;<br>
// clear OC0 interrupt flag<br>
TIFR = (1<<OCF2);<br>
// enable OC0 interrupt<br>
TIMSK |= (1<<OCIE2);<br>
// reset bit counter<br>
UartswRxBitNum = 0;<br>
// reset data<br>
UartswRxData = 0;<br>
}<br>
<br>
ISR(TIMER2_COMP_vect) {<br>
PORTB ^= (1<<PB4);<br>
// start bit has already been received<br>
// we're in the data bits<br>
<br>
// shift data byte to make room for new bit<br>
UartswRxData = UartswRxData>>1;<br>
<br>
// sample the data line<br>
if( (UARTSW_RX_PORTIN & (1<<UARTSW_RX_PIN)) ) // non-inverting<br>
{<br>
// serial line is marking<br>
// record '1' bit<br>
UartswRxData |= 0x80;<br>
}<br>
<br>
// increment bit counter<br>
UartswRxBitNum++;<br>
// schedule next bit sample<br>
OCR2 += BAUDRATE_DIV;<br>
<br>
// check if we have a full byte<br>
if(UartswRxBitNum >= 8)<br>
{<br>
// call handler<br>
// g_handler(UartswRxData);<br>
UDR = UartswRxData;<br>
// disable OC0 interrupt<br>
TIMSK &= ~(1<<OCIE2);<br>
// clear INT1 interrupt flag<br>
GIFR = (1<<INTF1);<br>
// enable INT interrupt<br>
GICR |= (1<<INT1);<br>
}<br>
}<br>
<br>_______________________________________________<br>
HW-list mailing list - sponsored by <a href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br></blockquote></div><br>