Страница 19 из 111
с прерыванием непонятки
Добавлено: Вт авг 11, 2009 14:49:57
семен78
одно прерывание по таймеру заставляет мигать диод
другое сбрасывает счетчик таймера (кнопкой) и исли кликать чаще периода таймера то по идее диод должен не мигать - но по факту идет обработка прерывания кнопки лишь раз то следующего прерыва по таймеру - почему?
Код: Выделить всё
ISR(INT0_vect){TCNT1=65500;}
ISR(TIMER1_OVF_vect){TCNT1=65500; PORTB^=1<<3;}
int main(void){
CLKPR=0x80;CLKPR=0x08;//Cryst Oscil division:256
// Timer/Counter 1 initialization
TCCR1A=0x00;// Mode: Normal top=FFFFh
TCCR1B=5;// Clock value: /1024
TIMSK=0x80;// Timer 1 Overflow Interrupt: On
TCNT1=65500;
DDRB|=_BV(3);// Вывод порта настраеваем как выход (диод)
PORTD&=~_BV(PD2);// вешаем 0 - на кнопку с +
GIMSK=0b01000000; //разрешаем прерывание int1
MCUCR=0x03; // int by rising front
sei();
while (1);
}
Добавлено: Ср авг 12, 2009 00:04:01
семен78
к земле подтяга не было - вот причина
Добавлено: Вт авг 18, 2009 09:52:42
oleg-him
Здравствуйте! Помогите пожалуйста разобраться с WinAVR не могу ни одну программу откомпилировать! Я МК занялся совсем недавно поэтому ни языка с/с++ не знаю. Как написать простенькую программку для atmega8 чтоб скажем два светодиода перемигивались?

Добавлено: Вт авг 18, 2009 19:59:44
ARV
oleg-him писал(а):Здравствуйте! Помогите пожалуйста разобраться с WinAVR не могу ни одну программу откомпилировать! Я МК занялся совсем недавно поэтому ни языка с/с++ не знаю. Как написать простенькую программку для atmega8 чтоб скажем два светодиода перемигивались?

а при чем тут
WinAVR? изучайте язык Си, изучайте строение МК - тогда будет можно о чем-то говорить.
Добавлено: Чт авг 27, 2009 13:01:17
YS
Мир всем! Люди добрые, подскажите пожалуйста, как заставить компилятор WinAVR генерировать ассемблерный файл вместе с хексом?
Добавлено: Чт авг 27, 2009 15:30:18
ARV
YS писал(а):Мир всем! Люди добрые, подскажите пожалуйста, как заставить компилятор WinAVR генерировать ассемблерный файл вместе с хексом?
вместе по-моему нельзя заставить... а отдельно - можно: используйте опцию -S в командной строке, тогда компиляция будет закончена на этапе создания ассемблерных файлов.
а зачем вам это? для отладкии т.п. вещей достаточно листинга...
Добавлено: Чт авг 27, 2009 15:54:57
YS
используйте опцию -S в командной строке, тогда компиляция будет закончена на этапе создания ассемблерных файлов.
Это тоже подойдет. Спасибо,
ARV!
а зачем вам это?
Вообще я пишу на ассемблере, хочу подглядеть реализацию деления, самому думать лень, инет рыть тоже лень, думаю, дай-ка я напишу на C что-то в духе c=a/b, и погляжу сгенерированный asm. Вот такой я хитрый.

Добавлено: Чт сен 17, 2009 19:00:15
Lucifier
такая проблема....
Код: Выделить всё
> "make.exe" all
0 [main] sh 4636 handle_exceptions: Exception: STATUS_INTEGER_DIVIDE_BY_ZERO
35729 [main] sh 4636 open_stackdumpfile: Dumping stack trace to sh.exe.stackdump
0 [main] sh 2380 handle_exceptions: Exception: STATUS_INTEGER_DIVIDE_BY_ZERO
21275 [main] sh 2380 open_stackdumpfile: Dumping stack trace to sh.exe.stackdump
-------- begin --------
avr-gcc (WinAVR 20080610) 4.3.0
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
0 [main] sh 2744 handle_exceptions: Exception: STATUS_INTEGER_DIVIDE_BY_ZERO
30330 [main] sh 2744 open_stackdumpfile: Dumping stack trace to sh.exe.stackdump
make.exe: *** [sizebefore] Error 100352
> Process Exit Code: 2
> Time Taken: 00:06
может кто знает как эту ошибку исправить?
Добавлено: Чт сен 17, 2009 20:16:52
ARV
Lucifier писал(а):может кто знает как эту ошибку исправить?
скачать последнюю версию
WinAVR, удалив старую под корень
Добавлено: Чт сен 17, 2009 20:40:58
Lucifier
ARV писал(а):Lucifier писал(а):может кто знает как эту ошибку исправить?
скачать последнюю версию
WinAVR, удалив старую под корень
спасибо! помогло!
Добавлено: Пт сен 18, 2009 07:49:19
Lucifier
еще 1 проблема....
Код: Выделить всё
ISR(SIG_ADC)
{
unsigned int ADCdata;
ADCdata = ADCW;
if(ADCdata > (2046/5)) PORTD = 3;
else if (ADCdata < (1023/5)) PORTD = 6;
else PORTD = 5;
ADCSR = ADCSR | 0x40;
}
int main(void)
{
DDRD = 7;
ADMUX=3;
ADCSRA=0b11001110;
sei();
while(1);
}
когда я проверяю работоспособность программы в протеусе выдаёт целую кучу ошибок... но компилируется без ошибок....
Добавлено: Пт сен 18, 2009 08:41:40
ARV
во-первых, рекомендуется не использовать макросы SIG_xxx - они оставлены для совместимости, а им на смену пришли другие макросы, например для АЦП это будет ADC_vect
во-вторых, протеус выдает вам не ошибки, а предупреждения о том, что опорное напряжение для АЦП у вас равно 0. почему - это другой вопрос: или проинициализировали АЦП неверно, или в схеме ошибка.
Добавлено: Вт сен 22, 2009 11:10:10
hunter03
доброго времени суток.
решил я заняться микроконтролерми
в протеусе моделирую, авр студия 4.16 и винавр для написания
и тут же столкнулся с проблемой
хочу изменить состояние пина
не суть важно на каком порту главное что прога отказывается компилится
прога(кусок выдран изи какогото исходника который компилиться):
#include <avr>
int main(void)
{
PORTC=0x00;
DDRC=0x00;
PORTC.4=1;
return 0;
}
ошибка:
../1.c: In function 'main':
../1.c:8: error: expected ';' before numeric constant
make: *** [1.o] Error 1
Build failed with 1 errors and 0 warnings...
что я не правильно делаю
сразу извиняюсь если такой вопрос пробегал просто сейчас интернет у меня жпрс, напряжно 19 страниц читать
заранее благодарен за ответ
Добавлено: Вт сен 22, 2009 12:03:24
ARV
используя WinAVR забудьте про PORTC.4

