Страница 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 чтоб скажем два светодиода перемигивались? :shock:

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

Добавлено: Чт сен 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 не реализована. используйте то, что скомпилируется на любом компиляторе:

Код: Выделить всё

PORTC |= (1<<PC4);

Добавлено: Вт сен 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ми битный регистр последовательно бит за битом.