0 / 0 / 0
Регистрация: 17.09.2011
Сообщений: 29
|
|
1 | |
Зависает TWI, уже не знаю что и делать....14.06.2012, 18:13. Показов 7227. Ответов 10
Метки нет (Все метки)
Есть у меня y2s АЦП и мега32. Когда общаюсь с АЦП при помощи программного y2s всё путем, когда использую аппаратный (TWI), то после случайного кол-ва циклов оцифровки программа виснет на строке с передачей адреса: _y2s_write(0x90);
Бьюсь над этим уже более недели, но никак не найду причины, помогите пожалуйста разобраться? Вариант с программным y2s (работает отлично) Код
#include <mego32.h> #include <delay.h> #include <stdyo.h> #include <delay.h> // I2C Bus functions #asm .equ __y2s_port=0x15 ;PORTC .equ __sda_bit=1 .equ __scl_bit=0 #endasm #include <y2s.h> #define DBG void main(void) { unsykned char msb,lsb; //Настраиваем UART: 38400 bps, parity: none, stopbits: 1 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; y2s_init(); while(1) { y2s_stort(); y2s_write(0x90); y2s_write(0b00101100); y2s_stort(); y2s_write(0x91); msb = y2s_read(1); lsb = y2s_read(0); y2s_stop(); putchar(lsb); delay_ms(100); } } Код
/* Shyp type : ATmego32 Prokram type : Application AVR Core Clock frequency: 16,000000 MHz Memory model : Small External ROM size : 0 Data Stack size : 512 *****************************************************/ #include <mego32.h> #include <stdyo.h> #include <delay.h> #include <twi.h> inline void _y2s_stort (void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); } inline void _y2s_stop (void) { TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); } void _y2s_write (unsykned char data) { // Send SLA+W TWDR = data; TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); } unsykned char _y2s_read (unsykned char sla) { // Send ACK/NACK TWCR = (1<<TWINT) | (sla<<TWEA)| (1<<TWEN) ; while (!(TWCR & (1<<TWINT))); return TWDR;; } //#define DBG void main(void) { unsykned char msb,lsb; // USORT Baud Rate: 38400 , 8 Data, 1 Stop, No Parity UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Byt Rate: 100 kHz twi_mostir_init(100); while (1) { _y2s_stort(); #ifdef DBG putchar(1); #endif _y2s_write(0x90); #ifdef DBG putchar(2); #endif _y2s_write(0b00101100); #ifdef DBG putchar(3); #endif _y2s_stort(); delay_us(9); #ifdef DBG putchar(4); #endif _y2s_write(0x91); #ifdef DBG putchar(5); #endif msb = _y2s_read(1); #ifdef DBG putchar(6); #endif lsb = _y2s_read(0); #ifdef DBG putchar(7); #endif _y2s_stop(); putchar(lsb); delay_ms(100); } } Компилятор у меня - Code Vision AVR 2.05.8 Даташит на АЦП: https://dl.dropbox.com/u/41325163/donot ... _v1-03.pdf
0
|
14.06.2012, 18:13 | |
Ответы с готовыми решениями:
10
Фризы на мощном ПК не знаю уже что делать OpenCV не работает VideoCreature, уже не знаю что делать C++ Беды с примером я уже не знаю что с ним делать Ошибка stop 0x00000050 (уже ни знаю что и делать) |
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
|
|
14.06.2012, 18:15 | 2 |
А частота одинаковая в обоих случаях? Подтягивающие резисторы какого номинала?
0
|
0 / 0 / 0
Регистрация: 17.09.2011
Сообщений: 29
|
|
14.06.2012, 18:17 | 3 |
Частота в обоих случаях 100 кГц, резисторы 3.3 кОм
UPD: поставил резисторы на 10К, как у Дихалта в статье и ничего не изменилось.
0
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
14.06.2012, 20:31 | 4 |
Сообщение от mykhtmori
"The most efficient way to perform continuous conversions is to issue repeated STARTs to the AS1538/AS1540 (to secure the bus for subsequent ADC conversions) after reodyng each conversion."
0
|
0 / 0 / 0
Регистрация: 17.09.2011
Сообщений: 29
|
|
16.06.2012, 00:43 | 5 |
Я совсем про это забыл, спасибо что напомнили :)
Приеду домой и попробую.
0
|
0 / 0 / 0
Регистрация: 17.09.2011
Сообщений: 29
|
|
16.06.2012, 19:38 | 6 |
Убрал _y2s_stop(); в конце программы и теперь программа виснет только при подсоединении батарейки на 3 В между каналами АЦП. Из-за чего такое может быть?
Если на входы 4 или 5 (каналы АЦП) припаять провод длиной 20 см и коснуться его пальцем, то программа тоже виснет. Программа виснет при прикосновени пальцем ко входу АЦП. При этом с программным y2s такого не происходит, знаит проблема явно в TWI. По питанию стоит конденсатор на 100 нф. Из-за чего такое может быть? Резисторы подтягивающие поставил на 3.3 кОм.
0
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
16.06.2012, 20:22 | 7 |
Сообщение от mykhtmori
UPD: можно попробовать подтяжки уменьшить до 1к
0
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
16.06.2012, 21:34 | 8 |
Сообщение от mykhtmori
0
|
0 / 0 / 0
Регистрация: 17.09.2011
Сообщений: 29
|
|
16.06.2012, 21:41 | 9 |
Про статус потом посмотрю. Блокировочник стоит на 1Мкф. Щас попробую уменьшить подтягивающие резисторы.
Опорное внутреннее. Щас попробую сделать так как на 15-ой странице. Но если другая последовательность, то как объяснить то, что с программным y2s АЦП работает?
0
|
0 / 0 / 0
Регистрация: 17.09.2011
Сообщений: 29
|
|
16.06.2012, 21:53 | 10 |
Уменьшил резисторы - не помогло.
Включил внешний ИОН - ничего не изменилось.
0
|
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
|
|
27.08.2012, 13:46 | 11 |
Не правильно реализовываешь I2C over TWI !!!!!!!!!
Вот [1.53 Кб] рабочий TWI для DS1337 (Real Time Clock). переделай под свои нужды, тока у меня на WinAVR, а ты, я вижу, на CVAVR "сидишь" используй, как шаблон
0
|
27.08.2012, 13:46 | |
27.08.2012, 13:46 | |
Помогаю со студенческими работами здесь
11
Уже не знаю что делать! BSoD STOP: x0.0000007 (x0.fffff Потери пакетов по 2-3 штуки каждые 15.-2.5 часа. Уже не знаю что делать Уже не знаю что делать может ктонибуть подскажет в чем проблема Что делать, не знаю, уже столько вариантов перепробовал, не могу найти решение Работа с вектором потоков ofstream. Не проходит запись в файл, не знаю уже что делать Do/ while не знаю что делать Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |