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

Обсуждаем контроллеры компании Atmel.
idadron
Родился
Сообщения: 15
Зарегистрирован: Чт май 03, 2012 22:00:24
Откуда: Санкт-Петербург

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

Сообщение idadron »

Всем доброго времени суток. Есть вопрос по программной реализации передачи данных на Atmega8 или Attiny13 (пока не определился).
Пример, нужно передать это 1111010000000011001000010011101111101101 со скоростью 2400, 8e1. Возможно-ли это сделать без прерываний, чтобы не занимать время процессора? Это пол-беды... Нужно еще принять это: 100111100000011101000010011101111010110 и, если принято именно это, сделать дальнейшие действия.
Передача происходит по следующей схеме (прикрепил файл). Это K-line. Буду очень признателен за помощь.
Вложения
2.jpg
(52.06 КБ) 533 скачивания
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

1.для надежности нужно кроме резистора R3 на ногу повесить подтягивающий резистор на плюс.либо подключить внутренний подтягивающий.
2.без прерываний похоже сделать это не получится.раз вам нужна определенная скорость.и какая разница где будет записан код .все равно при выполнении его будет тратиться процессорное время.
В поисках истины человек развивается.
idadron
Родился
Сообщения: 15
Зарегистрирован: Чт май 03, 2012 22:00:24
Откуда: Санкт-Петербург

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

Сообщение idadron »

Кусочек схемы с готового устройства, там резистора нет, видимо внутренний. Хорошо, а как тогда написать передачу? С delay?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Лучше по прерыванию от таймера.Вообще то бы неплохо было посмотреть протокол общения по К линии.
Неужели просто так эти данные запихать туда, так необдуманно просто нарушить работу этого канала данных.Любые устройства которые на них висят(диагностика, бортовой компьютер) могут перестать работать.
В поисках истины человек развивается.
idadron
Родился
Сообщения: 15
Зарегистрирован: Чт май 03, 2012 22:00:24
Откуда: Санкт-Петербург

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

Сообщение idadron »

K-line, это линия постоянно подтянутая к +12 (ну или vbat). Передача осуществляется шунтированием этой линии на массу. Если в линии больше 70% vbat - это 1, если менее 30% - это 0. Поправьте если ошибаюсь. У каждого устройства подключенного к линии есть свой адрес, который идет первым в посылке. Если адрес не тот, устройство пропускает это мимо ушей. Я уже собрал требуемое устройство на atmega48 и микросхеме l9637d, все работает (использую UART) Потом мне на глаза попалось подобное устройство, схему которого я привел выше. Мне нужно переделать свое, уйти от UART, уменьшить размер и стоимость. С аппаратной частью проблем нет. Проблема в софте. Я не знаю как передать эти команды без UART. Может SPI?
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Не подскажете, как в КВ записать во все ячейки EEprom, число, скажем, 11? Что-то я не могу найти, как здесь присвоить переменной конкретный адрес в еепром?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

idadron писал(а):У каждого устройства подключенного к линии есть свой адрес, который идет первым в посылке.

А как определить когда можно отправлять? может в данный момент уже передается пакет данных, а мы в это время свой пихаем.?
R_ura писал(а):Не подскажете, как в КВ записать во все ячейки EEprom, число, скажем, 11?

берем из даташита первую попавшуюся функцию

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


void EEPROM_write
(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}
 

дорабатываем

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

#define BEGIN_ADDRESS 0x0ddd //начало.число взято от фонаря
#define END_ADRESS 0x0fff //конец. число взято от фонаря
unsigned int i;
unsigned char data_to_fill;
for (i=BEGIN_ADDRESS;i<=END_ADRESS;i++)
void EEPROM_write(1,data_to_fill);
 

Комментарии не стал писать слишком простой код

Кстати это похоже еще и ответ на второй вопрос...
В поисках истины человек развивается.
idadron
Родился
Сообщения: 15
Зарегистрирован: Чт май 03, 2012 22:00:24
Откуда: Санкт-Петербург

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

Сообщение idadron »

Во-первых это не CAN шина. Все эти устройства не общаются между собой. Они все "ведомые". Откликаются они только когда получают пакет со своим адресом от ведущего устройства. Например, от K-line адаптера. Или от того, которое я делаю.
Во-вторых на линии ничего нет, кроме моего и опрашиваемого устройства, которое сидит молча, пока его не опросить.
Даже если предположить, что такое случиться, то не произойдет ровным счетом ничего. Т.к. в линии начнется хаос даже не из единиц и нолей. И ни одно устройство не сможет признать это за какую либо команду, не то чтобы еще и XOR верно посчитать :)))
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

vitalik_1984 писал(а):
Комментарии не стал писать слишком простой код

Кстати это похоже еще и ответ на второй вопрос...


Код простой, но тем не менее не пойму, на что здесь КВ ругаетс? Вроде все правильно..
Изображение
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Функцию EEPROM_write объявите.
Docendo discimus
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

pyzhman писал(а):Функцию EEPROM_write объявите.
+1. И увеличить EndAddress на 1. Иначе последняя ячейка останется незаписанной. В условии петли стоит "<", т.е. последнюю исключает. Можно (наверное и нужно) сделать "<=".
С уважением,
Виктор.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

pyzhman писал(а):Функцию EEPROM_write объявите.

Она объявлена, просто здесь не видно...
В чем здесь дело, не пойму??
Изображение
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

В чем здесь дело, не пойму??
... в строках с #DEFINE уберите коментарии
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

ChipKiller писал(а):
В чем здесь дело, не пойму??
... в строках с #DEFINE уберите коментарии


Убрал. Тоже самое..Во чудеса..))))))))))))

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

