Обсуждаем контроллеры компании Atmel.
Ответить

Re: CodeVision AVR в вопросах и ответах

Чт авг 17, 2017 12:38:24

Извиняюсь, если было или не в ту тему, но вот такая проблема возникла с CodeVisionAVR впервые за несколько лет работы:

При переносе проектов на другой комп и установки точно такой же версии CodeVisionAVR 2.05 возникла проблема: не открываются некоторые проекты! КодВижн выдает ошибку с единственным словом: "The"...

Изображение

Проблема наблюдается на 2-х разным машинах с разными версиями виндоф. Кто нибудь сталкивался с подобной проблемой? Отзовитесь, пожалуйста...

Re: CodeVision AVR в вопросах и ответах

Пн авг 28, 2017 17:52:59

Тренируюсь в Протеусе с внешней памятью 24С256, с помощью библиотеки i2c.h и функций i2c_write и т.д. Писать побайтно без проблем, а вот если например надо стереть всё, FF на все 32 кб, то на каждый байт по 10 мс-это же сколько времени уйдет. Читал, что можно постранично писать в память, а как это сделать?

Re: CodeVision AVR в вопросах и ответах

Вт авг 29, 2017 17:34:52

dm211 писал(а):Читал, что можно постранично писать в память, а как это сделать?
Вложения
page_wr.PNG
(78.93 KiB) Скачиваний: 501

Re: CodeVision AVR в вопросах и ответах

Ср авг 30, 2017 12:33:13

Ну понятно, даташиты читать нада..
Первый адрес и отправляешь 64 байта и так вроде работает, без LOW адреса и какой смысл этого адреса последнего байта, если и так известно, что он будет= первый+64.

Re: CodeVision AVR в вопросах и ответах

Ср авг 30, 2017 12:45:19

Смысла нет, поэтому адрес последнего байта нигде и не требуется. В даташите в том числе.

Следует учесть, что если адресовать первый байт не кратный 64 (начать писать страницу не с нуля, а где-то с серединки страницы), то при переполнении страницы следующий байт будет записываться в начало той же, а не следующей страницы.

Re: CodeVision AVR в вопросах и ответах

Ср авг 30, 2017 15:33:25

В даташите в том числе.

А что же это тогда?- Adress High Byte и Adress Low Byte.
И еще вопрос- при побайтной записи, после каждого байта делаем задержку ~10 мс, а при постраничной записи между байтами не делаем и после записи страницы тоже не делаем?

Re: CodeVision AVR в вопросах и ответах

Ср авг 30, 2017 16:14:57

Это старший байт адреса и младший байт адреса. Одного и того же адреса - начального! Как, собственно, и следует из их названий.

При постраничной записи передаваемыми данными набиваются SRAM-ячейки специального регистра, а уже потом за 10мс они все параллельно сбрасываются в матрицу в нужную строку. Соответственно, страничная запись приблизительно в 64 раза быстрее.

Re: CodeVision AVR в вопросах и ответах

Ср авг 30, 2017 17:01:29

Вот теперь всё понятно. Значит код ниже правильный у меня?
Код:
void eeprom_write_page(unsigned char address, unsigned char data){ // Постраничная запись
unsigned char y;
i2c_start();                           // Кидаем команду "Cтарт" на шину I2C
i2c_write(Ext_EEPROM_Adr);             // Кидаем на шину адрес 24LC256
i2c_write(address>>8);                 // Старший байт адреса
i2c_write(address);                    // младший байт адреса
for(y=0; y<64; y++){                   // Посылаем 64 байта
i2c_write(data);}                      // Посылаем байт для записи
i2c_stop();                            // Посылаем команду "Стоп"
}

// Стереть всё
void clear_all(){
 unsigned int x;
for(x=0; x<500; x++){
 eeprom_write_page(x, 0xFF);
}
}

В Протеусе стирает за 7 секунд.

Re: CodeVision AVR в вопросах и ответах

Ср авг 30, 2017 17:22:17

Нет. Адрес неправильный и STOP должен быть один

