|
"Мусор" на входе Atmega |
|
|
|
Nov 24 2011, 13:50
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
Добрый день! Имеется следующая программа: CODE #include <avr/io.h> #include <util/delay.h> #include <string.h> #include <stdlib.h>
void USART_Transmit(char *data) { int i,s; s = strlen(data); for(i=0;i<s;i++) { /* Wait for empty transmit buffer */ while (!( UCSRA & (1<<UDRE))); /* Put data into buffer, sends the data */ UDR = data[i]; } }
int main(void) { int inputs; char str[10]; char *ptr; //Все выводы порта В - входы DDRB = 0x00; PORTB = 0x00; //Настройка параметров связи UBRRH = 0x0; UBRRL = 0x7; //скорость 115,2 Кбит UCSRC = 0x86; UCSRA = 0x0; UCSRB = 0x19; //8 бит данных
while(1) { inputs = PORTB; ptr = itoa(inputs, str, 10); USART_Transmit(str); } return 0; }
На терминал выводятся числовые или буквенные символы, хотя должен быть 0. Измерял мультиметром напряжение на каждом отводе - либо 0,02В либо -0,6В.
Сообщение отредактировал IgorKossak - Nov 24 2011, 17:57
Причина редактирования: [codebox]
|
|
|
|
|
 |
Ответов
|
Nov 24 2011, 14:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(nvk @ Nov 24 2011, 17:50)  На терминал выводятся числовые или буквенные символы, хотя должен быть 0. Причин того может быть несколько 1. Неправильно инициируете USART (проверить это затруднительно, поскольку Вы не указали ни тип МК, ни тактовую частоту). 2. Неверные настройки терминала. 3. Неверная установка fuses (можно зациклить программу на МК на выводе одного и того же символа - удобно "U" - и посмотреть/померить время импульсов на выходе USART осциллографом). 4. Ошибка в схеме или в кабеле подключения к ПК. 5. ....... Чем больше Вы дадите информации, тем быстрее получите конкретный совет, позволяющий решить Вашу проблему.
|
|
|
|
|
Nov 24 2011, 15:48
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
1. Микроконтроллер Atmega32, тактовая частота от внешнего кварцевого резонатора частотой 14,7456 МГц. Строки приходят на терминал правильно (например, "HELLO, WORLD!"). 2-4. См. пункт 1. Если написать: if ((PORTB!=0x00) <некое действие>, то это действие будет выполнятся, хотя на всех пинах 0В.
Сообщение отредактировал IgorKossak - Nov 24 2011, 17:58
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Nov 24 2011, 16:50
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 22-07-11
Пользователь №: 66 352

|
Цитата(Палыч @ Nov 24 2011, 23:11)  Ноги порта посажены на землю, или "болтаются в воздухе", а потенциал на них Вы замеряете вольтметром? Болтаются в воздухе. Вольтметром. Цитата(ucMike @ Nov 24 2011, 23:29)  Может правильнее: Код .... while(1) { inputs = PINB; ... PORTB предназначен как для чтения так и для записи, а PINB только для чтения. В этом и отличие.
|
|
|
|
|
Nov 25 2011, 05:58
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(nvk @ Nov 24 2011, 20:50)  Болтаются в воздухе. Вольтметром. Плохо что болтаются. Там не 0, но когда вы подключаете вольтметр, что через его внутреннее сопротивление (хоть даже 10 МОм) напряжение снижается до 0. Например, для проверки можете включить подтяжку на "1" с помощью PORTB=0xff; и прочтите PINB. Должно получиться 0xff. Если теперь замкнуть ногу на 0, то на ней должен прочитаться 0.
|
|
|
|
|
Nov 25 2011, 06:19
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Сообщите: какой компилятор используете.
Ошибка, скорее всего, в настройках компилятора... Сужу это по тому, что условие if(PORTB!=0x00) всегда должно быть ложным, но, по словам ТС - это не так. Возможно, какая-то беда со стеком (например, мало выделенно место под стек, и происходит его переполнение), и ещё что-то подобное.
|
|
|
|
Сообщений в этой теме
nvk "Мусор" на входе Atmega Nov 24 2011, 13:50    Палыч Цитата(nvk @ Nov 24 2011, 20:50) PORTB пр... Nov 24 2011, 18:54     nvk Цитата(Палыч @ Nov 25 2011, 01:54) Поскол... Nov 25 2011, 03:20      nvk Цитата(Палыч @ Nov 25 2011, 13:19) Сообщи... Nov 25 2011, 10:47       nvk Для того, чтобы проверить один старший бит, написа... Nov 27 2011, 06:29        Палыч Цитата(nvk @ Nov 27 2011, 10:29) Работает... Nov 27 2011, 07:13      Marian Цитата(Палыч @ Nov 25 2011, 09:19) Ошибка... Nov 27 2011, 13:16       Палыч Цитата(Marian @ Nov 27 2011, 17:16) Кто в... Nov 27 2011, 15:25 ucMike Может правильнее:
Код....
while(1)
{
input... Nov 24 2011, 16:29 ucMike Для входов PORTB определяет состояние подтягивающи... Nov 24 2011, 17:18 usav Давайте разделим мух и будем властвовать!
1) П... Dec 8 2011, 19:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|