Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 20.11.2010, 12:32  
Cybermaker
Вид на жительство
 
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
Cybermaker на пути к лучшему
По умолчанию Re: Помощь в WinAvr

reti возвращает из прерывания. Но в ассемблере. В Си в функциях ISR оно подставляется автоматически. При входе в любую функцию на си - интерпритатор сохраняет в стэк рабочие регистры, а извлекает их оттуда только перед его собственным reti. Так что ваш вызывается когда в стэке еще находятся сохраненные регистры и компилятор пытается из него в PC загрузить адрес, который вовсе и не адрес. Короче один из вариантов утечки памяти.

Сообщение от WartKert Посмотреть сообщение
И возможно ли в #define такое написание
У вас получается условие
if (PINB=PINB & 0x01==0)
Трудно думать что оно делает, но выглядит немного не логично

Напишите
#define Knopka1 (PINB & 0x01) //PB0

и компилятор воспримет это как
if ((PINB & 0x01)==0)

Это условие будет работать
Реклама:
Cybermaker вне форума  
Непрочитано 29.11.2010, 19:37  
AGAT0365
Прописка
 
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
AGAT0365 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Здравствуйте.Вот снова нужна помощ. Есть буфер типа "us_buf[us_per++] = UDR;", как видно в него забиваюся ASCII-код,вот его то хочется преобразовать в целое число. Даже знаю что нужна функция "atoi" но вот как её оформить не пойму.Спасибо.
AGAT0365 вне форума  
Непрочитано 10.12.2010, 18:02  
AGAT0365
Прописка
 
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
AGAT0365 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Доброе время суток! Может кто сталкивался с таким делом.
Отправляю данные с компа на контроллер контр дожен ответить и он отвечает но зацикливается,и ни как не могу исправить это дело вот. Проверял на протеусе всё чётко. ПРограмма для проверки COM Port Toolkit 3.7 да впрочем и другие программы так же работают, а зто отрывок
#include ‹stdlib.h›
#include ‹avr/interrupt.h› // прерывание
#include ‹stdio.h› // ввод вывод в UART
#include "com_io.h"
#include "com_io.c"
#include ‹avr/io.h› // библиотека I/O
#include ‹util/delay.h› // библиотеки пауз stdlib
int tr=0;
ISR(USART_RXC_vect) // USART, Rx Complete
{ scanf("%d",&tr);
printf("summa=%3u\n",tr);
}
int main(void)
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
sei(); // глобальное разрешение прерываний
while (1)
AGAT0365 вне форума  
Непрочитано 10.05.2011, 21:10  
WartKert
Частый гость
 
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
WartKert на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Добрый день.
Тут понял чем дальше изучаеш программирование на С, тем больше понимаеш что надо изучать Asm. Теперь пытаю вставки на Asm в WinAvr. Написал ф-цию "паузы", т.к. WinAvr-ий, Proteus не совсем правильно понимает. Вроде всё работает, но почему-то мне не нравится метод как я написал (слишком много строк, да и запутанно как-то). Подскажите что можно поменять, или другую какую нибудь подсказку скажите.
Код:
void delay_us(int use) { //функция паузы от 1 до 65535 (с точностью +- 0,3 мкс, при F=16,5 МГц)
asm volatile(
"ldi	r29,0x00"	"\n\t"	//обнуление счетчика (через которое происходит поправка по времени)	  			
"ldi	r20,0x02"	"\n\t"	//регистр поправки количества тактов на 1 мкс
"rjmp	L_2%="		"\n\t"	//переход на метку 2				
"L_3%=:"		"\n\t"	//метка выполнение поправки по времени (ускорение на 2 такта)	
"nop"			"\n\t"
"nop"			"\n\t"
"ldi	r29,0x00"	"\n\t"	//обнуление счетчика (через которое происходит поправка по времени)
"breq	L_4%="   	"\n\t"	//переход на метку убавления заданного времени паузы   			
"L_1%=:"		"\n\t"	//метка выполнения основной программы 1
"nop"			"\n\t"
"nop"			"\n\t"
"nop"			"\n\t"
"cpi	r29,0x06"	"\n\t"    //сравнение с регистром (через которое происходит поправка по времени)
"breq	L_3%="		"\n\t"	//переход на метку выполнения поправки (если R29 == 6)
"ldi	r20,0x02"	"\n\t"	//регистр поправки количества тактов на 1 мкс
"L_2%=:"		"\n\t"	//переход на метку основной программы 2			
"inc	r29"		"\n\t"	//инкремент счётчика (через которое происходит поправка по времени)	
"dec	r20"		"\n\t"	//декремент счётчика поправки
"brne	L_2%="		"\n\t"		//зацикливание на метки 2, пока счётчик поправки по тактам не будет 0
"L_4%=:"		"\n\t"	//метка убавления заданного значения паузы
"sbiw	r30,0x01"	"\n\t"	//уменьшение значения в слове на 1
"brne	L_1%="		"\n\t"	//если Z установлен, то идём дальше			
: [us] "+e" (use) );				
	}
