Спасибо !!! Вам всё заработало!!! Я по запарке в заголовке указал что unsigned char crt; в этом вся проблема и оказалась, она переполнялась и до 528 никогда не доходила !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Простите ламера, только учюсь.
// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRB=0x18; UCSRC=0x06; UBRRH=0x00; UBRRL=0x33;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80;
calc();
while (1) { // Place your code here
}; }
В этой программе в функции calc() не работает должным образом умножение переменной. Скажем в этом виде умножая переменную sd на 2 всё получается Ок, но умножение на 3.5,7,8,9,10 даёт результат 1. Я исппробовал различные комбинации объявления, присвоения переменных ничего не вышло, если вместо sd записать численное значение работает без проблем.
avr123.nm.ru писал(а):на дробное не нужно умножать.
а для других чисел попробуй вместо ПРИНТФ использовать простой вывод как в avr123.nm.ru/z5.htm /z4.htm
можно даже прямо в UDR записывать результат - и посмотри что реально получается.
или проверь опции ПРИНТФ в свойствах проекта как сказано в avr123.nm.ru/z5.htm
Блин всё оказывается очень просто у меня всё это время была очень старая версия CVAVR смена версии решила все проблемы которые вылезли именно в ATtiny2313
Доброе время суток, всем. Проблема не знаю в чем два вечера потратил так и ничего не понял! Использую память 45db161b как в апликухе. В апликухе память считывается постранично через 2 буфера. Я хотел сделать побайтово через 2 буфер, а через 1 писать в память. В итоге получил, что страница памяти посли записи не хочет копироваться в буфер - получаю из буфера 0xff! вот кусок кода которым я пытался реализовать считывание всего 2 го буфера на уарт!
unsigned char temp = 0x80; unsigned int buffer_counter = 0; unsigned int page_counter = 0; static signed char end_of_buffer; // призна конца буффера static signed char last_read_page; // последняя считанная страница
/////////0 страница в буфер 2//////////////////////
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash
SPDR = MM_PAGE_TO_B2_XFER; // передаём страницу в буффер 2
while (!(SPSR & temp)); // ждём пока завершится передача SPDR = (char)(page_counter >> 6); while (!(SPSR & temp)); // ждём пока завершится передача SPDR = (char)(page_counter << 2); while (!(SPSR & temp)); // ждём пока завершится передача SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // ждём пока завершится передача
PORTB |= DF_CHIP_SELECT; // disable DataFlash and start transaction /////////////////////////////////////////////////////////////////////////////
////////////настройка флеш на чтение из буфера 2/////////////////////////////////
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash
SPDR = BUFFER_2_READ; // read from buffer2
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // start at buffer address 0 while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed
while (buffer_counter < 528) { SPDR = 0xFF; // write dummy value to start register shift while (!(SPSR & temp)); // wait for data transfer to be completed
while (!UCSRA.5); // ждем пока освободится UDR
UDR = SPDR ; // записываем байт принятый по SPI из памяти в UART
Код ваш код работает!! А мой не хочет хотя по факту мой кусок кода из вашего взят. Пробовал читать страницу минуя буферы - не получается!!1 вот код : void main_mem_page_read (void) { unsigned char temp = 0x80; unsigned int buffer_counter = 0; unsigned int page_counter = 1; static signed char end_of_buffer; // призна конца буффера static signed char last_read_page; // последняя считанная страница
while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // write don't care byte while (!(SPSR & temp)); // wait for data transfer to be completed
SPDR = (char)(page_counter >> 6); // передаём адрес страницы while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = (char)(page_counter << 2); // передаём адрес страницы while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // передаём 0 адрес байта в странице
while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // передаём 0 адрес байта в странице
while (!(SPSR & temp)); // wait for data transfer to be completed SPDR = 0x00; // while (buffer_counter < 528) { SPDR = 0xFF; // write dummy value to start register shift while (!(SPSR & temp)); // wait for data transfer to be completed
while (!UCSRA.5); // ждем пока освободится UDR
UDR = SPDR ; // записываем байт принятый по SPI из памяти в UART
MAIN MEMORY PAGE READ: A Main Memory Page Read allows the user to read data directly from any one of the 4096 pages in the main memory, bypassing both of the data buffers and leaving the contents of the buffers unchanged. To start a page read, an opcode of 52H or D2H must be clocked into the device followed by 24 address bits and 32 don’t care bits. The first two bits of the 24-bit address sequence are reserved bits, the next 12 address bits (PA11 - PA0) specify the page address, and the next ten address bits (BA9 - BA0) specify the starting byte address within the page. The 32 don’t care bits which follow the 24 address bits are sent to initialize the read operation. Following the 32 don’t care bits, additional pulses on SCK result in serial data being output on the SO (serial output) pin. The CS pin must remain low during the loading of the opcode, the address bits, the don’t care bits, and the reading of data. When the end of a page in main memory is reached during a Main Memory Page Read, the device will continue reading at the beginning of the same page. A low-to-high transition on the CS pin will terminate the read operation and tri-state the SO pin.
То бишь читаем маин мемори паже без изменения содежимого буферов, минуя их!!! Или не прав.