Страница 203 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 00:48:36
idadron
Всем доброго времени суток. Есть вопрос по программной реализации передачи данных на Atmega8 или Attiny13 (пока не определился).
Пример, нужно передать это 1111010000000011001000010011101111101101 со скоростью 2400, 8e1. Возможно-ли это сделать без прерываний, чтобы не занимать время процессора? Это пол-беды... Нужно еще принять это: 100111100000011101000010011101111010110 и, если принято именно это, сделать дальнейшие действия.
Передача происходит по следующей схеме (прикрепил файл). Это K-line. Буду очень признателен за помощь.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 11:01:16
vitalik_1984
1.для надежности нужно кроме резистора R3 на ногу повесить подтягивающий резистор на плюс.либо подключить внутренний подтягивающий.
2.без прерываний похоже сделать это не получится.раз вам нужна определенная скорость.и какая разница где будет записан код .все равно при выполнении его будет тратиться процессорное время.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 13:11:22
idadron
Кусочек схемы с готового устройства, там резистора нет, видимо внутренний. Хорошо, а как тогда написать передачу? С delay?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 14:21:35
vitalik_1984
Лучше по прерыванию от таймера.Вообще то бы неплохо было посмотреть протокол общения по К линии.
Неужели просто так эти данные запихать туда, так необдуманно просто нарушить работу этого канала данных.Любые устройства которые на них висят(диагностика, бортовой компьютер) могут перестать работать.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 23:50:17
idadron
K-line, это линия постоянно подтянутая к +12 (ну или vbat). Передача осуществляется шунтированием этой линии на массу. Если в линии больше 70% vbat - это 1, если менее 30% - это 0. Поправьте если ошибаюсь. У каждого устройства подключенного к линии есть свой адрес, который идет первым в посылке. Если адрес не тот, устройство пропускает это мимо ушей. Я уже собрал требуемое устройство на atmega48 и микросхеме l9637d, все работает (использую UART) Потом мне на глаза попалось подобное устройство, схему которого я привел выше. Мне нужно переделать свое, уйти от UART, уменьшить размер и стоимость. С аппаратной частью проблем нет. Проблема в софте. Я не знаю как передать эти команды без UART. Может SPI?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 00:13:46
R_ura
Не подскажете, как в КВ записать во все ячейки EEprom, число, скажем, 11? Что-то я не могу найти, как здесь присвоить переменной конкретный адрес в еепром?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 00:54:37
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);
Комментарии не стал писать слишком простой код
Кстати это похоже еще и ответ на второй вопрос...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 01:50:39
idadron
Во-первых это не CAN шина. Все эти устройства не общаются между собой. Они все "ведомые". Откликаются они только когда получают пакет со своим адресом от ведущего устройства. Например, от K-line адаптера. Или от того, которое я делаю.
Во-вторых на линии ничего нет, кроме моего и опрашиваемого устройства, которое сидит молча, пока его не опросить.
Даже если предположить, что такое случиться, то не произойдет ровным счетом ничего. Т.к. в линии начнется хаос даже не из единиц и нолей. И ни одно устройство не сможет признать это за какую либо команду, не то чтобы еще и XOR верно посчитать

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 09:05:46
R_ura
vitalik_1984 писал(а):
Комментарии не стал писать слишком простой код
Кстати это похоже еще и ответ на второй вопрос...
Код простой, но тем не менее не пойму, на что здесь КВ ругаетс? Вроде все правильно..

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 09:16:40
pyzhman
Функцию EEPROM_write объявите.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 10:54:35
ut1wpr
pyzhman писал(а):Функцию EEPROM_write объявите.
+1. И увеличить EndAddress на 1. Иначе последняя ячейка останется незаписанной. В условии петли стоит "<", т.е. последнюю исключает. Можно (наверное и нужно) сделать "<=".
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 12:59:13
R_ura
pyzhman писал(а):Функцию EEPROM_write объявите.
Она объявлена, просто здесь не видно...
В чем здесь дело, не пойму??

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 13:29:45
ChipKiller
В чем здесь дело, не пойму??
... в строках с
#DEFINE уберите коментарии
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 13:56:48
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
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 14:04:48
Аlex
Никаких чудес.
Ваш код в каком блоке кода находится ? Где {....} ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 18:11:49
R_ura
Аlex писал(а):Никаких чудес.
Ваш код в каком блоке кода находится ? Где {....} ?
Точно.. )) Надо же быть настолько невнимательным..
Спасибо.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 21:36:09
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(;;); //бесконечный цикл
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 22:00:42
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 плиииз (
Обратно даже не просите

...

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 22:34:36
maxim___71rus
Доброго времени суток!
Прошиваю чип at90usb162 через codevisionavr с помощью программатора stk200/300 (обычный 5проводков) : нажимаю Read ChipSignature чип определяется- т.е. компьтер видит и программатор и сам чип?
Нажимаю EraseChip выдает вот такую ошибку(см.приложения)
Что это за ошибка и как с ней бороться?
Заранее спасибо.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 22:45:37
vitalik_1984
И какую сигнатуру показывает? если не совпадает с must be: ,то значит не читает.возможно короткое замыкание между ногами мисо моси.