WartKert вне форума  
Непрочитано 10.05.2011, 21:26  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Сообщение от WartKert Посмотреть сообщение
Добрый день.
Тут понял чем дальше изучаеш программирование на С, тем больше понимаеш что надо изучать Asm.
Значит СИ ещё не для вас...
АСМ нужен только в двух случаях, критическое ограничение по размеру или по скорости, и "разбор полётов" в особо тяжёлых случаях, когда по другому - никак...
st_1 вне форума  
Непрочитано 10.05.2011, 21:52  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Сообщение от WartKert Посмотреть сообщение
Подскажите что можно поменять, или другую какую нибудь подсказку скажите.
Используйте стандартную _delay_us. Она кстати написана на ассемблере.
Только куда проще и эффективней, чем у Вас вышло
kison вне форума  
Непрочитано 09.06.2011, 17:03  
WartKert
Частый гость
 
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
WartKert на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Цитата:
if (Data_port == 0x7F)
{
#define Free_pin 7
} else if (Data_port == 0xBF)
{
#define Free_pin 6
}
Проблема в том, что почему-то всегда выполняется #define во 2 части условия (независимо от значения). Хотя если задать реальное значение (действие), то условие работает. Но #define всеравно исполняется, который идёт последний. Так возможно ли задать такой выбор?
WartKert вне форума  
Непрочитано 09.06.2011, 17:47  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Сообщение от WartKert Посмотреть сообщение
Но #define всеравно исполняется, который идёт последний. Так возможно ли задать такой выбор?
Нет. Это директива препроцессора. Заведите обычную переменную и присваивайте ей значение.
Код:
uint8_t Free_pin;

if (Data_port == 0x7F)
 {
 Free_pin = 7;
 } else if (Data_port == 0xBF)
 {
 Free_pin = 6;
 }
kison вне форума  
Непрочитано 09.06.2011, 18:06  
WartKert
Частый гость
 
Регистрация: 12.07.2009
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
WartKert на пути к лучшему
По умолчанию Re: Помощь в WinAvr

А если мне нужно чтобы эта переменная назначала выбор (например #if #elif). Насколько я знаю там только через #define ?
WartKert вне форума  
Непрочитано 09.06.2011, 19:38  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помощь в WinAvr

Сообщение от WartKert Посмотреть сообщение
А если мне нужно чтобы эта переменная назначала выбор (например #if #elif). Насколько я знаю там только через #define ?
Я не понял. Все директивы препроцессора используются компилятором во время сборки проекта. И #define и #if и #elif. Соответственно их параметр должен быть известен во время компиляции. Вы же читаете что то с порта. Естественно что считается - неизвестно.
Вы можете сделать дальше выбор и по значению переменной.
Код:
uint8_t Free_pin;

if (Data_port == 0x7F)
 {
 Free_pin = 7;
 } else if (Data_port == 0xBF)
 {
 Free_pin = 6;
 }

if(Free_pin == 6) {...}
// и т.д.
Вообще непонятно что хотите. Попробуйте переформулировать вопрос.
kison вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31
WinAVR: Cи vs C++ vovan_zh Микроконтроллеры, АЦП, память и т.д 3 08.10.2010 23:06
WinAVR не нравится символ '\' vovan_zh Микроконтроллеры, АЦП, память и т.д 10 10.09.2010 20:48
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01


Часовой пояс GMT +4, время: 03:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot