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

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

Чт мар 28, 2019 15:51:08

скажите а в CV возможно использовать структуру внутри объединения?

union TunionData
{
FATFS fat; // без этой строчки работает нормально

char buffer[BUF_SIZE];
unsigned char romCode[BUF_SIZE / 9][9];
unsigned char queue[BUF_SIZE];
};

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

Вс мар 31, 2019 12:19:21

в общем сам и отвечаю. в стандарте такая конструкция допустима, в IAR работает. в этом же недоделанном компиляторе нет.

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

Пн апр 01, 2019 19:16:19

У меня такая непонятка. Чтобы сконфигурировать выводы 0,1,2 порта на выход надо сделать так:
Код:
void main(void){
PORTB=0x00;
DDRB=0x00000111;
   
while (1)
      {        }
}     


Т.е. наоборот, не как на PIC контроллерах?

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

Пн апр 01, 2019 20:17:07

А чего у Вас так скобки дико пляшут? Если других запутать - тогда ладно, но себя-то пожалейте.

И да, в AVR биты DDR в единице = выход.

P.S. Помимо скобок, в коде ошибка.

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

Вт апр 02, 2019 08:15:50

WiseLord Ясно, спасибо. А где ошибка?
В принципе да, while(1){} там и не нужен оказался. И без него скомпилировалось - в железе тоже заработало.

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

Вт апр 02, 2019 08:36:39

Ошибка в том, что в 8-битный DDRB Вы пытаетесь записать как минимум 16-бит значение (0x0111). Вероятно, вместо этого имелось в виду 0x07.

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

Вт апр 02, 2019 08:38:16

это не ошибка

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

Вт апр 02, 2019 08:41:43

Ну.. опечатка. Не важно.

Такие вещи иногда сложно заметить, ведь всё "выглядит правильно". А в результате - не биты 0, 1, 2 в режиме выхода, а биты 0, 4.

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

Вт апр 02, 2019 09:15:12

Блин, точно. Хотел написать 0b00000111 , а в исходнике так и есть 0x07.

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

Вт апр 02, 2019 09:26:35

ещё раз подумайте, перед тем, как из майна while(1){} выкидывать

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

Чт июн 06, 2019 19:08:58

Помогите конвертировать Arduino Code в Codvision

digitalWrite(K_line_TX, HIGH), delay(300);
digitalWrite(K_line_TX, LOW), delay(25);
digitalWrite(K_line_TX, HIGH), delay(25);
Serial.begin(10400);
for(int i=0;i<5;i++) Serial.write(init_K[i]), delay (10);
delay(100);
}

char byfer[30];
n = Serial.available();
if (n > 0) { pac++;
for (int i=0;i<n;i++) byfer[i]=Serial.read();
String byte8 = String(byfer[8],DEC);
String byte10 = String(byfer[10],DEC);
if (n == 12 && byte8 == "193") {
Serial.flush();
for(int i=0;i<6;i++) Serial.write(temp1_K[i]), delay (10);
delay(100);
}

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

Сб июн 08, 2019 16:47:15

добрый день!
пытаюсь сформировать описание режима работы UART исходя из настроек в регистрах. но не могу прочитать UCSRC все время получаю 0 хотя UBRRL читается без проблем. в чем может быть дело?

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

Сб июл 06, 2019 15:11:39

Ребятки, такой вопрос хочу задать.
Только-что установил свежую CVAVR 3.37. И пока не могу привыкнуть к тому, как мастер генерирует код в плане описания регистров.
Например.
Было:
Спойлер
Код:
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

Стало:
Спойлер
Код:
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x67;


С одной стороны информативнее благодаря названиям битов, с другой - как-то громоздко и не наглядно. А в описании портов и вовсе избыточно.

Может кто знает, можно ли вернуть старый стиль?

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

Сб июл 06, 2019 16:14:34

:) :) , а я наоборот в версии 2..... из первого вида во второй ручками перебиваю...
только немного не так, а с одними скобками и многобитные параметры в одну запись объединяю:
UCSRC=(1<<URSEL|0<<UMSEL|0<<UPM0|0<<USBS|3<<UCSZ0|0<<UCPOL);
а в описании портов: вначале назначаю дефайном (особенно это удобно в мелких тинях с одним портом) на какой ноге, какая периферия навешена а потом в инициализации:
PORTB=(1<<button|0<<led|0<<motor);
DDRB=(0<<button|1<<led|1<<motor);
и в коде потом использую имена а не номера ног и битов:
if (PINB&(1<<button)) {.....};
после этого, если мне понадобится перевесить периферию в пределах порта, то на изменение кода уйдет порядка 10 секунд... (дефайны в начале кода изменить)

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

Сб июл 06, 2019 22:23:40

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

В 3 версии компилятор подсказывать начал, варианты предлагать. Это прикольно. Но компиляция кода проходит раза в два дольше. Ну и мой вопрос в прошлом сообщении.
Прям и не знаю теперь, на какой версии остаться :)

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

