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

 
 
> "Мусор" на входе Atmega
nvk
сообщение Nov 24 2011, 13:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Nov 24 2011, 14:51
Сообщение #2


Гуру
******

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



Цитата(nvk @ Nov 24 2011, 17:50) *
На терминал выводятся числовые или буквенные символы, хотя должен быть 0.

Причин того может быть несколько
1. Неправильно инициируете USART (проверить это затруднительно, поскольку Вы не указали ни тип МК, ни тактовую частоту).
2. Неверные настройки терминала.
3. Неверная установка fuses (можно зациклить программу на МК на выводе одного и того же символа - удобно "U" - и посмотреть/померить время импульсов на выходе USART осциллографом).
4. Ошибка в схеме или в кабеле подключения к ПК.
5. .......

Чем больше Вы дадите информации, тем быстрее получите конкретный совет, позволяющий решить Вашу проблему.
Go to the top of the page
 
+Quote Post
nvk
сообщение Nov 24 2011, 15:48
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 24 2011, 16:11
Сообщение #4


Гуру
******

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



Цитата(nvk @ Nov 24 2011, 19:48) *
if ((PORTB!=0x00) <некое действие>, то это действие будет выполнятся, хотя на всех пинах 0В.

Ноги порта посажены на землю, или "болтаются в воздухе", а потенциал на них Вы замеряете вольтметром?
Go to the top of the page
 
+Quote Post
nvk
сообщение Nov 24 2011, 16:50
Сообщение #5


Участник
*

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



Цитата(Палыч @ Nov 24 2011, 23:11) *
Ноги порта посажены на землю, или "болтаются в воздухе", а потенциал на них Вы замеряете вольтметром?


Болтаются в воздухе. Вольтметром.

Цитата(ucMike @ Nov 24 2011, 23:29) *
Может правильнее:
Код
....
while(1)
{
inputs = PINB;
...


PORTB предназначен как для чтения так и для записи, а PINB только для чтения. В этом и отличие.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 24 2011, 18:54
Сообщение #6


Гуру
******

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



Цитата(nvk @ Nov 24 2011, 20:50) *
PORTB предназначен как для чтения так и для записи, а PINB только для чтения. В этом и отличие.

О-па... Просмотрел, что читается PORTB...
Отличие у них не только в том, что один для записи/чтения, а другой только на чтение... Из порта PORTB читается то, что туда записали. Поскольку по сбросу в регистр PORTB заносятся нули, да и программе "PORTB = 0x00;", то читаться всегда должно ноль.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- nvk   "Мусор" на входе Atmega   Nov 24 2011, 13:50
||- - nvk   Цитата(Палыч @ Nov 25 2011, 01:54) Поскол...   Nov 25 2011, 03:20
|- - maksimp   Цитата(nvk @ Nov 24 2011, 20:50) Болтаютс...   Nov 25 2011, 05:58
|- - Палыч   Сообщите: какой компилятор используете. Ошибка, с...   Nov 25 2011, 06:19
|- - 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


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 05:02
Рейтинг@Mail.ru


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