реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Есть код для CodeVision. Хочу его адаптировать под WinAVR
singlskv
сообщение Sep 18 2006, 13:20
Сообщение #16


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(-=Женек=- @ Sep 18 2006, 17:06) *
Я привел вам код.
Неужели из него не ясно в каком остоянии находится собака?

Ну я ведь не знаю весь ли это код smile.gif

Чтобы выяснить причину ресета, при старте читайте MCUCSR и выводите
в какой-нибудь порт. По выставленным флагам будет все понятно.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 13:27
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



ПРочел. биты 0 и 1 равны единице.

А вот мои фьюзы:

Код
Fuses
    OSCCAL    = CB, CB, C4, C5
    BLEV    = 1
    BODEN    = 1
    SUT    = 2
    CKSEL    = F
    BLB1    = 3
    BLB0    = 3
    OCDEN    = 1
    JTAGEN    = 1
    CKOPT    = 0
    EESV    = 1
    BSIZ    = 0
    BRST    = 1
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 13:41
Сообщение #18


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(-=Женек=- @ Sep 18 2006, 17:27) *
ПРочел. биты 0 и 1 равны единице.

Значит у Вас происходит External Reset.

Куда у Вас подключен пин Reset ?
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 14:17
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



к разъему для программирования. У меня Altera byte blaster, который можно не снимать после программирования. А еще кнопочка от ресета идет на питание для ручного сброса.

Вот еще что:
Код
void timer_init(void)
{
  
  TCNT1H=TCNT1L=0;
TCCR1A=0;
TCCR1B=12; // cl/256  1000000/256=15625  15625/5=3125
OCR1A=3125;
//TIMSK=16;

}


после комментирования строки TIMSK=16 контроллер перестает ресетиться.
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 18 2006, 14:42
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(-=Женек=- @ Sep 18 2006, 15:35) *
В Вашем коде таймер не срабатывает.
Кстати при компиляции выдается warning "unused parameter TIMER1_COMPA_vect"


В ранних версиях 'avr-libv' для описания функции обработчика прерывания использовалось макро SIGNAL(), сейчас оно переименовано в ISR(). Посмотрите в определено ли в файле 'avr/interrupt.h' ISR()?

Какая у вас версия WinAVR?

Анатолий.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 15:14
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



У меня WinAVR-20050214

в interrupt.h нет не SIGNAL() не ISR()
Но компилятор не ругается на ISR (TIMER1_COMPA_vect)

через поиск попробовал найти файлы содержащие строку "ISR" - не найдено

в очередной раз задаюсь вопросом - почему в CodeVision все работает как часы, а в WinAVR, который хвалят как очень
рациональную программу - вечно какие-то проблемы...
Перейти на WinAVR я был вынужден, так как библиотека для моего LCD есть только для WinAVR
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 18 2006, 15:18
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(-=Женек=- @ Sep 18 2006, 19:12) *
У меня WinAVR-20050214

в interrupt.h нет не SIGNAL() не ISR()
Но компилятор не ругается на ISR (TIMER1_COMPA_vect)

через поиск попробовал найти файлы содержащие строку "ISR" - не найдено


тогда вместо ISR(...) должно быть:
SIGNAL(SIG_OUTPUT_COMPARE1A)

PS: Если компилятор сказал "warning" - это не значит что нет ошибки.

Анатолий.

ADD:

И добавте еще:
#include <avr/signal.h>

Сообщение отредактировал aesok - Sep 18 2006, 15:48
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 18 2006, 15:32
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(-=Женек=- @ Sep 18 2006, 19:14) *
в очередной раз задаюсь вопросом - почему в CodeVision все работает как часы, а в WinAVR, который хвалят как очень
рациональную программу - вечно какие-то проблемы...


В WinAVR конечно-же есть проблемы, но в данном случае претензии к нему не уместны. Кто Вам мешает открыть файл X:\WinAVR\doc\avr-libc\avr-libc-user-manual.pdf и посмотреть как нужно определять прерывания.

Прерывания не определены в стандарте на язык C, и каждый разработчик компилятора имеет право придумать свой синтаксис.

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 15:55
Сообщение #24


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(-=Женек=- @ Sep 18 2006, 18:17) *
к разъему для программирования. У меня Altera byte blaster, который можно не снимать после программирования. А еще кнопочка от ресета идет на питание для ручного сброса.