Ср июл 17, 2019 09:36:30

Всем молока!

Друзья, помогите, пожалуйста.
Программка очень простая, но работает не корректно.
На словах: МК - AtTiny13A. Проблема в реализации задержки на таймере (мне так сдаётся).
При включении МК смотрит на лог-уровень ноги "SIGNAL_PIN" и в зависимости от увиденного выполняет opening(); или closing();
Эти подпрограммы действуют так: подают на ноги PB3 и PB4 (OUT_PIN_1 и OUT_PIN_2) лог.1 и лог.0 (открытие) и лог.0 и лог.1 (закрытие). Далее должна идти задержка на таймере (2.5 сек) и после выставляет высокий уровень на обеих ногах.

В основном цикле программы идёт анализ флага (который меняется от внешнего прерывания по любому изменению) и в зависимости от него снова "открытие" или "закрытие".

Что вижу в Протеусе:
1. при включении - на обеих выходах OUT_PIN_2 и OUT_PIN_1 - высокий уровень (он, конечно настроен в инициализации порта, но перед тем как зайти в основной цикл - должно всё поменяться...)
2. при изменение уровня на ноге внешнего прерывания - происходит изменение уровня на OUT_PIN_n, но задумка такова, что через 2500 мСек снова должен измениться уровень и стать высоким на обеих ногах. Этого не происходит...

Видится мне, что проблема в строчке while (time);. Вроде бы тут мой delay должен "висеть" пока в прерываниях от переполнения таймера time не станет 0.
Код ниже:

Спойлер
Код:
#include <tiny13a.h>

#define SIGNAL_PIN PINB.0
#define TIME_MS 2500
#define OUT_PIN_1 PORTB3
#define OUT_PIN_2 PORTB4

volatile char flag = 2;
volatile unsigned int time = 0;


// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{

if (SIGNAL_PIN == 1) flag = 1;
if (SIGNAL_PIN == 0) flag = 0;
time = 0;                       // сбрасываем delay()
}
 
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xB5;
time = time--;

}

void delay (unsigned int a)
{
time = a;
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCNT0=0xB5;
OCR0A=0x00;
OCR0B=0x00; 

TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);  //включаем таймер
while (time);  // висим пока счётчик не будет 0
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); //выключаем счётчик
}

void opening (void)
{
PORTB = (0<<OUT_PIN_1) | (1<<OUT_PIN_2);
delay(TIME_MS);
PORTB = (1<<OUT_PIN_1) | (1<<OUT_PIN_2);
}

void closing (void)
{
PORTB = (1<<OUT_PIN_1) | (0<<OUT_PIN_2);
delay(TIME_MS);
PORTB = (1<<OUT_PIN_1) | (1<<OUT_PIN_2);
}


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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State5=T State4=1 State3=1 State2=T State1=T State0=T
PORTB=0x18;
DDRB=0x18;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(1<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (1<<ISC00);
GIFR=(1<<INTF0) | (0<<PCIF);

#asm("sei")   // Global enable interrupts
flag = 2;
delay(100);    // пусть всё устаканится при включении

if (SIGNAL_PIN == 1) opening();
if (SIGNAL_PIN == 0) closing();


while (1)
      {       
        switch (flag)
        {
        case 1:
        opening();
        if(flag == 0) break;
        flag = 2;
        break;
         
        case 0:
        closing();
        if(flag == 1) break;
        flag = 2;
        break;   
         
        default:
        flag = 2;
        }; 
             
      }
}


PS. таймер настроен на срабатывания раз в 1 мСек. Частота МК 4,8 МГц.

Что не так? о.О

Во вложении весь проект в CVAVR.
Вложения
Tiny13A.zip
(58.83 KiB) Скачиваний: 235

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

Ср июл 17, 2019 09:51:55

он на строчку
time = time--;
не ругается?
просто
time--;
уже не катит?
или даже
time-=(time)? 1:0;
так он дойдет до 0 и остановится

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

Ср июл 17, 2019 10:24:57

он на строчку
time = time--;
не ругается?
просто
time--;
уже не катит?
или даже
time-=(time)? 1:0;
так он дойдет до 0 и остановится

Большое спасибо! Попробовал написать по другому: time = time-1; и чудо случилось! Таймер работает, вот только теперь не совсем корректно работает отклик на изменение уровня входящего сигнала... UPD: помогло добавление case 2: break; Но всё же иногда состояние портов выхода зависает при быстром переключении входного уровня...

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

Чт окт 10, 2019 12:20:12

доброе время суток.
хотелось портировать следуюший проэкт на codevision.
http://arv.radioliga.com/content/view/180/38/
http://arv.radioliga.com/component/opti ... ect/id,30/

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

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

Чт окт 10, 2019 12:45:02

на гугл диск выложи, а сюда ссылку на файлы
Ответить