Где косяк!!!!!!

Есть микроконтроллер - ATtiny2313! Не получается работа с прерыванием по UART. Само прерывание вызывается, но вот в UDR ничего не записывается. Может что-нибудь упустил. Впрочем, ниже преведен код.

  1. #include <avr/io.h>
  2. #include <avr/eeprom.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <avr/interrupt.h>
  6.  
  7.  
  8. ISR(USART_RX_vect)
  9. {
  10.  
  11. int temp;
  12. temp=UDR;
  13. PORTB=temp;
  14. }
  15.  
  16. int main(void)
  17. {
  18.  
  19. DDRB=0xFF;
  20. PORTB=0x00;
  21.  
  22. DDRA=0xFF;
  23. PORTA=0x00;
  24.  
  25. GIMSK=0b00000000;
  26. MCUCR=0b00000000;
  27.  
  28. UCSRA=0x00;
  29. UCSRB=0x90;
  30. UCSRC=0x06;
  31. UBRRH=0x00;
  32. UBRRL=0x34;
  33.  
  34. sei();
  35.  
  36. for(;;)
  37. {}
  38.  
  39. }

Я очень рекомендую, и для

Я очень рекомендую, и для начинающих и для уже бывалых каждую строку читать и комментировать.
Реально как только начнешь комментировать строки, что в них конкретно происходит, сразу же на много много много проблем станет меньше. Так же будет полезно для того, чтобы сторонние люди могли помочь и быстро прочитать и разобрать код.

В заготовках и шаблонах глянь для ATmega8 программу работы по прерыванию. Обработчик подойдет без изменений, только измени код инициализации USART для attiny2313.

Попробуй не int

Попробуй не int temp;
а
unsigned char temp;

Регистр UDR 8-битний все-таки.

Спасибо за столь скорый

Спасибо за столь скорый ответ!:) Идея проста как грабли. Принять по UART некие данные, записать их в EEPROM. По нажатию кнопки (посажена на ножки прерывания). Все, что было записано отсылается обратно. Смысл? А никакого:) Просто хочется поучиться-попрактиковаться.

Разобрался, почему криво работало прерывание. До конца, правда не понял. Записал регистр предделителя - CLKPR=0x80; CLKPR=0x00; Эти значени я получил из Codevision (я новичок, сначала его пробовал, сейчас пробую WinAVR). В нем есть мастер начального кода. Этим мне он и понравился. Вот оттуда я и дернул часть кода. После этих действий я получил желаемое! Прерывание стало вызываться!!! На матрице 8x8 отображалось значение, посылаемое с компа. Почему после манипуляций с предделителем все заработало - вопрос. Скажу только, что работает у меня контроллер от внутреннего генератора (внешнего кварца нет).

  1. #include <avr/io.h>
  2. #include <avr/eeprom.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <avr/interrupt.h>
  6.  
  7. void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
  8. //процедура чтения из EEPROM (дернул из даташита:))
  9. {
  10. /* Wait for completion of previous write */
  11. while(EECR & (1<<EEPE))
  12. ;
  13. /* Set up address and data registers */
  14. EEAR = uiAddress;
  15. EEDR = ucData;
  16. /* Write logical one to EEMPE */
  17. EECR |= (1<<EEMPE);
  18. /* Start eeprom write by setting EEPE */
  19. EECR |= (1<<EEPE);
  20. }
  21.  
  22. unsigned char EEPROM_read(unsigned int uiAddress)
  23. //запись в EEPROM (дернута от туда же)
  24. {
  25. /* Wait for completion of previous write */
  26. while(EECR & (1<<EEPE))
  27. ;
  28. /* Set up address register */
  29. EEAR = uiAddress;
  30. /* Start eeprom read by writing EERE */
  31. EECR |= (1<<EERE);
  32. /* Return data from data register */
  33. return EEDR;
  34. }
  35.  
  36.  
  37. ISR(USART_RX_vect)
  38. {
  39. int temp;
  40. temp=UDR;
  41. //здесь нужно решить проблему инкремента адреса.
  42. //Чтоб при следующей записи адрес автоматом увеличился.
  43. // Глобальную какую-нибудь переменную пришить.
  44. EEPROM_write(0x00,temp);
  45. PORTB=temp;
  46. // заношу значение UDR просто так, для визуального
  47. //наблюдения на светодиодной матрице 8x8, пришло что-нибудь или нет
  48. }
  49.  
  50. int main(void)
  51. {
  52.  
  53. CLKPR=0x80;
  54. //магическая строчка, после написания которой
  55. //все завелось (прерывания, по крайней мере:))
  56. CLKPR=0x00;
  57.  
  58. DDRB=0xFF; // инициализация порта Б
  59. PORTB=0x00; //оба порта подключены к светодиодной матрице
  60.  
  61. DDRA=0xFF; //инициализация порта А
  62. PORTA=0x02;
  63.  
  64.  
  65. GIMSK=0xC0;
  66. MCUCR=0x05;
  67. EIFR=0xC0;
  68.  
  69. UCSRA=0x00;
  70. UCSRB=0x98;
  71. UCSRC=0x06; //Инициализация UART
  72. UBRRH=0x00;
  73. UBRRL=0x34;
  74. sei();
  75.  
  76.  
  77. for(;;) //вечный цикл
  78. {}
  79.  
  80. }