P.S. Да и очищать нужно всё, а не кусок памяти. Должно быть что-то вроде:

Re: CodeVision AVR в вопросах и ответах

Чт сен 07, 2017 12:11:57

На вход Т1 таймера постоянно поступают импульсы, широкий импульс-1, короткий-0, импульсов-36, начало определяется самым широким импульсом, равным периоду. Надо измерять длительности импульсов и записывать эти нули и единицы в переменную. Как это сделать? Мне бы посмотреть код для такой цели.

Re: CodeVision AVR в вопросах и ответах

Пт сен 08, 2017 18:16:22

настраивай прерывание по захвату, в прерывании:
если иср1>10 //проверка дребезга
{тсср1-=иср1; //сброс таймера для след. замера
приемник=приемник<<1; //продвигаем переменную приемник
//если (иср1 < 100) короткий импульс (точка) действий нет
если (иср1 > 100) приемник++; //тире
если (иср1 > 1000) приемник=0; // стартовый импульс
};
// это для постоянной скорости

Re: CodeVision AVR в вопросах и ответах

Вс сен 10, 2017 14:26:26

Ivanoff-iv писал(а):прерывание по захвату
Но прерывание по захвату работает с ножки ICP, а тут счетный вход Т1. Остается вариант в цикле смотреть ногу, запускать таймер и смотреть длительность.

Re: CodeVision AVR в вопросах и ответах

Пн сен 11, 2017 15:45:58

получается так... ногу придется использовать как вход порта, а не по железной доп. возможности.

Re: CodeVision AVR в вопросах и ответах

Сб сен 23, 2017 08:35:41

Всем привет. Помогите с кодом. Нужно вставить таймер отключения для HL1 через минуту его работы. и осталась функция раньшего отключения по S1 как реализовано у меня

Код:
Chip type               : ATtiny13A
AVR Core Clock frequency: 1,200000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13a.h>
#include <delay.h>
#define S1 PINB.3
#define S2 PINB.4
#define HL1 PORTB.2
#define HL2 PORTB.1
#define OFF 1
#define ON 0
#define HOLD 200 // время равно: секунда * 100

unsigned char counter1;
unsigned char counter2;
unsigned char trigger;
unsigned char blink;


