Перейти к содержанию
    

kadrum2

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный
  1. Если Вы пробовали подавать разное напряжение на вход АЦП, и на индикаторе отбражалость новое число, значит ваш девайс работает правильно.. Попробуйте замерять мультиметром напряжения на входе АЦП во время подключения к нему переменного резистора, если крутить ручку, и мультиметр будет показывать разные напряжения, то и девас покажет новое значение. Если нет, проверьте номинал переменного резистора он не должен быть слышком большим.. У меня для таких целей 5,1-33кОм прекрасно работают.. Странно, если вы убрали прерывания от АЦП, то где вы считываете текущее значение с регистра данных АЦП? Я бы поставил его в main. т.е. как я понял у вас данные считываються с АЦП только один раз при включении.
  2. Убрал 1<<TWEA с инициализации.. теперь последовательность выполняемых подпрограмм такая (выполняем раз в секунду): call TWI_start ldi r16,0b11010001 call TWI_send_adr call get_byte1 call get_byte2 call TWI_stop При отладке в пошаговом режиме программа выполняеться, а реал-тайм зависает при втором опросе DS1307 в ожидании установки флага TWINT в подпрограмме TWI_start.. Подпрограммы в приложении.TWI.txt
  3. Сделал так. с JTAG в пошаговой эмуляции работает.. читаються разные байты данных.. а если программу запустить в реал тайме, она зацыкливаеться в месте проверки флага TWINT, после формирование сост. "Старт".. Ещё: Поменял частоту TWI. Для 8 МГц она = 97,56 кГц TWI_init: ldi r16,(0<<TWPS0)|(0<<TWPS1) out TWSR,r16 ldi r16,21 // 97кГц out TWBR,r16 ldi r16,(1<<TWEA)|(1<<TWEN)|(0<<TWIE) out TWCR,r16 ret
  4. Всё равно, второй байт постоянно FF... После чтения первого байта из TWDR устанавливаю разрешение АСК: get_byte1: in r16,TWCR sbrs r16,TWINT rjmp get_byte1 in r16,twdr ldi XH,high(secs_twi1) ldi XL,low(secs_twi1) st x,r16 ldi r16,(1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE); бит TWEA = 1 out TWCR,r16 ret Значит, второй байт должен быть отправлен микросхемой на шину.. Я думаю проблема может быть в протоколе обмена: По даташиту: При чтении из DS1307 нужно сделать Старт -> Отправка адреса(R/W = 1), проверяем АСК-> читаем байт, делаем АСК-> читаем байт, делаем неАСК->Стоп В этом случае программа при отладке ведёт себя нормально, даже считываються разные значения 2-х байтов..А при запуске в реал-тайм прога зацикливаеться в этом месте при формировании старт: waitST: in r16,TWCR sbrs r16,TWINT rjmp waitST Как делаю я: Старт -> Отправка адреса(R/W = 1), проверяем АСК-> Отправляю "0" -> читаем байт, делаем АСК-> читаем байт, делаем неАСК->Стоп В таком режиме читаеться первый байт
  5. Ой... точно.. а я то думаю, почему МК паразагружаеться при ошибке.. Исправил. И запретил прерывания при отправке данных. Сейчас узнаем, что происходит :smile3046:
  6. DS1307 может оживить время?

    Всем доброе время суток! У меня проблема с DS1307. Использую Мегу16 После инициализации МК произвожу чтение с этой МС раз в секунду таким способом: Первый байт принимаеться каждый раз с новым значением, а второй - постоянно $FF Как принять последовательность из нескольких байт? call TWI_init ; инитим I2C МК call TWI_stop call TWI_start ldi r16,0b11010001 call TWI_send_adr ldi r16,0 ; r16 используеться для передачи след. ф.-ии значений call TWI_send_data call get_byte1 ; При приеме первого байта считываеться случаqное число регистра данных TWI call get_byte2 ; При приеме второго байта постоянно принимается $FF call TWI_stop .. .. .. TWI_init: ldi r16,(0<<TWPS0)|(1<<TWPS1) out TWSR,r16 ldi r16,9 ; битрейт при частоте 8МГц меньше 100кГц out TWBR,r16 ldi r16,(1<<TWEA)|(1<<TWEN)|(0<<TWIE); out TWCR,r16 ret ; ; TWI_start: ldi r16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR, r16; формирование режима START waitST: in r16,TWCR ; Проверка бита TWINT sbrs r16,TWINT rjmp waitST ; Не получен TWINT - цикл RETURN: ret TWI_send_adr: // проверим, что предидущее состояние было старт // в регистре r16 содержится адрес адрессуемого устройства push r16 in r16,TWSR ; Проверка кода ответа andi r16,0xF8 cpi r16,$08 breq dalee11 cpi r16,$10 breq dalee11 ; Правильный код -выход из подпрограммы brne TWI_error ; Нет - повтор. dalee11: pop r16 out TWDR, r16 ldi r16, (1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE) out TWCR, r16 wait2: in r16,TWCR sbrs r16,TWINT rjmp wait2 // передача не происходит? или установка флага не происходит из-за другой причины? in r16,TWSR andi r16, 0xF8 cpi r16, $18 breq tsa_00 cpi r16, $40 brne TWI_ERROR tsa_00: ret ; get_byte1: in r16,TWCR sbrs r16,TWINT rjmp get_byte1 in r16,twdr ldi XH,high(secs_twi1) ldi XL,low(secs_twi1) st x,r16 // Секунды в БЦД формате записали ldi r16,(1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE) out TWCR,r16 ret ; ; get_byte2: in r16,TWCR sbrs r16,TWINT rjmp get_byte2 in r16,twdr ldi XH,high(secs_twi2) ldi XL,low(secs_twi2) st x,r16 // Секунды в БЦД формате записали ldi r16,(1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE) out TWCR,r16 ret ; TWI_send_data: out TWDR, r16 ldi r16, (0<<TWEA)|(1<<TWINT)|(1<<TWEN)|(1<<TWIE) out TWCR, r16; wait3: sei nop cli in r16,TWCR sbrs r16,TWINT rjmp wait3 in r16,TWSR andi r16, 0xF8 cpi r16, $28;MT_DATA_ACK breq tsa_01 cpi r16,$58 breq tsa_01 cpi r16,$50 brne TWI_error TSA_01: ret
  7. Проверьте правильность установки фьюзов. Скорее, что то не установлено.. или наоборот.
  8. Есть. Напишите мне на kadrum (собака) narod.ru я расскажу, как прикрутить это к МК, только схему представляю теоритически. Практически пробовал только светодиоды МК, и сигнал с усилка для АЦП.
  9. Так... Как Вы и советовали, добавил используемые файлы: buffer.c - к сорцам. buffer.h, uart.h - к хедерам. Скомпилировалось! :) Сейчас попробую в девайс залить.
  10. Я так понял, опция меню Edit Configuration Options -> Include directories "сама собой" добавляет файлы *.с, если указать к ним путь? Скриншот:
  11. Здравствуйте, у меня возникла проблема с освоением WINAVR. При попытке использовать библиотечные функции из Procyon AVRlib Version 20061029 студия ругается. А именно, при использовании функции uartInit(); или еще какой то из того же пакета происходит ошибка: " C:\WinAVR-20071221\Uart\default/../s_uart.c:7: undefined reference to `uartInit' ". (gcc ver.20071221) Листинг: #include <avr/io.h> #include <avr/interrupt.h> #include "buffer.h" #include "uart.h" int main () { uartInit(); return 0; } Хедеры, которые определены в сорцах, я так же скопировал в каталог с моим исходником. Что я не так делаю? Кто-то ведь использовал эту библиотеку, подскажите, буду благодарен за простой пример вроде "Hello, world!" с использованием библиотечных функций. :smile3046:
×
×
  • Создать...