roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Сообщение avr123.nm.ru » 12 мар 2007, 15:51

Указывайте название и версию компилятора !!!
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Chooze » 12 мар 2007, 19:55

Спасибо !!! Вам всё заработало!!! Я по запарке в заголовке указал что unsigned char crt; в этом вся проблема и оказалась, она переполнялась и до 528 никогда не доходила !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Простите ламера, только учюсь. :oops:
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск

Сообщение avr123.nm.ru » 12 мар 2007, 20:40

Chooze писал(а):Спасибо Вам всё заработало!!!

Я по запарке в заголовке указал что unsigned char crt; в этом вся проблема и оказалась, она переполнялась и до 528 никогда не доходила !!!


А что же тогда делало:

Chooze писал(а):а он шпарит мне 529.530.531.и тд.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

ATtiny2313

Сообщение m_centre » 13 мар 2007, 01:34

2AVR123

Я разрабатывал программы для самых разных задач и на нескольких контроллерах AVR. Но у меня сейчас проблема ATtiny2313, для него написал пару простых прог, проблема оказалась не очень мне понятной, вот текст программы:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.2c Standard
Automatic Program Generator
© Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project :
Version :
Date    : 12.03.2007
Author  : Xamel                          
Company :                                
Comments:


Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here
char calc()
{
char sd=10;
printf("%d",sd*2);
}

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// 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 записать численное значение работает без проблем.
m_centre
 
Сообщения: 2
Зарегистрирован: 13 мар 2007, 01:20
Откуда: Ставрополь

Сообщение avr123.nm.ru » 13 мар 2007, 12:07

на дробное не нужно умножать.

а для других чисел попробуй вместо ПРИНТФ  использовать простой вывод как в avr123.nm.ru/z5.htm   /z4.htm  

можно даже прямо в UDR  записывать результат - и посмотри что реально получается.

или  проверь опции  ПРИНТФ в свойствах проекта как сказано в
avr123.nm.ru/z5.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение m_centre » 13 мар 2007, 22:15

avr123.nm.ru писал(а):на дробное не нужно умножать.

а для других чисел попробуй вместо ПРИНТФ  использовать простой вывод как в avr123.nm.ru/z5.htm   /z4.htm  

можно даже прямо в UDR  записывать результат - и посмотри что реально получается.

или  проверь опции  ПРИНТФ в свойствах проекта как сказано в
avr123.nm.ru/z5.htm


Блин всё оказывается очень просто у меня всё это время была очень старая версия CVAVR смена версии решила все проблемы которые вылезли именно в ATtiny2313

C уважением.
m_centre
 
Сообщения: 2
Зарегистрирован: 13 мар 2007, 01:20
Откуда: Ставрополь

Сообщение Chooze » 27 мар 2007, 08:18

Доброе время суток, всем. Проблема не знаю в чем два вечера потратил так и ничего не понял! Использую память 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; // последняя считанная страница



// interrupt disabled, SPI port enabled, master mode, MSB first,  SPI mode 3, Fcl/2
   SPCR = 0x5C;
   SPSR = 0x1 ;  //  Fcl/2
         
       /////////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
                       
                   
       buffer_counter++;
    }
    PORTB |= DF_CHIP_SELECT;               // disable DataFlash



     
   SPCR = 0x00; // disable SPI
    ///////////////////////////////////////////////////////////////////////////
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск

Сообщение avr123.nm.ru » 27 мар 2007, 08:51

Попробуй мой код из задаче 7  - avr123.nm.ru/z7.htm  
он по той же апликухе но переделан и все работет в железе.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Chooze » 27 мар 2007, 09:41

Код ваш код работает!! А мой не хочет хотя по факту мой кусок кода из вашего взят. Пробовал читать страницу минуя буферы - не получается!!1 :cry:  вот код :
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; // последняя считанная страница
     
   /***************************************************************/
   
   // interrupt disabled, SPI port enabled, master mode, MSB first,  SPI mode 3, Fcl/2
   SPCR = 0x5C;
   SPSR = 0x1 ;  //  Fcl/2
         


PORTB &= ~DF_CHIP_SELECT;               // enable DataFlash

SPDR = 0x52;               // read main memory 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
                       
                   
       buffer_counter++;
    }
    PORTB |= DF_CHIP_SELECT;               // disable DataFlash

  SPCR = 0x00; // disable SPI
}
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск

Сообщение avr123.nm.ru » 27 мар 2007, 11:11

MPLAB-PIC.narod.ru - графический ввод-вывод отладочной информации в PIC симуляторе
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 27 мар 2007, 11:49

Chooze писал(а):Пробовал читать страницу минуя буферы - не получается!!


А разве они мугут без буфера работать напрямую ?
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Chooze » 27 мар 2007, 11:53

Дык в даташеете написано!!

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.


То бишь читаем маин мемори паже без изменения содежимого буферов, минуя их!!! Или не прав.
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск

Сообщение avr123.nm.ru » 27 мар 2007, 11:58

Chooze писал(а):То бишь читаем маин мемори паже без изменения содежимого буферов, минуя их!!! Или не прав.


Ты прав.

Вот это нужно долго и нудно проверять - наверно лучше в симуляторе.

Chooze писал(а):To start a page read, an opcode of 52H or D2H must be clocked into the device

...

and tri-state the SO pin.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 27 мар 2007, 12:02

Написано АДРЕС вначале а потом 4 байта !

А у тебя НАОБОРОТ !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Chooze » 27 мар 2007, 12:09

Вот блин перевёл не правильно!! Вечером попробую! Но серано почему у меня страница в буфер не идёт!!
Спасибо!!! :roll:
Chooze
 
Сообщения: 79
Зарегистрирован: 03 фев 2007, 20:24
Откуда: Омск

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2

cron