Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.05.2011, 18:43
|
#11
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от =GM=
|
Тут у вас две проблемы. Первая заключается в долгой обработке прерывания, используя несколько printf. Пока принты обрабатываются, возникает новое прерывание (каждые 138 мкс). Внутри прерывания вы запрещаете подачу клоков на таймер, так что нового переполнения не будет, но отложенное прерывание - должно сработать, оно и срабатывает.
Попробуйте после запрещения клоков внутри прерывания снять флаг прерывания вручную, должно помочь.
Вторая проблема у вас по-видимому связана с ПК, уарт не сразу синхронизируется, т.е. начинает принимать с середины бита. Для проверки попробуйте передавать байты с небольшим интервалом между ними. Ещё попробуйте почистить RX буфер ПК перед началом приёма.
|
Спасибо, проблему с отложенным прерыванием исправил, просто отключаю таймер в самом начале в момент прерывания, до того как выполняются все printf
По второй проблеме пока ничего не решил, хотя есть предположение что виноват все же сам камень, точнее неправильно настроенное тактирование от внешнего кварца.
По ДШ CKSEL3..1 = 011
![](http://i060.radikal.ru/1105/70/8d8185ac68f8.jpg)
а вот CKSEL0 и SUT1..0 чему должны быть равны? Я сделал так:
CKSEL0 =1, SUT1..0 = 10, может проблема в этом?
вернул МК к внутреннему генератору 8мГц, так у меня на любой скорости теперь сплошные крокозябры, %90 ошибок
Последний раз редактировалось Sany81; 06.05.2011 в 22:59.
|
|
|
|
06.05.2011, 22:52
|
#12
|
Гражданин KAZUS.RU
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Может попробовать отладить без ререходника RS USB, например через МАХ232, а потом уже через переходник.
|
|
|
|
07.05.2011, 13:54
|
#13
|
Частый гость
Регистрация: 04.01.2010
Адрес: Россия, Киров
Сообщений: 31
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Если я не ошибаюсь, то RS-232 cовсем не совместим с USART по причине физических уровней(RS-232 +-12 или +-5, а USART 0..+5). Поэтому без преобразователя уровней не обойтись. Я обычно использую MAX232cpe. Поэтому если Вы используете переходник USB-›COM, то дальше у Вас должна быть микросхема MAX232, а уже потом контроллер.
|
|
|
|
07.05.2011, 14:45
|
#14
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от Beginner43
|
Если я не ошибаюсь, то RS-232 cовсем не совместим с USART по причине физических уровней(RS-232 +-12 или +-5, а USART 0..+5). Поэтому без преобразователя уровней не обойтись. Я обычно использую MAX232cpe. Поэтому если Вы используете переходник USB-›COM, то дальше у Вас должна быть микросхема MAX232, а уже потом контроллер.
|
Это и есть преобразователь USB-COM-USART, так что не нужно больше ничего.
|
|
|
|
07.05.2011, 14:50
|
#15
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от Beginner43
|
Если я не ошибаюсь, то RS-232 cовсем не совместим с USART по причине физических уровней(RS-232 +-12 или +-5, а USART 0..+5).
|
В телефонных data-кабелях ТТЛ уровни.
|
|
|
|
07.05.2011, 15:11
|
#16
|
Частый гость
Регистрация: 04.01.2010
Адрес: Россия, Киров
Сообщений: 31
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Mega48+USART= кракозябры
"for(count=0;count‹10;count++) {putchar(48+count);} //для проверки" - поробуйте без этой строчки. Такое ощущение, что у вас некорректно отрабатывается процедура putchar.
А вообще, не знаю как это относится к компилятору Си, поскольку для контроллеров код пишу на ассемблере, но обычно много проблем возникает, если в начале прерывания не скинуть в стек все используемые переменные и регистр статуса.
З.Ы. присмотритесь к переменной count - мне кажется она у вас не обнуляется, более того имеет разное значение
Последний раз редактировалось Beginner43; 07.05.2011 в 15:43.
|
|
|
|
07.05.2011, 17:33
|
#17
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от Beginner43
|
"for(count=0;count‹10;count++) {putchar(48+count);} //для проверки" - поробуйте без этой строчки. Такое ощущение, что у вас некорректно отрабатывается процедура putchar.
А вообще, не знаю как это относится к компилятору Си, поскольку для контроллеров код пишу на ассемблере, но обычно много проблем возникает, если в начале прерывания не скинуть в стек все используемые переменные и регистр статуса.
З.Ы. присмотритесь к переменной count - мне кажется она у вас не обнуляется, более того имеет разное значение
|
Эта строчка была просто добавлена для проверки, будут ли ошибки при таком методе вывода или нет, так что ошибки хоть с этой строкой хоть без нее возникают.
Думаю надо и правда попробовать на макс232 собрать преобразователь и попробовать, может проблема не в компе и не в контроллере а в моем преобразователе, хотя телефон на нем работал нормально.
|
|
|
|
07.05.2011, 18:09
|
#18
|
Частый гость
Регистрация: 04.01.2010
Адрес: Россия, Киров
Сообщений: 31
Сказал спасибо: 1
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Когда я осваивал связь компьютера с контроллером, то первым делом написал код, который по прерыванию от приема байта по USART посылал последовательность байт"Hello world", в main крутился пустой цикл. Через hyper terminal посылал любой символ и получал ответ. Такая простая програмка надежно проверит физическую часть, и исключит конфликты внутри контроллера.
|
|
|
|
08.05.2011, 16:20
|
#19
|
Частый гость
Регистрация: 15.07.2006
Сообщений: 26
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от jump
|
akzamit,
экономный вы наш... ![Очень смешно](images/smilies/icon_veryhappy.gif)
сколько раз прошивается современный МК?
а шпротеус ваш - гуано, пол-форума на ушах стоит, рыдает, на сопли исходит, ошибки ища в программах.
только железо + различные дебаггеры фирменные (jtag, ...) могут помочь... да, забыл... без головы программисту-электронщику делать нечего
|
да я стал больше думать, прежде чем залить прошивку для отладки
протеусом не пользуюсь уже года 2, и как говорил, его можно юзать для проверки простых вещей (на крайний случай)
сейчас после пересаживания на JTAG назад уже не хочется, когда только правильным суждением и проверкой кода можно понять в чём косяк.
PS главное -искать правильно ошибку)
современный мк прошивается от 1000 до 10000 раз, свой мк я пошил уже много раз...
Глюк на старте я исправлял стартовым байтом, к примеру 0x17, потом байт длины передачи сообщения, потом данные
очень удобно. можно в конец crc приспособить.
__________________
-
|
|
|
|
09.05.2011, 17:52
|
#20
|
Прохожий
Регистрация: 23.03.2011
Сообщений: 5
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
Re: Mega48+USART= кракозябры
можу порадити наступний варіант:
1. вимкни обробку зовнішнього переривання, залиш лише обробку переривання таймера (і закоментуй це: TCCR0B = 0x00; ).
2. запусти hyper terminal, встанови потрібну швидкість, прибери керування потоком і дивись на отримані дані. переривання по таймеру спрацьовує кожні 36 мс (138 мкс - період тактування таймера, а саме переривання наступить після 256*138мкс=36мс).
це дозволить перевірити роботу usart. якщо дані не биті - під"єднуй зовнішнє переривання і т.д.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:28.
|
|