void main(void)
{


DDRB= (0<<DDB5)  | (0<<DDB4)  | (0<<DDB3)  | (1<<DDB2)  | (1<<DDB1)  | (0<<DDB0);
PORTB=(0<<PORTB5)| (1<<PORTB4)| (1<<PORTB3)| (0<<PORTB2)| (0<<PORTB1)| (0<<PORTB0);

ACSR=(1<<ACD);

// Watchdog Timer Prescaler: OSC/64k
#pragma optsize-
WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (1<<WDCE) | (1<<WDE) | (1<<WDP2) | (0<<WDP1) | (1<<WDP0);
WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (0<<WDCE) | (1<<WDE) | (1<<WDP2) | (0<<WDP1) | (1<<WDP0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


while (1)
      {
       
       if(S1==OFF&&S2==OFF&&HL1==0&&trigger==0)
        {
         MCUCR=(1<<SE)|(1<<SM1);
         #asm("sleep")        //  засыпаем
        }
       
       if(S1==ON&&HL1==0)
        {
         if(counter1=200)counter1++;
         else HL1=1;
        }       
       
       if(S1==OFF)counter1=0; 
       if(S1==ON&&HL1==1&&counter1==0)HL1=0;
       
        if(S2==ON&&trigger==0)
        {
         if(counter2<200)counter2++;
         else trigger=1;
        }
       if(S2==OFF)counter2=0; 
       if(S2==ON&&trigger==1&&counter2==0)trigger=0;
       
       if(trigger)
        {
         if(blink<40)blink++;
         else blink=0;
         if(blink<20)HL2=1;
         else HL2=0;
        }
       else
        {
         blink=0;
         HL2=0;
        }
       
       
       #asm("wdr")
       delay_ms(10);
      }
}

Re: CodeVision AVR в вопросах и ответах

Вс сен 24, 2017 18:46:53

получается так... ногу придется использовать как вход порта, а не по железной доп. возможности.

Прошу раскритиковать,если что..
Т.к. мне нужно знать длительность импульса в узко конкретном диапазоне -до 200 us и не нужно знать точную длит.,а просто для сравнения с каким то значением, сделал так-настроил таймер на 250 кгц( но с кварцем в проекте 16 мгц, в Протеусе на 8 мгц-только так корректно работает), и по спаду импульса считаю длит. по TCNT0, диапазон получается до 30, вполне можно работать. А с 16 и 8 мгц я что-то не понял.
Код:
    if(!PINC.0){                              // если нога упала
                TCCR0=0x03;                   // включаем таймер
                while(!PINC.0);               // ждем,когда нога поднимется
          tik=TCNT0;                          // счетчик передаем переменной
          TCCR0=0x00; TCNT0=0;                // обнуляем ,выкл.таймер         
          lcd_gotoxy(1,0);
          sprintf(lcd_buffer," %i   ",tik);   // показать на индикаторе значение длит.
          lcd_puts(lcd_buffer);     
                 }

Re: CodeVision AVR в вопросах и ответах

Пн сен 25, 2017 20:25:11

если такая длительность маленькая, может и не тревожить таймер а обойтись программными задержками как поймал прерывание задержка антидребезга, перепроверил ногу — отпущена - выходим, нет - делаем нужную задержку потом проверяем снова отпущена - короткий, ещё нажата - длинный (можно ещё флаг прерывания проверить - убедиться, что это одно длинное нажатие, а не несколько коротких — при одном длинном флаг будет сброшен).

Re: CodeVision AVR в вопросах и ответах

Пн сен 25, 2017 21:23:52

Прерывание тут вообще не используется. А в чем проблема-тревожить таймер? Пусть тикает-это его работа.

Re: CodeVision AVR в вопросах и ответах

Вт сен 26, 2017 09:45:37

Прерывание тут вообще не используется.
А зря: промежуток довольно маленький и желательно максимально точно отследить его начало, но постоянно проверять порт - довольно неудобно, да и процессор нагружает.
Правда, вспоминаю, было ограничение на используемую ногу - если на ней нет прерывания, то его, к сожалению и не использовать...

Re: CodeVision AVR в вопросах и ответах

Сб сен 30, 2017 18:35:54

Ребята, доброго времени суток.
Пытаюсь подружить мегу8 и PCF8574.

Собственно делаю всё по инструкции ДШ.

I2C программный, настроен на те же ноги, что и аппаратный.
Адрес микросхемы 0x40, ноги А0-А2 подтянуты на землю.

Никакого шевеления выходов микросхемы не вижу...

Вроде кода-то "кот наплакал" :cry: , а что-то работать не хочет ...

Код:
#include <mega8.h>
#include <delay.h>
#include <i2c.h>           


// I2C Bus functions
#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=4
   .equ __scl_bit=5
#endasm

#define PCF8574_BUS_ADDRESS 0x40

/* write a byte to the PCF8574 */
void PCF8574_write(unsigned char data) {

i2c_start();
i2c_write(PCF8574_BUS_ADDRESS);
i2c_write(data);
i2c_stop();

/* 10ms delay to complete the write operation */
delay_ms(10);
}


void main(void) {

/* initialize the I2C bus */
i2c_init();

while (1)
{
PCF8574_write(0xFF);
delay_ms(500);
PCF8574_write(0x00);
delay_ms(500);

};

}

Re: CodeVision AVR в вопросах и ответах

Сб сен 30, 2017 20:33:13

Точно уверены, что именно на землю, а не к питанию, подтянуты входы расширения?

Ну и ещё у PCF8574 базовый адрес 0x40, а у PCF8574A - 0x70, так что ещё дело может быть и в этом.

Ещё момент: микросхема может выдать "честный" ноль, но по единице уже нет. Поэтому если там на выходе у Вас вдруг светодиод, нужно подключать его (с резистором, естественно) между ножкой и питанием, а не между ножкой и землёй.
Ответить