CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
to rxstart1:
USB 3.0 там нет как вида. Во время выпуска ноута этого протокола еще не было.
Питание тестером и осликом просматривал 5в стабильно. Присутствует небольшой шум, но так же и на рабочем компе.
USB 3.0 там нет как вида. Во время выпуска ноута этого протокола еще не было.
Питание тестером и осликом просматривал 5в стабильно. Присутствует небольшой шум, но так же и на рабочем компе.
Re: CodeVision AVR в вопросах и ответах
Подскажите! А в версии 3.12 есть вирус? У меня AVAST блокирует и матерится.
Я снес просто бесплатную версию 3.29. Думал в ней только ограничение на размер кода. А там еще функционал порезали генератора кода. Враги короче
Я снес просто бесплатную версию 3.29. Думал в ней только ограничение на размер кода. А там еще функционал порезали генератора кода. Враги короче
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Re: CodeVision AVR в вопросах и ответах
Чесно говоря я не в курсе есть ли он там.
На старой винде что то ругалось и я просто выключил антивир.
Сейчас у меня антивиров на компе и ноуте нет.
Не вижу просто смысла в них.
Работают машины вроде без изменений, у меня претензий нет.
На старой винде что то ругалось и я просто выключил антивир.
Сейчас у меня антивиров на компе и ноуте нет.
Не вижу просто смысла в них.
Работают машины вроде без изменений, у меня претензий нет.
Re: CodeVision AVR в вопросах и ответах
Здравствуйте, написал в кодвижне прогу для часов на ds1307, хотел бы сделать часы с термометром используя стандартную кодвижнскую библу для DS18B20 ( использую 4 семисегментных индикатора с прерыванием по таймеру для динамической индикации) Хотел бы сделать так - часы работают секунд 10-20 потом секунд на 10 включается показ температуры. Но боюсьчто буду глюки ибо для работы датчика нужна большая задержка(порядка 1 секунды). Отсюда вопрос: как просто и надежно это реализовтаь используя стандартную библиотеку для датчика? мб использовать 2 контроллера (1 работает с датчиком и передает данные другому (правда не знаю как передать) . Либо что-то сделать с запрещением прерываний... но индикация же осуществляется от прерываний... поэтому не могу понять) Поделитесь идеями пожалуйста)
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А в чём проблема-то? Индикация по прерываниям сама по себе, датчики сами по себе.
Re: CodeVision AVR в вопросах и ответах
ну то есть есть шанс что они не будут конфликтовать?) прерывание же всегда индуцируется и оно будет мешать задержкам)
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
И что? Это так принципиально, что будет не 10 секунд а 10.1?
Прерывание должно быть проще некуда. Скажем, есть массив из 4 "изображений" символов для семисегментника. В прерывании всё что нужно делать - выводить очередной символ, и больше ничего. Пример псевдокода:
Такое прерывание будет выполняться достаточно быстро и фактически не влиять на задержки. А уже в основном потоке всё что нужно делать - класть в dig[4] нужную "картинку" раз в 10 секунд или сколько нужно.
Прерывание должно быть проще некуда. Скажем, есть массив из 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 в вопросах и ответах
по-моему, проблема в том, что встроенные в CodeVision функции для работы с датчиками DS18x20 не работают с разрешенными прерываниями... т.е. они устроены так, что надо перед обращением к ним запрещать прерывания...
во всяком случае, так раньше было - полно на эту тему сообщений.
во всяком случае, так раньше было - полно на эту тему сообщений.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
добрый день ребята.
есть:
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 но как правильно это написать ?
}
есть:
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 в вопросах и ответах
Как-то так:
Код: Выделить всё
int num = -1;
char *ptr_to_ram = strstr(rx_buffer0,"RESET");
if (ptr_to_ram)
num = (int)ptr_to_ram - (int)rx_buffer0;Re: CodeVision AVR в вопросах и ответах
WiseLord
работает ! огромное спасибо что уделили время
работает ! огромное спасибо что уделили время

Re: CodeVision AVR в вопросах и ответах
Понадобился мне UART. До этого ни разу нигде мне его программировать не доводилось. Сел, почитал интернет, даташит на контроллер ATmega8A, хэлп кодевижена...
Запустил мастер, настроил UART

