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

Обсуждаем контроллеры компании Atmel.
MaxGoblin
Открыл глаза
Сообщения: 41
Зарегистрирован: Сб окт 29, 2011 21:46:14

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

Сообщение MaxGoblin »

to rxstart1:

USB 3.0 там нет как вида. Во время выпуска ноута этого протокола еще не было.
Питание тестером и осликом просматривал 5в стабильно. Присутствует небольшой шум, но так же и на рабочем компе.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Подскажите! А в версии 3.12 есть вирус? У меня AVAST блокирует и матерится.
Я снес просто бесплатную версию 3.29. Думал в ней только ограничение на размер кода. А там еще функционал порезали генератора кода. Враги короче
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
MaxGoblin
Открыл глаза
Сообщения: 41
Зарегистрирован: Сб окт 29, 2011 21:46:14

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

Сообщение MaxGoblin »

Чесно говоря я не в курсе есть ли он там.
На старой винде что то ругалось и я просто выключил антивир.
Сейчас у меня антивиров на компе и ноуте нет.
Не вижу просто смысла в них.

Работают машины вроде без изменений, у меня претензий нет.
Tenken
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт янв 17, 2013 21:25:30
Откуда: Тула

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

Сообщение Tenken »

Здравствуйте, написал в кодвижне прогу для часов на ds1307, хотел бы сделать часы с термометром используя стандартную кодвижнскую библу для DS18B20 ( использую 4 семисегментных индикатора с прерыванием по таймеру для динамической индикации) Хотел бы сделать так - часы работают секунд 10-20 потом секунд на 10 включается показ температуры. Но боюсьчто буду глюки ибо для работы датчика нужна большая задержка(порядка 1 секунды). Отсюда вопрос: как просто и надежно это реализовтаь используя стандартную библиотеку для датчика? мб использовать 2 контроллера (1 работает с датчиком и передает данные другому (правда не знаю как передать) . Либо что-то сделать с запрещением прерываний... но индикация же осуществляется от прерываний... поэтому не могу понять) Поделитесь идеями пожалуйста)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А в чём проблема-то? Индикация по прерываниям сама по себе, датчики сами по себе.
Tenken
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт янв 17, 2013 21:25:30
Откуда: Тула

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

Сообщение Tenken »

ну то есть есть шанс что они не будут конфликтовать?) прерывание же всегда индуцируется и оно будет мешать задержкам)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

И что? Это так принципиально, что будет не 10 секунд а 10.1?

Прерывание должно быть проще некуда. Скажем, есть массив из 4 "изображений" символов для семисегментника. В прерывании всё что нужно делать - выводить очередной символ, и больше ничего. Пример псевдокода:

Код: Выделить всё

uint8_t dig[4]; // массив выводимых символов, 0..3 справа налево

interrupt { // например, 1000 раз в секунду, что позволит это прерывание ещё и для замера миллисекунд применить
  static uint8_t d; // номер разряда
  // Зацикливаем d в пределах 0..3
  if (++d >= 4)
    d = 0;
  // Гасим все разряды (биты 0..3 порта D)
  PORTD &= ~0x0F;
  // Выводим на сегменты (порт B) очередную цифру
  PORTB = dig[d];
  // Зажигаем соответствующий разряд
  PORTB |= (1<<d);
}

Такое прерывание будет выполняться достаточно быстро и фактически не влиять на задержки. А уже в основном потоке всё что нужно делать - класть в dig[4] нужную "картинку" раз в 10 секунд или сколько нужно.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

по-моему, проблема в том, что встроенные в CodeVision функции для работы с датчиками DS18x20 не работают с разрешенными прерываниями... т.е. они устроены так, что надо перед обращением к ним запрещать прерывания...

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

Мой уютный бложик... заходите!
edisson
Родился
Сообщения: 10
Зарегистрирован: Пн май 25, 2009 14:00:02

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

Сообщение edisson »

добрый день ребята.

есть:
char rx_buffer0[64]; который к слову расположен по адресу начиная от RAM:0x0320 до 0x035f включительно.


хочу найти есть ли в этом буфере строка RESET . и если есть то с какого байта массива rx_buffer0 начинается RESET .

char *ptr_to_ram;



if (strstr(rx_buffer0,"RESET") != 0)
{
ptr_to_ram= strstr(rx_buffer0,"RESET");

//в ptr_to_ram получаю адрес ячейки RAM . а как узнать номер байта в rx_buffer0 ?
понимаю что нужно от значения ptr_to_ram нужно отнять адрес расположения rx_buffer0 но как правильно это написать ?



}
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Как-то так:

Код: Выделить всё

int num = -1;
char *ptr_to_ram = strstr(rx_buffer0,"RESET");

if (ptr_to_ram)
    num = (int)ptr_to_ram - (int)rx_buffer0;
