тужусь родить это на ассемблере за основу взял сишный код
Код: Выделить всё
char reverse_bit_order (char byte)
{
char temp = 0;
uint8_t count = 8;
do
{
}
while (--count > 0);
return byte;
}
void init_usi_uart (void)
{
PORTA |= (1 << 5);
DDRA |= (1 << 5);
// Init Timer0
// Must Be Done Only Once Because Switching Off Timer0 Has No
// Effect On The Content Of The Timer0 Registers
// Select 8-Bit CTC Mode (Clear Timer On Compare Match)
TCCR0A = (1 << WGM00);
// Set Timer Top Value To Generate The RS232 Baudrate
// A Prescaler Value Of 8 Will Be Used
OCR0A = 1000000 / 8 * USI_UART_BAUDRATE;
// Stop Timer0
TCCR0B = 0;
// Init USI
// Clear All Flags In USI Status Register
// Clear USI Counter
USISR = 0xE0;
// Ensure That USI Output Is High (Default State Of UART Line)
USIDR = 0xFF;
// Select Three Wire Mode (SPI),
// Select Timer0 Compare Match As Clock Source
USICR = (1 << USIWM0) | (1 << USICS0) | (1 << USICLK);
}
void usi_uart_putch (char send_char)
{
uint8_t uart_half_frame;
uint8_t ch = (uint8_t) send_char;
// The USI Output Order Is MSB First, But RS232 Standard Is LSB First
// Thus The Bit Order Of The Data Byte ch Must Be Reversed
ch = reverse_bit_order (ch);
// Calculate And Send 1st Half Of UART Frame
// 1st Half: STOP START D0 D1 D2 D3 D4 D5
// Bit No.: 7 6 5 4 3 2 1 0
uart_half_frame = 0x80 | (uint8_t) (ch >> 2);
// Loop Until USI Is Ready
while ((USISR & 0x0F) > 0);
USISR = 6;
USIDR = uart_half_frame;
// Start Timer0 Which Is The Clock Source Of The USI
TCNT0 = 0;
TCCR0B = (1 << CS01);
// Calculate 2nd Half Of UART Frame
// 2nd Half: D3 D4 D5 D6 D7 STOP STOP STOP
// Bit No.: 7 6 5 4 3 2 1 0
uart_half_frame = 0x07 | (uint8_t) (ch << 3);
// Wait Until First Half Frame (Startbit, D0...D2 Is Send
while ((USISR & 0x0F) < 11);
// Send 2nd Half Of UART Frame
USIDR = uart_half_frame;
// Loop Until USI Is Ready
while ((USISR & 0x0F) > 0);
// Stop Timer0
TCCR0B = 0;
} инвертирование порядка бит в посылки убрано
пишу на асм у меня загвоздка
таймер при достижении отметки А не тактирует УСИ а должен был
что я не так накосячил с флагами
код
таймер счёлкает до отметки 152 и продолжает счолкать дальше#include <tn24def.inc>
;*********************
;* Interrupt Vectors *
;*********************
.def temp = r16
.def temp2 = r17
#define USI_UART_BAUDRATE 9600
.CSEG
rjmp RESET ; TO START sting 25
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti// reti//timer 0 over
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti// rjmp TIM0//tim0
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
USI_INIT:
//ldi temp, (1<<5)
//out DDRA, temp
//out PORTA, temp
//
ldi temp,(1<<WGM00);
out TCCR0A,temp
//
ldi temp,152 // из апноута
out OCR0A,temp
//
ldi temp,0xE0
out USISR,temp
//
ldi temp,0xFF
out USIDR,temp
//
ldi temp,(1 << USIWM0) | (1 << USICS0) | (1 << USICLK)
out USICR,temp
ret
SEND:
ldi temp,0b10101010
ldi temp2,6
out USISR,temp2
out USIDR,temp
//
ldi temp,0
out TCNT0,temp
ldi temp,(1<<CS01)
out TCCR0B,temp
////
s2:
in temp2,USISR
ldi temp,0b00001111
and temp2,temp ////
cpi temp2,11
brlo s2
///
ldi temp,0b01010111
out USIDR,temp
////
s3:
in temp2,USISR
ldi temp,0b00001111
and temp2,temp ////
cpi temp2,0
brlo s3
////
ldi temp,0
out TCCR0B,temp
ret
RESET:
rcall USI_INIT
re2: rcall SEND
rjmp re2
с уси ничего не происходит
хотя он по достижению должен был сбрасыватся?


