Cartman

Members
  • Публикации

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О Cartman

  • Звание
    Новенький
  1. Atmega8+передача Массива Ч/з Usart

    На данном этапе проблему похоже решил. В IAR поменял настройки оптимизации по size на Low. Все заработало. Теперь выводит массив независимо от места его инициализации. Может быть, кто читает эту тему сможет как-то пояснить случившееся? Или ссылку кинет о настройках? Кстати, к размышлению.. А как теперь добиться того же в CV1.2...? В CV2.. вроде есть какие-то настройки. Выводы такие, что IAR все таки лучше чем CodeVisio. Хотя и выглядит непрезентабильно.
  2. Atmega8+передача Массива Ч/з Usart

    Доброго времени суток! Начал осваивать USART. Столкнулся с необъяснимой проблемой. В компиляторе CodeVision хочу вывести на терминал массив символов. Тут происходит забавная штука - при условии, что USART по прерыванию принял 4 символа, он должен выдать массив из 5 символов. Первый раз передает abcde, затем только cde через 2 строки. Если в коде передавать символы через ASCII, то все в порядке. Прихожу к выводу, что некорректно работает передача именно массива. Занимаюсь маракобесием второй день: - прошивал с разных версий CV(2.03 версия вообще не выводила массив) - пробовал делать то же самое в IAR 5.. - по сути то же самое с некоторыми отклонениями - прошивал с другого компа другим программатором (STK200/300), прошивал другой контроллер - немного менял инициализацию USART. Даже методом исключения не очень ясно в чем причина. Скажите, где я мог напортачить? Может еще кто-нибудь даст коды фунций? #include <mega8.h> // Standard Input/Output functions #include <stdio.h> #include <delay.h> #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 5 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif bit rx_buffer_overflow; char blink, check; int i; // USART Receiver interrupt service routine interrupt [uSART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data;//заносим цифру в массив rx_wr_index++; }; } //Declare your global variables here /*volatile*/ char message[5]={'a', 'b', 'c', 'd', 'e'}; void main(void) { PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC|=(1<<1); /*PORTD=0x00; DDRD=0xFF;*/ // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00;TCCR0=0x00; TCNT0=0x00;TCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00; OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;ASSR=0x00;TCCR2=0x00;TCNT2=0x00; OCR2=0x00;MCUCR=0x00;TIMSK=0x00; UCSRA=0x00;// USART initialization//8 Data, 1 Stop, No Parity UCSRB=0x98;// USART Receiver: On 10011000 UCSRC=0x86;// USART Transmitter: On 10000110 //UCSRC=0x06; UBRRH=0x00;// USART Mode: Asynchronous UBRRL=0x67;// USART Baud Rate: 9600 ACSR=0x80;SFIOR=0x00; //message[0]=97; // Global enable interrupts //putsf("Hello!"); //putchar(67); rx_wr_index=0; while (1) { #asm("sei") if(rx_wr_index==4) { //putsf("Message came: "); /*for(i=0; i<5; i++) { putchar(rx_buffer[i]); //message[i]=rx_buffer[i]; }*/ /*if(rx_buffer[0]==message[0]) putchar(rx_buffer[3]); else putchar(message[1]);*/ //message[0]=97; for(i=0; i<5; i++) putchar(message[i]); #asm("cli") delay_ms(100); /*putchar(67); putchar(68); putchar(69); putchar(70); putchar(71);*/ /*putchar(message[0]); putchar(message[1]); putchar(message[2]); putchar(message[3]); putchar(message[4]);*/ //putchar(message[0]); rx_wr_index=0; } } }
  3. 8-канальный Ацп Ad7888

    Короче похоже заработало! Оставляю код функции, может кому понадобится. Оказалось проще чем я думал. Поэтому до конца не понимаю почему оно работает. Согласно даташиту начать принимать преобразованные данные надо после 4-го такта. Я же для этого ничего не делаю. На выходе получаю достаточно точный результат. Светодиод моргает при определенном уровне. AD7888.txt
  4. 8-канальный Ацп Ad7888

    quote name='Duhas' date='19.06.2007 - 13:36' post='149137'] мне кажется тут какое-то недопонимание процеса ))) датащит в студию ) и на чем пишите? Пишу в CodeVision на С. _АЦП_AD7888.pdf
  5. Имеется 8-канальный АЦП AD7888, присоединенный через SPI к ATmega128. Программирую в CodeVision на С. В данном примере получается противоречие между тем, что написано в datasheet(e) на АЦП и работой SPI микроконтроллера. Согласно даташиту АЦП данные от микроконтроллера (для выбора канала и режима работы) должны передаваться одновременно с принимаемыми данными от АЦП. Согласно описанию ATmega128 происходит ошибка (выставляется флаг повторной записи WCOL в в регистре состояния SPSR). Я это проверял в эмуляторе VMLAB. Но и так понятно. Получается настраивать SPI, т.е. идут такты SCK, работа получается только если CS=1, хотя в даташите на АЦП пишут при CS=0. Но при этом данные назад не поступают (вернее идет сигнал около 700 мв, хотя ни к какому каналу ничего не приложено). Кто-нибудь программировал подобные вещи или имеет конкретные ссылки?
  6. В общем самый простой выход в сложившейся ситуации принять как данность следующее. Ставить подтягивающие резисторы рекомендуется перед выводами цифровых микросхем работающих на вход. Перед выводами микросхем работающих на выход родтягивающие резисторы не ставятся. P.S. Такое ощущение, что на самом деле не так много людей действительно разбираются как это работает. Я в частности интересовался у себя на работе. И так вроде всем понятно для чего это и как работает. Но те же самые вопросы ставят в результате в тупик. Доходит до того, что некоторые не знают, что pin представляется как несколько транзисторов. Просто не хочется собирать платы не имея понятия как это работает. С булевой алгеброй я знаком и в общем-то элементарными знаниями в этом вопросе обладаю. Думаю таблицы истинности мне здесь вряд ли помогут, суть вопроса как раз находится на более низком уровне понимания. А составлять схемы по даташитам не так уж и сложно. Там все просто написано че как подключать, те же таблицы истинности, поясняющие режимы. Ну короче со временем надеюсь как-нибудь разбирусь.
  7. С этой схемой разобрался и она была не совсем верно нарисована. Суть вопроса не изменилась. Я не понимаю как работают схемы с подтягивающим резистором по теории схемотехники что-ли.
  8. Про К561ЛН1 прочитал, это все понятно. А теперь что?
  9. Я прочитал В.Л. Шило начальные главы, кое-чего уяснил. Судя по этому я действительно нарисовал выходы микросхем. В разделе "буферные и разрешающие элементы" понятно написано про вход разрешения. Но суть вопроса от этого у меня по прежнему не поменялась. Т.к. разрешающие входы настроены определенным образом (разрешается или запрещается прием сигнала по входу лог. элемента или выход размыкается - Z состояние).
  10. Благодарю за вышесказанное, но вопрос остался открытым. Попробую объяснить подробнее, что мне не понятно. (Я рассматриваю схему конкретно так: потенциал в одном месте - больше в другом – меньше, ток бежит от большего к меньшему. У меня возникают вопросы именно на таком уровне понимания) Рассмотрим ситуацию. Микросхема 1 работает на вход. Значит верхний транзистор закрыт, нижний открыт. Соответственно через транзистор бежит ток от цепи с подтягивающим резистором независимо от состояния транзисторов второй микросхемы.??? Если нет подтягивающего резистора, то все понятно: верхний транзистор второй микросхемы открыт – 1(+5В) , закрыт – 0. А тут получается, что через транзистор первой микросхемы всегда будет течь ток (см. Рис1). Если принять, что +5В – это 0, то в этом случае как я полагаю будет аналогично. Всегда 0 на входе первой микросхемы независимо от того, что хочет передать вторая микросхема (открывается верхний транзистор - +5В (0) должен передаться или транзистор закрыт (1) – должна передаться). Тут возникают конкретно такие вопросы. Как первая микросхема узнает, что хочет передать вторая микросхема (0 или1), если на ее транзисторе всегда присутствует один уровень?
  11. Поясните пожалуйста как работает схема с подтягивающим резистором? для чего он нужен я знаю: для установки требуемого уровня напряжения на ножке микросхемы. А вот согласно данному рисунку не могу понять как? Получается если нижний транзистор открыт, то через него все время будет течь ток независимо от состояния второй микросхемы. Может не совсем правильный рисунок? Хотелость бы узнать работу порта на уровне теории цепей.