|
|
  |
Есть код для CodeVision. Хочу его адаптировать под WinAVR |
|
|
|
Sep 18 2006, 13:27
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 18 2006, 14:17
|
Знающий
   
Группа: Свой
Сообщений: 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 контроллер перестает ресетиться.
|
|
|
|
|
Sep 18 2006, 14:42
|
Знающий
   
Группа: Участник
Сообщений: 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? Анатолий.
|
|
|
|
|
Sep 18 2006, 15:18
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 18 2006, 15:32
|
Знающий
   
Группа: Участник
Сообщений: 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, и каждый разработчик компилятора имеет право придумать свой синтаксис. Анатолий.
|
|
|
|
|
Sep 18 2006, 15:55
|
дятел
    
Группа: Свой
Сообщений: 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  это круто 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 сек.
|
|
|
|
|
Sep 18 2006, 16:39
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 18 2006, 16:54
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 18 2006, 17:20
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата У меня WinAVR-20050214
в interrupt.h нет не SIGNAL() не ISR() Но компилятор не ругается на ISR (TIMER1_COMPA_vect) А у меня WinAVR-20060421 и ISR в interrupt.h есть Цитата(-=Женек=- @ 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МГц.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|