точечная нотация для обращения к битам портов и регистров в WinAVR не реализована. используйте то, что скомпилируется на любом компиляторе:
Добавлено: Вт сен 22, 2009 13:41:26
hunter03
2ARV
спасибо
только вот интересно есть файлик скачанный с этого форума
и там точечная нотация работает
Добавлено: Вт сен 22, 2009 13:46:00
ARV
этот файл компилиться в WinAVR не может - это исходник из-под CodeVision CVAVR. помимо точечной нотации там есть ряд абсолютно несовместимых с WinAVR вещей - поэтому я не верю, что он компилируется без ошибок.
Добавлено: Вт сен 22, 2009 13:53:49
hunter03
извиняюсь
Вы правы
я тут запутался не много
(((
Не могли бы Вы разъяснить эту строку
<< - битовый сдвиг как я понял
а |= что такое
просто на си писал очень давно
счас в книжку сунулся
там нет ничего такого нет
ЗЫ. или это 2 оператора |и =?
Добавлено: Ср окт 07, 2009 00:48:41
Vergilium
Подскжите пожалуста, мне WinAVR при компиляции выдает:
scroll_line.c:25: warning: built-in function 'index' declared as non-function
scroll_line.c:29: warning: function declaration isn't a prototype
scroll_line.c: In function 'shift':
scroll_line.c:81: warning: cast to pointer from integer of different size
scroll_line.c: In function 'to_ascii':
scroll_line.c:91: warning: cast to pointer from integer of different size
scroll_line.c: In function 'display':
scroll_line.c:186: warning: cast to pointer from integer of different size
scroll_line.c: In function 'error':
scroll_line.c:203: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c: At top level:
scroll_line.c:316: warning: function declaration isn't a prototype
scroll_line.c:335: warning: function declaration isn't a prototype
scroll_line.c:352: warning: function declaration isn't a prototype
scroll_line.c: In function '__vector_1':
scroll_line.c:384: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c: At top level:
scroll_line.c:416: warning: function declaration isn't a prototype
scroll_line.c: In function '__vector_2':
scroll_line.c:438: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:439: warning: passing argument 1 of 'display' makes integer from pointer without a cast
scroll_line.c:445: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:448: warning: passing argument 1 of 'display' makes integer from pointer without a cast
scroll_line.c:465: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:466: warning: passing argument 1 of 'display' makes integer from pointer without a cast
scroll_line.c:473: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:476: warning: passing argument 1 of 'display' makes integer from pointer without a cast
scroll_line.c: In function 'main':
scroll_line.c:525: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:532: warning: passing argument 1 of 'shift' makes integer from pointer without a cast
scroll_line.c:537: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:542: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:549: warning: passing argument 1 of 'to_ascii' makes integer from pointer without a cast
scroll_line.c:556: warning: passing argument 1 of 'display' makes integer from pointer without a cast
На это можно закрыть глаза так как ошибок нет или нужно задуматься и чтото переделывать. И вообще что это значит?
Добавлено: Ср окт 07, 2009 07:12:49
ARV
hunter03 писал(а):я тут запутался не много
"сдвоенные операторы вида |= &= += и т.п. полностью аналогичны следующим (т.е. представляют собой краткую запись):
Код: Выделить всё
а += 1; равносильно а = а + 1;
a |= 5; равносильно а = а | 5;
a <<= 3; равносильно a = a << 3;
и т.д.
Vergilium,
warning - не ошибка, но следует сильно задуматься об их причинах! как правило, они свидетельствуют либо о простой неаккуратности или забывчивости, либо о недопонимании того, что делается в программе. в некоторых случаях результат будет плачевный: при ошибках программа не соберется просто, а при
warning-ах запросто соберется, но может не работать или будет выкидывать чудеса.
Добавлено: Пт окт 16, 2009 21:15:05
Vergilium
Подскажите пожалуйста, как передать байт в регистр последовательно, т.е. есть переменная с определенным значением и нужно записать ее в внешний 8ми битный регистр последовательно бит за битом.