У мну такое бывает. То либо квавр, толи само жлезо глючит. На LPT подключаете?
CodeVision AVR в вопросах и ответах
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Попробуйте не стирать, а прошить с проверкой стирания.
У мну такое бывает. То либо квавр, толи само жлезо глючит. На LPT подключаете?
У мну такое бывает. То либо квавр, толи само жлезо глючит. На LPT подключаете?
- Реклама
- Сообщения: 11
- Зарегистрирован: Чт янв 19, 2012 17:13:20
Подскажите пожалуйста где копать хорошо бы логический алгоритм
в общем потихоньку осваиваю АВР в среде КВАВР
вопрос в том как примерно реализовать общение Авр с GPS модулем по УАРТ сейчас
тыркаюсь написал программу в протеусе использовал виртуальны терминал с выводом на LM016
код {
lcd_puts (rx_buffer);
}
понятно что все просто все что попало по уарт в буфер летит на экран
Gps модуль мне будет отправлять постоянно координаты на скорости 9600 без запроса и следовательно переполнять в конечном итоге буфер
как бы организовать алгоритм работы чтобы все работало
скажем получать от него данные раз в минуту и обрабатывать их и выводить на экран
направьте меня на нужный путь где почитать где посмотреть
программирую в КВАВР на двоечку или троечку но с УАРТ ещё не сталкивался
в общем потихоньку осваиваю АВР в среде КВАВР
вопрос в том как примерно реализовать общение Авр с GPS модулем по УАРТ сейчас
тыркаюсь написал программу в протеусе использовал виртуальны терминал с выводом на LM016
код {
lcd_puts (rx_buffer);
}
понятно что все просто все что попало по уарт в буфер летит на экран
Gps модуль мне будет отправлять постоянно координаты на скорости 9600 без запроса и следовательно переполнять в конечном итоге буфер
как бы организовать алгоритм работы чтобы все работало
скажем получать от него данные раз в минуту и обрабатывать их и выводить на экран
направьте меня на нужный путь где почитать где посмотреть
программирую в КВАВР на двоечку или троечку но с УАРТ ещё не сталкивался
- Сообщения: 3
- Зарегистрирован: Вт мар 20, 2012 05:25:06
а не подскажете как прошить с поверкой стирания?demiurg301 писал(а):Попробуйте не стирать, а прошить с проверкой стирания.
ну в моём случае не получается зетереть чип как в квавре так и понипроге. а программатор LPT использую, и на COM программаторе пробовал так же при попытке зетереть чип, или же вообще что то в нем изменить, просто блокируется и сигнатуры становятся FF FF FF, хотя при чтении сигнатуры в норме.demiurg301 писал(а): У мну такое бывает. То либо квавр, толи само жлезо глючит. На LPT подключаете?
Помогите пожелуйста кто нить.
- Реклама
Эмулируйте в железе:)dnhftm писал(а): когда я эмулирую данный девайс в протеусе я несказанно обламываясь !!! тк в эмуляции не работает =(
В поисках истины человек развивается.
- Сообщения: 11
- Зарегистрирован: Чт янв 19, 2012 17:13:20
я отрабатываю все виртуально потом делаю в железе тк опыта ещё маловатоvitalik_1984 писал(а):Эмулируйте в железе:)dnhftm писал(а): когда я эмулирую данный девайс в протеусе я несказанно обламываясь !!! тк в эмуляции не работает =(
я долго думал и придумал что делать итак
я перепрограммирую Gps модуль на отправку по запросу вот и все
буду получать данные и обрабатывать когда захочу до приёма я смогу подготовить и очистить буфер
Скажите, а есть ли в квавр инструменты для оценки быстродействия проекта? Например прерывание таймера по переполнению, без предделителя:
interrupt [TIM0_COMP] void TIM0COMP(void){
PORTA = array[++counter];
}
так вот, с какой частотой будет изменяться код на выходе порта А при частоте кристалла 8 МГц?
И можно ли эту частоту как-то увеличить?(может, использование регистров, размещение архива в пзу или оперативной памяти)
Ну и вобще самое главное - как считать)
interrupt [TIM0_COMP] void TIM0COMP(void){
PORTA = array[++counter];
}
так вот, с какой частотой будет изменяться код на выходе порта А при частоте кристалла 8 МГц?
И можно ли эту частоту как-то увеличить?(может, использование регистров, размещение архива в пзу или оперативной памяти)
Ну и вобще самое главное - как считать)
[color=#FF80FF]Не втыкать.[/color]
Нетути. Прогонять через отладчик, тот же AVRStudio. Там в CVAVR есть быстрая кнопочка для вызова отладчика, настраиваемая.
Docendo discimus
элементарно, Ватсон! на вашем порту изменения будут происходить с частотой 8000000/256=31250 Гц. увеличить частоту можно только изменив прерывание на прерывание по совпадению и задав значение регистра OCRx 255 и менее. но не для любого таймера этот метод подходит: только для того, в котором есть аппаратная функция "сравнения".VannO))) писал(а):Например прерывание таймера по переполнению, без предделителя:
interrupt [TIM0_COMP] void TIM0COMP(void){
PORTA = array[++counter];
}
так вот, с какой частотой будет изменяться код на выходе порта А при частоте кристалла 8 МГц?
И можно ли эту частоту как-то увеличить?(может, использование регистров, размещение архива в пзу или оперативной памяти)
Ну и вобще самое главное - как считать)
битва с дураками проиграна, победители торжествуют. слава победителям!
самая максимальная частота может получиться по прерыванию таймера если выставить начальное значение 255для 8бит таймера и 65 536 для 16 битного.
получается прерывание будет происходить каждый такт.
я читал,что Тини можно использовать таким образом в режиме генератора.
думаю и для других контролеров может подойти.
получается прерывание будет происходить каждый такт.
я читал,что Тини можно использовать таким образом в режиме генератора.
думаю и для других контролеров может подойти.
В поисках истины человек развивается.
как всегда: скажете, а про "нюансики" умолчите. а они очень веские:vitalik_1984 писал(а):самая максимальная частота может получиться по прерыванию таймера если выставить начальное значение 255для 8бит таймера и 65 536 для 16 битного.
во-первых, задавать новое значение (вы сказали - начальное) счетчика придется в каждом прерывании
во-вторых, при значении счетчика 255 прерывание будет происходить НЕ КАЖДЫЙ такт. изменение значения порта будет происходить при этом в самом идеальном случае каждые 8 тактов и при этом для основной задачи процессорного времени почти не будет.
битва с дураками проиграна, победители торжествуют. слава победителям!
там я точно не помню вроде написано,что нужно режим выставить вроде Стс.Нужно почитать еще раз аппнот.Я же все не могу запомнить.
И тем более в любом случае сначала выставляется флаг прерывания,а потом уже когда они разрешены уже обработка прерывания идет.
И тем более в любом случае сначала выставляется флаг прерывания,а потом уже когда они разрешены уже обработка прерывания идет.
В поисках истины человек развивается.
Здравствуйте форумчане. Прошу помощи по программке.
Алгоритм понятен по комментариям.
По изменению температуры на DS18B20, изменять состояние портов, на которых будут включены светодиоды.
Я в С еще зеленый, поэтому плохо понимаю.
Вроде проект компилируется, только в конце программы я что то видимо не так сделал с директивой If и Code Vision выдает ошибку.
Может подскажите что я тут накосячил?
Буду очень признателен за помощь!
Вот выкладываю код.
#include <tiny2313.h>
#include <1wire.h>
#include <DELAY.h>
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
#include <ds18b20.h>
void main(void)
{
unsigned char devices;
int temp;
// Инициализация портов
// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port D initialization
PORTD=0x7F;
DDRD=0x7F;
// Инициализация 1 Wire шины
devices = w1_init();
while (1)
{
temp = ds18b20_temperature(0); // Читаем температуру с датчика
if (temp<70) // Если температура менее 70 градусов, зажигаем зеленый светодиод
PORTD.1 = 1;
else PORTD.1=0;
if (temp>70) // Если температура больше 70, моргаем желтым светодиодом
PORTD.2=1;
delay_ms(200);
PORTD.2=0;
delay_ms(200)
if (temp>100) // Если температура выше 100, зажигаем красный светодиод
PORTD.3=1;
};
}
Опрос датчика должен идти постоянно. Светодиоды должны загораться каждый в отдельности, если наступила очередь желтого после зеленого, то зеленый должен потухнуть, а также должен тухнуть желтый при наступлении очереди красного.
Алгоритм понятен по комментариям.
По изменению температуры на DS18B20, изменять состояние портов, на которых будут включены светодиоды.
Я в С еще зеленый, поэтому плохо понимаю.
Вроде проект компилируется, только в конце программы я что то видимо не так сделал с директивой If и Code Vision выдает ошибку.
Может подскажите что я тут накосячил?
Буду очень признателен за помощь!
Вот выкладываю код.
#include <tiny2313.h>
#include <1wire.h>
#include <DELAY.h>
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
#include <ds18b20.h>
void main(void)
{
unsigned char devices;
int temp;
// Инициализация портов
// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port D initialization
PORTD=0x7F;
DDRD=0x7F;
// Инициализация 1 Wire шины
devices = w1_init();
while (1)
{
temp = ds18b20_temperature(0); // Читаем температуру с датчика
if (temp<70) // Если температура менее 70 градусов, зажигаем зеленый светодиод
PORTD.1 = 1;
else PORTD.1=0;
if (temp>70) // Если температура больше 70, моргаем желтым светодиодом
PORTD.2=1;
delay_ms(200);
PORTD.2=0;
delay_ms(200)
if (temp>100) // Если температура выше 100, зажигаем красный светодиод
PORTD.3=1;
};
}
Опрос датчика должен идти постоянно. Светодиоды должны загораться каждый в отдельности, если наступила очередь желтого после зеленого, то зеленый должен потухнуть, а также должен тухнуть желтый при наступлении очереди красного.
отсутствует точка с запятой. Вот тут:
if (temp>70) // Если температура больше 70, моргаем желтым светодиодом
PORTD.2=1;
delay_ms(200);
PORTD.2=0;
delay_ms(200) НЕТУНЕТУНЕТУ!!1
if (temp>100) // Если температура выше 100, зажигаем красный светодиод
PORTD.3=1;
};
}
if (temp>70) // Если температура больше 70, моргаем желтым светодиодом
PORTD.2=1;
delay_ms(200);
PORTD.2=0;
delay_ms(200) НЕТУНЕТУНЕТУ!!1
if (temp>100) // Если температура выше 100, зажигаем красный светодиод
PORTD.3=1;
};
}
[color=#FF80FF]Не втыкать.[/color]
Вопрос вдогонку. В примере с прерыванием выше мне ответили так, будто МК не тратит такты на вход и выход из прерывания, инкремент счетчика, обращение по адресам переменных. Это действительно так? Где можно увидеть АСМ-овский код сгенерённый компилятором?
[color=#FF80FF]Не втыкать.[/color]
Как вам уже успели сказать не хватает точки с запятой,а еще если вы хотите, чтобы моргало только при желтом светодиоде нужно фигурные скобки.Как без них бы работало не думал-леньsvetl1928 писал(а): Может подскажите что я тут накосячил?
Буду очень признателен за помощь!
if (temp>70){// Если температура больше 70, моргаем желтым светодиодом
PORTD.2=1;
delay_ms(200);
PORTD.2=0;
delay_ms(200)} ;
Советую применять такой принцип построения программы(Настройка портов)svetl1928 писал(а): Опрос датчика должен идти постоянно. Светодиоды должны загораться каждый в отдельности, если наступила очередь желтого после зеленого, то зеленый должен потухнуть, а также должен тухнуть желтый при наступлении очереди красного.
он позволит быстро менять назначение выводов для других целей
и при переходе к другому компилятору тоже легче переделывать код
Спойлер
Код: Выделить всё
#include <tiny2313.h>
#include <1wire.h>
#include <DELAY.h>
#asm
.equ __w1_port=0x1B ;PORTA
.equ __w1_bit=0
#endasm
#include <ds18b20.h>
#define _BV(x) (1<<(x))
#define LED_Green _BV(1)
#define LED_Red _BV(2)
#define LED_Yellow _BV(3)
#define LEDS ((LED_Green)|(LED_Red)|(LED_Yellow))
void main(void)
{
//unsigned char devices;
int temp;
// Инициализация портов
// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port D initialization
DDRD=LEDS;
PORTD=0x7F;
// Инициализация 1 Wire шины
w1_init();
//devices = w1_init();
while (1)
{
temp = ds18b20_temperature(0); // Читаем температуру с датчика
PORTD&=~LEDS;
if (temp<70){ // Если температура менее 70 градусов, зажигаем зеленый светодиод
PORTD|=LED_Green; }
else PORTD&=~LED_Green;
if ((temp>70)&&(temp<=100)){ // Если температура больше 70, моргаем желтым светодиодом
PORTD|=LED_Red;
delay_ms(200);
PORTD&=~LED_Red;
delay_ms(200);}
if (temp>100) // Если температура выше 100, зажигаем красный светодиод
PORTD=LED_Red;
};
}
В поисках истины человек развивается.
Подскажите пожалуйста как принять 4 переменных по UART. Как принять одну переменную понятно. Но когда у меня в любой момент времени может перейти эта последовательность из 4 байт я не понимаю как это ловить. Вообщем не мне приходят эти байты, а как мне их значения присвоить переменным?
Маленький хакер в подстанцию влез
Перенаправил поток он с АЭС
Клевая мощность два мегаватта,
Быстро горит материнская плата!
Перенаправил поток он с АЭС
Клевая мощность два мегаватта,
Быстро горит материнская плата!
Для приема нескольких байт есть буфер.То есть принимаем заполняем ячейки но для контроля целостности данных тоже нужно придумать метод. Либо строгий временной протокол,либо контрольная сумма.Ну вообще много вариантов.
Применяется в си функция scanf(формат,переменные_для_внесения_данных).
scanf() в яндексе
Применяется в си функция scanf(формат,переменные_для_внесения_данных).
scanf() в яндексе
В поисках истины человек развивается.