1. Отключите таки ByteBlaster и проверте что reset подтянут к питанию(через резистор).
2. флаг EXTRF в регистре MCUCSR однозначно указывает на то что у Вас происходит
External Reset.
3. И наконец смените вот этот код:
Код
void timer_init(void)
{
  
  TCNT1H=TCNT1L=0;
TCCR1A=0;
TCCR1B=12; // cl/256  1000000/256=15625  15625/5=3125
OCR1A=3125;
TIMSK=16;

}

1000000/256=15625 blink.gif это круто
15625/5=3125 откуда взялась 5 ?
1000000/256=3906,25

при ваших установках получаем:
OCR1=3125
T=(OCR1+1)*256=3126*256=800256 мкс

Я Вам настоятельно рекомендую сменить Вот на это:
Код
  TCNT1H=TCNT1L=0;
  OCR1A=15624;
  TCCR1A=0;
  TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10);  //clk/64   1000000/64=15625
  TIMSK=(1<<OCIE1A);


T=(OCR1+1)*64=15625*64=1000000 , т.е. ровно 1 сек.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 16:39
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



УУУААААУУУУУУУ!!!!
Заработало!!!!!!

Оказалось нужны были обе меры - и SIGNAL(SIG_OUTPUT_COMPARE1A) и #include....

Теперь я понял, почему компилятор не ругался на ISR - он думал, что я определяю новую функцию с именем ISR, потому и выдавал warning по поводу unused parameter в ней.

Всем спасибо!!!!

Теперь все работает как часы.





Цитата
T=(OCR1+1)*64=15625*256=1000000 , т.е. ровно 1 сек.


Я вам верю, но пикает явны больше 1 раза в секнуду.

Сейчас у меня вот что:
Код
OCR1A = 0xf424;
    OCR1B = 0xf424;
    TCNT1 = 0x0bdc;
    TCCR1A = 0x00;
    TCCR1B = 0x04;
TIMSK=16;

сгенерировал при помощи AtmanAvr
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 16:52
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



...

Сообщение отредактировал -=Женек=- - Sep 18 2006, 16:54
Go to the top of the page
 
+Quote Post
viael
сообщение Sep 18 2006, 16:54
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



Цитата(-=Женек=- @ Sep 18 2006, 19:14) *
У меня WinAVR-20050214

в interrupt.h нет не SIGNAL() не ISR()
Но компилятор не ругается на ISR (TIMER1_COMPA_vect)

через поиск попробовал найти файлы содержащие строку "ISR" - не найдено

в очередной раз задаюсь вопросом - почему в CodeVision все работает как часы, а в WinAVR, который хвалят как очень
рациональную программу - вечно какие-то проблемы...
Перейти на WinAVR я был вынужден, так как библиотека для моего LCD есть только для WinAVR


В таком случае можно посоветовать AtmanAVR.Тот же GCC только удобства такие же как в CV и гемора с созданием проета нету(СodeЦizard,генерация makefile).
Имеется плугины там под LCD и еще чтото.Правда триальный период 30 дней,но лекарство в сети имеется.

http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 17:08
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Так... выплыла проблемка.... С заданием времени.
До этого я писал, что функция _delay_ms() дает значительно более короткие задержки. Я посчитал, что они короче в 16 раз. Теперь предложенный вами вами вариант инициализации таймера дает не 1, а 1/16 секунды.

Кристалл работает на 16 МГц. А компилятор наверное думает, что 1 МГц.

Собственно, вопрос, а где в проекте указывать что частота кристалла равна 16 МГц?
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 17:20
Сообщение #29


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата
У меня WinAVR-20050214

в interrupt.h нет не SIGNAL() не ISR()
Но компилятор не ругается на ISR (TIMER1_COMPA_vect)

А у меня WinAVR-20060421
и ISR в interrupt.h есть smile.gif

Цитата(-=Женек=- @ Sep 18 2006, 20:39) *
Цитата
T=(OCR1+1)*64=15625*64=1000000 , т.е. ровно 1 сек.


Я вам верю, но пикает явны больше 1 раза в секнуду.

Сейчас у меня вот что:
Код
OCR1A = 0xf424;
    OCR1B = 0xf424;
    TCNT1 = 0x0bdc;
    TCCR1A = 0x00;
    TCCR1B = 0x04;
TIMSK=16;

сгенерировал при помощи AtmanAvr

Ну это конечно Ваше дело.
Те установки которые я давал, дают точно 1 сек. на кварце 1МГц.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 17:25
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



А функция _delay_ms() из delay.h как должна испльзоваться? в хидере установлена частота 1 МГц. Менять хидер под новый кварц? Кстати #define F_CPU 16000000UL в фале программы не помогает.

Сообщение отредактировал -=Женек=- - Sep 18 2006, 17:28
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016