CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Всем доброго времени суток. Есть вопрос по программной реализации передачи данных на Atmega8 или Attiny13 (пока не определился).
Пример, нужно передать это 1111010000000011001000010011101111101101 со скоростью 2400, 8e1. Возможно-ли это сделать без прерываний, чтобы не занимать время процессора? Это пол-беды... Нужно еще принять это: 100111100000011101000010011101111010110 и, если принято именно это, сделать дальнейшие действия.
Передача происходит по следующей схеме (прикрепил файл). Это K-line. Буду очень признателен за помощь.
Пример, нужно передать это 1111010000000011001000010011101111101101 со скоростью 2400, 8e1. Возможно-ли это сделать без прерываний, чтобы не занимать время процессора? Это пол-беды... Нужно еще принять это: 100111100000011101000010011101111010110 и, если принято именно это, сделать дальнейшие действия.
Передача происходит по следующей схеме (прикрепил файл). Это K-line. Буду очень признателен за помощь.
- Вложения
-
- 2.jpg
- (52.06 КБ) 533 скачивания
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
1.для надежности нужно кроме резистора R3 на ногу повесить подтягивающий резистор на плюс.либо подключить внутренний подтягивающий.
2.без прерываний похоже сделать это не получится.раз вам нужна определенная скорость.и какая разница где будет записан код .все равно при выполнении его будет тратиться процессорное время.
2.без прерываний похоже сделать это не получится.раз вам нужна определенная скорость.и какая разница где будет записан код .все равно при выполнении его будет тратиться процессорное время.
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
Кусочек схемы с готового устройства, там резистора нет, видимо внутренний. Хорошо, а как тогда написать передачу? С delay?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Лучше по прерыванию от таймера.Вообще то бы неплохо было посмотреть протокол общения по К линии.
Неужели просто так эти данные запихать туда, так необдуманно просто нарушить работу этого канала данных.Любые устройства которые на них висят(диагностика, бортовой компьютер) могут перестать работать.
Неужели просто так эти данные запихать туда, так необдуманно просто нарушить работу этого канала данных.Любые устройства которые на них висят(диагностика, бортовой компьютер) могут перестать работать.
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
K-line, это линия постоянно подтянутая к +12 (ну или vbat). Передача осуществляется шунтированием этой линии на массу. Если в линии больше 70% vbat - это 1, если менее 30% - это 0. Поправьте если ошибаюсь. У каждого устройства подключенного к линии есть свой адрес, который идет первым в посылке. Если адрес не тот, устройство пропускает это мимо ушей. Я уже собрал требуемое устройство на atmega48 и микросхеме l9637d, все работает (использую UART) Потом мне на глаза попалось подобное устройство, схему которого я привел выше. Мне нужно переделать свое, уйти от UART, уменьшить размер и стоимость. С аппаратной частью проблем нет. Проблема в софте. Я не знаю как передать эти команды без UART. Может SPI?
Re: CodeVision AVR в вопросах и ответах
Не подскажете, как в КВ записать во все ячейки EEprom, число, скажем, 11? Что-то я не могу найти, как здесь присвоить переменной конкретный адрес в еепром?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
Во-первых это не CAN шина. Все эти устройства не общаются между собой. Они все "ведомые". Откликаются они только когда получают пакет со своим адресом от ведущего устройства. Например, от K-line адаптера. Или от того, которое я делаю.
Во-вторых на линии ничего нет, кроме моего и опрашиваемого устройства, которое сидит молча, пока его не опросить.
Даже если предположить, что такое случиться, то не произойдет ровным счетом ничего. Т.к. в линии начнется хаос даже не из единиц и нолей. И ни одно устройство не сможет признать это за какую либо команду, не то чтобы еще и XOR верно посчитать
Во-вторых на линии ничего нет, кроме моего и опрашиваемого устройства, которое сидит молча, пока его не опросить.
Даже если предположить, что такое случиться, то не произойдет ровным счетом ничего. Т.к. в линии начнется хаос даже не из единиц и нолей. И ни одно устройство не сможет признать это за какую либо команду, не то чтобы еще и XOR верно посчитать
Re: CodeVision AVR в вопросах и ответах
+1. И увеличить EndAddress на 1. Иначе последняя ячейка останется незаписанной. В условии петли стоит "<", т.е. последнюю исключает. Можно (наверное и нужно) сделать "<=".pyzhman писал(а):Функцию EEPROM_write объявите.
С уважением,
Виктор.
Виктор.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: CodeVision AVR в вопросах и ответах
... в строках с #DEFINE уберите коментарииВ чем здесь дело, не пойму??
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
Никаких чудес.
Ваш код в каком блоке кода находится ? Где {....} ?
Ваш код в каком блоке кода находится ? Где {....} ?
Re: CodeVision AVR в вопросах и ответах
Аlex писал(а):Никаких чудес.
Ваш код в каком блоке кода находится ? Где {....} ?
Точно.. )) Надо же быть настолько невнимательным..
Спасибо.
Re: CodeVision AVR в вопросах и ответах
привет всем помогите пожалуста переписать программу для 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(;;); //бесконечный цикл
}
#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 в вопросах и ответах
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 плиииз (
Обратно даже не просите
... В поисках истины человек развивается.
-
maxim___71rus
- Родился
- Сообщения: 9
- Зарегистрирован: Пт май 04, 2012 17:31:06
Re: CodeVision AVR в вопросах и ответах
Доброго времени суток!
Прошиваю чип at90usb162 через codevisionavr с помощью программатора stk200/300 (обычный 5проводков) : нажимаю Read ChipSignature чип определяется- т.е. компьтер видит и программатор и сам чип?
Нажимаю EraseChip выдает вот такую ошибку(см.приложения)
Что это за ошибка и как с ней бороться?
Заранее спасибо.
Прошиваю чип at90usb162 через codevisionavr с помощью программатора stk200/300 (обычный 5проводков) : нажимаю Read ChipSignature чип определяется- т.е. компьтер видит и программатор и сам чип?
Нажимаю EraseChip выдает вот такую ошибку(см.приложения)
Что это за ошибка и как с ней бороться?
Заранее спасибо.
- Вложения
-
- Ошибка!!!!!!.jpg
- (93.58 КБ) 315 скачиваний
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
И какую сигнатуру показывает? если не совпадает с must be: ,то значит не читает.возможно короткое замыкание между ногами мисо моси.
В поисках истины человек развивается.

