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">&lt;<a href="mailto:krezac@gmail.com">krezac@gmail.com</a>&gt;</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 (&#39;i&#39; 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   ///&lt; UART Receive Port<br>
#define UARTSW_RX_DDR                   DDRD    ///&lt; UART Receive DDR<br>
#define UARTSW_RX_PORTIN                PIND    ///&lt; UART Receive Port Input<br>
#define UARTSW_RX_PIN                   PD3     ///&lt; 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 &amp;= ~(1&lt;&lt;UARTSW_RX_PIN);<br>
        UARTSW_RX_PORT &amp;= ~(1&lt;&lt;UARTSW_RX_PIN);<br>
<br>
         // initialize timer 2<br>
        TCNT2 = 0;<br>
        TCCR2 = (1&lt;&lt;CS22); // normal mode 1:64 prescaler<br>
<br>
        //PORTD |= (1&lt;&lt; PD2);<br>
        // setup the receiver<br>
        // OC2 interrupt disabled<br>
        TIMSK &amp;= ~(1&lt;&lt;OCIE2);<br>
        // INT0 trigger on rising/falling edge<br>
        MCUCSR |= (1&lt;&lt;ISC11);   // non-invert: falling edge<br>
        // enable INT1 interrupt<br>
        GICR |= (1&lt;&lt;INT1);<br>
}<br>
<br>
ISR(INT1_vect) {<br>
        PORTB ^= (1&lt;&lt;PB4);<br>
        // this must be is a start bit<br>
<br>
        // disable INT1 interrupt<br>
        GICR &amp;= ~(1&lt;&lt;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&lt;&lt;OCF2);<br>
        // enable OC0 interrupt<br>
        TIMSK |= (1&lt;&lt;OCIE2);<br>
        // reset bit counter<br>
        UartswRxBitNum = 0;<br>
        // reset data<br>
        UartswRxData = 0;<br>
}<br>
<br>
ISR(TIMER2_COMP_vect) {<br>
        PORTB ^= (1&lt;&lt;PB4);<br>
        // start bit has already been received<br>
        // we&#39;re in the data bits<br>
<br>
        // shift data byte to make room for new bit<br>
        UartswRxData = UartswRxData&gt;&gt;1;<br>
<br>
        // sample the data line<br>
        if( (UARTSW_RX_PORTIN &amp; (1&lt;&lt;UARTSW_RX_PIN)) ) // non-inverting<br>
        {<br>
                // serial line is marking<br>
                // record &#39;1&#39; 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 &gt;= 8)<br>
        {<br>
                // call handler<br>
                // g_handler(UartswRxData);<br>
                UDR = UartswRxData;<br>
                // disable OC0 interrupt<br>
                TIMSK &amp;= ~(1&lt;&lt;OCIE2);<br>
                // clear INT1 interrupt flag<br>
                GIFR = (1&lt;&lt;INTF1);<br>
                // enable INT interrupt<br>
                GICR |= (1&lt;&lt;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>