Но, увы и ах! Перестала происходить запись в EEPROM. Вчера пробовал отдельную работу функций из даташита - было все здорово, все зашилось с пол пинка! А сегодня не работает. Вообще никак! Даже сами функции перестали фурычать! Бред какой-то!

Если будут какие предложения по вопросам записи и увеличения адреса ячейки памяти - с радостью прочитаю!

Еще хотелось узнать про Makefale. Почему-то не запускались проекты в AVRStudio! В папке с WinAVR имеется какая-то утилитка по генерации Makefale. Сгенерил свой Makefale - программки писаться стали. Хотелось узнать больше работу связки AVRStudio-WinAVR. Это действует по принципу установил - начал работать? Или нужно что-то настраивать, генерить Makefale и т.п. и т.д? И где удобнее писать и есть ли разница: в AVRStudio или в WinAVR, а потом переносить в AVRStudio?

Ой, что-то много за раз!:)

По поводу работы AVR Studio

По поводу кода хочу сказать что ничего постыдного нету в том чтобы брать код из даташита или у другого автора с другого сайта. Это наоборот хорошо, так как код постоянно дорабатывается, получает гибкость интеграции с другими требовании к выполняемым функциям и задачам.

По поводу работы AVR Studio совместно с Win AVR могу сказать что эти две программы ставятся в последовательности:
1. AVR Studio
2. Win AVR
Просто ставятся и сразу же без никаких настроек или колупаний запускается и работает!
Единственный момент, который надо учесть это путь установки Win AVR и папок проектов. Обязательно путь должен состоять ТОЛЬКО из латиницы(английские буквы алфавита)!

А вот с этим совсем беда!

А вот с этим совсем беда! Имею ввиду последовательность установки! Кто как говорит!:) Как говорится: на вкус и цвет... - все фломастеры разные:) Вот товарищ DIHALT утверждает easyelectronics.ru/avr-studio-likbez.html (и не только он kazus.ru/forums/showthread.php?t=17149), что нужно ставить в обратной последовательности: сначала Win AVR, а потом AVR Studio. Типо будет все в шоколаде:) Вот только у меня что-то как-то кривовато работает! Скачаю с вашего сайта обе проги и установлю в вами указанной последовательности! Авось заработает без шипов!

Смотри, почему я помню именно

Смотри, почему я помню именно что сначала AVR Studio а потом Win AVR, потому что я когда то был установил AVR Studio открыл и решил проект сделать. Но только начал делать новый проект как увидел что могу выбрать только на ассемблере проект. Соответственно установил в срочном порядке Win AVR и появился пункт "AVR GCC".
На данный момент все работает, полет нормальный.

Если правильно - то сперва

Если правильно - то сперва winavr потом studio. Я делал и так и сяк на winxp, работало в обоих случаях. Может логи установки посмотреть, что-то криво может становиться.

Действительно, похоже,

Действительно, похоже, разницы в последовательности установки нет! Внимательнее нужно быть просто! Установливал я проги в отдельную директорию, с ПРЕДЕЛЬНО ПРОСТЫМ НАЗВАНИЕМ БЕЗ ИСПОЛЬЗОВАНИЯ КИРИЛЛИЦЫ В НАЗВАНИИ. Вроде все ок! А вот проект создавал на РАБОЧЕМ СТОЛЕ!:):):) Ржач! Естественно и вплыли непонятки! Потом все заводилось криво, нужно было делать свой Makefail. А сейчас все летает и сразу запускается и компилится, короче радует просто. Думал, кириллицы касается установка программ, но нет: проекты нужно создавать ближе к директории, где установлены проги AVRStudio и WinAVR, не используя кириллицу.

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