Буфер выбрал 128 байт, так как предполагается прогонять через UART фразы текста, которые потом будут должны записываться в EEPROM. Соответственно, прием и передачу организовал по прерываниям.
Мастер кодевжена кроме прерываний создал еще функции getchar(); и putchar(); хотя я не знаю для чего они, ведь мне не один символ надо обрабатывать, а строку.
И еще вылезли проблемы.
1. Я не пойму, как в этом буфере найти начало того текста, что я предаю через гипертерминал и количество введенных символов. Данные то в буфер пишутся по кольцу. А мне то его еще выводить надо. Пусть даже эхом на тот же гипертерминал для отладки.
2. Для чего создавались функции getchar(); и putchar(); именно как альтернативные стандартным и как их использовать
3. Отлаживать пытаюсь в протеусе, используя виртуальный терминал. Так в нем я не нашел символов перевода строки. При нажатии Enter передается код 0х00 (смотрел в 16ричном виде в окне терминала).
Если есть примеры кода - заранее благодарен.
Запустил мастер, настроил 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 в вопросах и ответах
Возможно ли надёжно менять заполнение ШИМ на каждый период?
Т.е. допустим выбрана частота при которой период = 100мс.
Задаю ШИМ 25%. Запускаю. На выходе получил импульс 25мс.
Шлю 50%. На выходе получил 50мс.
И т.д.
Речь само собой об аппаратном ШИМ.
Суть вопроса в задании заполнения пока не закончился текущий период. Чтобы к следующему он уже знал сколько ему считать.
Т.е. допустим выбрана частота при которой период = 100мс.
Задаю ШИМ 25%. Запускаю. На выходе получил импульс 25мс.
Шлю 50%. На выходе получил 50мс.
И т.д.
Речь само собой об аппаратном ШИМ.
Суть вопроса в задании заполнения пока не закончился текущий период. Чтобы к следующему он уже знал сколько ему считать.
Глупый не задает вопросы. Глупый и так все знает.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
обновляйте содержимое в регистре OCRx до конца текущего периода ШИМ - и всё! текущий период отработает со старым значением ОCRx, а новый будет использовать новое значениеAndTer писал(а):Суть вопроса в задании заполнения пока не закончился текущий период. Чтобы к следующему он уже знал сколько ему считать.
в чем проблема-то?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Что то не работает...
А должно слать разную длительность, по очереди, 4мс/9мс.
Такое ощущение что прерывание не запускается. Или не хватает скорости чтобы обработать... Ибо всего 20 машинных циклов на обработку этого прерывания... Хотя он даже без условий не меняет период...
А должно слать разную длительность, по очереди, 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 в вопросах и ответах
Я тут в упор не вижу смены периода. В прерывании просто SND[i], которое там зачем-то просто само по себе, без каких-либо телодвижений. Всё, что происходит - это зачем-то смена i с нуля на единицу или наоборот в очередном прерывании.
Re: CodeVision AVR в вопросах и ответах
Посмотрите внимательней, там всё есть...
Но даже запустив таймер с заполнением 0x0D, такая конструкция не меняет заполнение...
То есть ни одно прерывание не срабатывает.
Но даже запустив таймер с заполнением 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 в вопросах и ответах
А, понятно.
А то я увидел пост на этапе, когда код был
Добавлено after 6 minutes 51 second:
А, собственно, глобальное разрешение прерываний тут есть? В avr-gcc это sei(); в этой штуке должно быть что-то вроде asm("sei");
А то я увидел пост на этапе, когда код был
Код: Выделить всё
if(i){SND[i];i=0;}else{SND[i];i=1;};Добавлено after 6 minutes 51 second:
А, собственно, глобальное разрешение прерываний тут есть? В avr-gcc это sei(); в этой штуке должно быть что-то вроде asm("sei");
Re: CodeVision AVR в вопросах и ответах
WiseLord, благодарю! А слона то я и не приметил... )
Добавил:
И сразу всё заработало)
Добавил:
Код: Выделить всё
#asm("sei")И сразу всё заработало)
- Вложения
-
- 12345.png
- (19.2 КБ) 1187 скачиваний
Последний раз редактировалось AndTer Чт янв 26, 2017 21:05:30, всего редактировалось 1 раз.
Глупый не задает вопросы. Глупый и так все знает.