Error: C:\CV_FOR_POKROVKA\CV_FOR_POKROVKA.c(443): declaration syntax error
Error: C:\CV_FOR_POKROVKA\CV_FOR_POKROVKA.c(443): '(' expected
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Никаких чудес.
Ваш код в каком блоке кода находится ? Где {....} ?
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Аlex писал(а):Никаких чудес.
Ваш код в каком блоке кода находится ? Где {....} ?


Точно.. )) Надо же быть настолько невнимательным..
Спасибо.
Аватара пользователя
sirha
Вымогатель припоя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

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

Сообщение sirha »

привет всем помогите пожалуста переписать программу для codevisionavr плиииз (

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>

#define ZERO_CROSS PD2 //Вход импульсов ZERO-CROSS (INT0)
#define Sw1 PC0 //Кнопка включения и увеличения яркости
#define Sw2 PC1 //Кнопка выключения и уменьшения яркости

#define control_triac PD6 //Вывод на управляющий электрод симистора
#define v_change_brightness 10 //Шаг регулировки скорости изменения яркости
#define t_pulse_triac 20 //Длительность отпирающего импульса симистора 20 мкс (смотреть по ТУ для конкретного симистора)
#define BR_hi 9600 // максимальная яркость
#define BR_lo 400 // миниимальная яркость
#define BR_m 4500 // средняя яркость

volatile unsigned int brightness;

ISR (INT0_vect) //По переднему/заднему фронтам импульса ZERO-CROSS
{
OCR1A = brightness; //Регистру сравнения присваиваем значение яркости
TCCR1B |= _BV(WGM12) | _BV(CS10); //Запускаем таймер 1 в режиме СТС с периодом счёта 1 мкс
}

ISR (TIMER0_OVF_vect) //Опрос кнопок раз в 65 мс
{
if(bit_is_clear(PINC, Sw1)) //если нажата кнопка +
{
brightness += v_change_brightness;//увеличиваем яркость с заданным шагом
if(brightness > BR_hi) brightness = BR_hi;//не выходя за пределы
}
else if(bit_is_clear(PINC, Sw2)) //если нажата кнопка -
{
brightness -= v_change_brightness;//уменьшаем яркость заданным шагом
if(brightness <= BR_lo) brightness = BR_lo;//не выходя за пределы
}
}

ISR (TIMER1_COMPA_vect) //прерывание для формирования открывающего импульса симистора
{
PORTD |= _BV(control_triac); //Передний фронт отпирающего импульса симистора
_delay_us (t_pulse_triac); //Длительность отпирающего импульса
PORTD &= ~_BV(control_triac); //Задний фронт отпирающего импульса симистора
TCCR1B = TCNT1 = 0; //остановка и обнуление таймера 0
}

int main (void)
{
PORTC |= _BV(Sw1) | _BV(Sw2);//кнопки с подтягивающими резисторами
DDRD |= _BV(control_triac); //выход управляющего электрода
DDRD &= ~_BV(ZERO_CROSS); //вход детектора нуля
PORTD |= _BV(ZERO_CROSS); //с подтягивающим резистором для питания транзистора оптрона
MCUCR |= _BV(ISC00); //внешнее прерывание 0 по любому изменению уровня
GICR |= _BV(INT0); //разрешаем внешнее прерывание 0
TIMSK |= _BV(OCIE1A) | _BV(TOIE0);//разрешаем прерывания таймеров 0 и 1
TCCR0 |= _BV(CS02); //запускаем таймер 0 с предделителем на 256 для опроса кнопок регулировки яркости
brightness = BR_m; //яркость на средину диапазона
sei(); //общее разрешение прерываний
for(;;); //бесконечный цикл
}
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

idadron писал(а):Во-первых это не CAN шина. Все эти устройства не общаются между собой. Они все "ведомые". Откликаются они только когда получают пакет со своим адресом от ведущего устройства. Например, от K-line адаптера. Или от того, которое я делаю.

тогда можно сделать пару массивов и вывод типа этого:

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

#define OUT_PIN 2
#define PORT_OUT PORTD
#define BUFFER_SIZE 5*8 
unsigned shar buffer[5];буфер который нужно передать
Прерывание таймера
.
static bit =0;

if((
Buffer[Bit/8]>>(Bit%8))&0x01){PORT_OUT|=(1<<OUT_PIN);}//вывод на ножку 
else PORT_OUT|=~(1<<OUT_PIN);
bit++;
 

тут была такая формула

С разрешением передачи и с приемом как нибудь разберетесь.
Конечно же таймер нужно настроить на прерывание в соответствии со скоростью

sirha писал(а):привет всем помогите пожалуста переписать программу для codevisionavr плиииз (
ШИМ_кот.rar
(27.32 КБ) 157 скачиваний

Обратно даже не просите :facepalm: ... :)))
В поисках истины человек развивается.
maxim___71rus
Родился
Сообщения: 9
Зарегистрирован: Пт май 04, 2012 17:31:06

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

Сообщение maxim___71rus »

Доброго времени суток!
Прошиваю чип at90usb162 через codevisionavr с помощью программатора stk200/300 (обычный 5проводков) : нажимаю Read ChipSignature чип определяется- т.е. компьтер видит и программатор и сам чип?
Нажимаю EraseChip выдает вот такую ошибку(см.приложения)
Что это за ошибка и как с ней бороться?
Заранее спасибо.
Вложения
Ошибка!!!!!!.jpg
(93.58 КБ) 315 скачиваний
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

И какую сигнатуру показывает? если не совпадает с must be: ,то значит не читает.возможно короткое замыкание между ногами мисо моси.
В поисках истины человек развивается.
Ответить

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