edisson
Родился
Сообщения: 10
Зарегистрирован: Пн май 25, 2009 14:00:02

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

Сообщение edisson »

WiseLord

работает ! огромное спасибо что уделили время :beer:
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Понадобился мне UART. До этого ни разу нигде мне его программировать не доводилось. Сел, почитал интернет, даташит на контроллер ATmega8A, хэлп кодевижена...
Запустил мастер, настроил UART
Изображение
Буфер выбрал 128 байт, так как предполагается прогонять через UART фразы текста, которые потом будут должны записываться в EEPROM. Соответственно, прием и передачу организовал по прерываниям.
Мастер кодевжена кроме прерываний создал еще функции getchar(); и putchar(); хотя я не знаю для чего они, ведь мне не один символ надо обрабатывать, а строку.

И еще вылезли проблемы.
1. Я не пойму, как в этом буфере найти начало того текста, что я предаю через гипертерминал и количество введенных символов. Данные то в буфер пишутся по кольцу. А мне то его еще выводить надо. Пусть даже эхом на тот же гипертерминал для отладки.
2. Для чего создавались функции getchar(); и putchar(); именно как альтернативные стандартным и как их использовать
3. Отлаживать пытаюсь в протеусе, используя виртуальный терминал. Так в нем я не нашел символов перевода строки. При нажатии Enter передается код 0х00 (смотрел в 16ричном виде в окне терминала).

Если есть примеры кода - заранее благодарен.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

1 передать перед началом текста маркер начала текста, типа какой либо символ, например '$'
2 в микроконтроллерах AVR могут по разному называться регистры UART, в некоторых UART отсутствует, посему стандартная библиотека не смогла охватить все разнообразие
3 0x0D по "Enter":
Изображение
imho
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

Возможно ли надёжно менять заполнение ШИМ на каждый период?
Т.е. допустим выбрана частота при которой период = 100мс.
Задаю ШИМ 25%. Запускаю. На выходе получил импульс 25мс.
Шлю 50%. На выходе получил 50мс.
И т.д.
Речь само собой об аппаратном ШИМ.
Суть вопроса в задании заполнения пока не закончился текущий период. Чтобы к следующему он уже знал сколько ему считать.
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

AndTer писал(а):Суть вопроса в задании заполнения пока не закончился текущий период. Чтобы к следующему он уже знал сколько ему считать.
обновляйте содержимое в регистре OCRx до конца текущего периода ШИМ - и всё! текущий период отработает со старым значением ОCRx, а новый будет использовать новое значение

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

Мой уютный бложик... заходите!
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

Что то не работает...
А должно слать разную длительность, по очереди, 4мс/9мс.
Такое ощущение что прерывание не запускается. Или не хватает скорости чтобы обработать... Ибо всего 20 машинных циклов на обработку этого прерывания... Хотя он даже без условий не меняет период...

Код: Выделить всё

/*****************************************************
AVR Core Clock frequency: 16,000000 MHz
*****************************************************/

#include <mega8.h>

// Declare your global variables here
unsigned char SND[]={0x0D,0x05};
int i=0;

// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
// Place your code here
if(i){OCR1AL=SND[i];i=0;}else{OCR1AL=SND[i];i=1;};
}

void main(void)
{
PORTB=0x00;
DDRB=0x02;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x82;
TCCR1B=0x19;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x13;
OCR1AH=0x00;
OCR1AL=0x0D;
OCR1BH=0x00;
OCR1BL=0x00;

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

while (1)
      {
      // Place your code here

      };
}
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Я тут в упор не вижу смены периода. В прерывании просто SND[i], которое там зачем-то просто само по себе, без каких-либо телодвижений. Всё, что происходит - это зачем-то смена i с нуля на единицу или наоборот в очередном прерывании.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

Посмотрите внимательней, там всё есть...
Но даже запустив таймер с заполнением 0x0D, такая конструкция не меняет заполнение...

Код: Выделить всё

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
OCR1AL=0x05;
}

// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
// Place your code here
OCR1AL=0x05;
}

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
OCR1AL=0x05;
}

То есть ни одно прерывание не срабатывает.
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А, понятно.
А то я увидел пост на этапе, когда код был

Код: Выделить всё

if(i){SND[i];i=0;}else{SND[i];i=1;};


Добавлено after 6 minutes 51 second:
А, собственно, глобальное разрешение прерываний тут есть? В avr-gcc это sei(); в этой штуке должно быть что-то вроде asm("sei");
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

WiseLord, благодарю! А слона то я и не приметил... )
Добавил:

Код: Выделить всё

#asm("sei")

И сразу всё заработало)
Вложения
12345.png
(19.2 КБ) 1187 скачиваний
Последний раз редактировалось AndTer Чт янв 26, 2017 21:05:30, всего редактировалось 1 раз.
Глупый не задает вопросы. Глупый и так все знает.
Ответить

Вернуться в «AVR»