Страница 2 из 2

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 18:55:10
Renych
Пробовал эмулировать SPI программно - тот же эффект. Светодиоды "молчат", невзирая на все мои эксперименты.
Складывается ощущение, что драйвер мёртвый. Пришёл к выводу, что без осциллографа "ловить нечего",
получается работа вслепую. Заказал Hantek DSO-5202P, на сл. неделе должен приехать :)
А пока вот какой вопрос возник - во время экспериментов был момент, когда я недоглядел, и на микросхему-драйвер
не поступало питание (либо vcc, либо gnd висели в воздухе), а остальные ноги были подключены и принимали сигналы. Могло ли это вывести микросхему из строя?

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 19:30:16
Alexeyslav
Ты так и не сказал как именно ты подключил светодиоды. Может, не правильно? Выходы микросхемы - источник тока, входящего. Светодиод цеплять надо между выводом и плюсом питания. Никаких SPI чтобы проверить не надо - достаточно оставить выводы в воздухе - они хорошо действуют на наводки, да и при включении часто фиксируется "случайное" содержимое, т.е. они даже без контроллера будут загораться.

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 21:12:29
Renych
Ты так и не сказал как именно ты подключил светодиоды.


Светодиоды подключил в соответствии со схемой из даташита на драйвер (я её уже приводил выше):

Изображение

всего 8 штук к портам OUT0-OUT7
за всё время ни один их них не мигнул.

Светодиод цеплять надо между выводом и плюсом питания.

Я конечно новичок, но анод от катода отличаю :)

Имею два соображения на этот счёт:
1. погорел драйвер, когда был включен в схему без питания (может такое быть?)
2. я его испортил, когда распаивал SOIC на плату. Хотя паять вроде как умею.

вот как это выглядит:

Изображение

У меня есть ещё одна микросхема драйвера. Попробовать распаять её?

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 21:49:49
Martin76
Остальные входы куда подключены?

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 22:03:27
Аlex
Пробовал на LE (4) подавать 1 во время записи и 0 после - без результата.
На LE нужно подавать строб после записи всех 16-ти бит. Это вывод из сдвиговых регистров на выходные защёлки.
МС Вы вряд-ли запалили, скорее всего что-то делаете не так. Что говорит ДШ на счёт сопротивления R-EXT ? Может номинал не подобран ?
Я работал с такими (подобными Вашим) регистрами (5 штук в послед стояли), зажигал матрицу, проблем никаких не возникало.

ЗЫ: У Вас МК вообще запускается ли ? Подёргайте одновременно со своей программой ещё какой-нибудь ногой. Всякое бывает...

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 22:12:52
Аlex
Аlex писал(а):Что говорит ДШ на счёт сопротивления R-EXT ? Может номинал не подобран ?
Ага, вопрос отпадает, я сам посмотрел :) - 20 Ma. Не многовато, кстати, для светиков ? :roll: Живы ли они ещё :?

Re: Управление LED индикатором.

Добавлено: Чт окт 10, 2013 23:01:18
Alexeyslav
перво наперво, проверить наличие питания на самой микросхеме. Макетки эти хитрые заразы... если там где-то нет контакта - ты и не увидишь. Проверить номинал Rext, может ты случайно порядком ошибся. Проверить правильной ли стороной м/с запаял(ну бывает...). Сделать из светодиода логический пробник, и проверить сигналы на входе. Подать некоторую частоту на тактовый вход и перепробовать различные комбинации остальных входов. Ну и в конце-концов, замкнуть выход м/с резистором в 1кОм на общий, дабы проверить светодиоды - правильно ли ты их впаял.

И проверить платку. Когда я собирал такое устройство, долго не мог понять почему данные не передаются во второй каскад, оказалось при травлении между дорожкой выхода с микросхемы остался слой меди меньше микрона и замыкал его на общий. Замыкание это можно было увидеть только микроскопом.
Так что проверяй контакты, как на замыкание так и отсутствие контакта.

Re: Управление LED индикатором.

Добавлено: Вс окт 20, 2013 17:12:32
Renych
Появился осциллограф и я немного продвинулся.
Проблема была в неправильной конфигурации SPI МК.
Как обычно помогло вдумчивое чтение даташита:
If SS is configured as an input, it must be held high to ensure Master SPI operation.

после чего я сделал

Код: Выделить всё

ldi      TEMP,   ( 1 << MOSI ) | ( 1 << SCK ) | ( 1 << CS )
out      DDRB,   TEMP

и увидел на экране свой байт

Изображение
(синий - импульсы синхронизации, жёлтый - данные)

теперь вот вопрос - как сформировать LE импульс синхронизированный с тактовыми?

микросхема драйвера хочет LE вот так (третья строка сверху):

Изображение

а у меня он вот такой:

Изображение

Сейчас делаю так:

Код: Выделить всё

cbi      PORTC,   LE               ; устанавливаю LE в 0

ldi      SPI_DATA_OUT,   0b01100100   ; передаваемый байт

call      SPI_HW_Write               ; пишу байт в SPI

sbi      PORTC,   LE               ; устанавливаю LE в 1   


если сделать его более продолжительным я допустим смогу NOP`ами (что как мне кажется не совсем правильно),
то как попасть им на нарастающий фронт?

Re: Управление LED индикатором.

Добавлено: Вс окт 20, 2013 17:25:03
Аlex
LE нужно поднять и опустить (сформировать строб) после записи всех бит, т.е. , в Вашем случае, после отправки байта модулем SPI.
И необязательно попадать им в какие-то там фронты. Спокойно отправили байт и выдали строб, даже с задержкой.

а у меня он вот такой:
Ну вот, такой он и должен быть, всё верно. 8 тактовых импульсов и потом строб LE.

ЗЫ: Только в регистры нужно 16 бит посылать, а не 8 :)

Re: Управление LED индикатором.

Добавлено: Вс окт 20, 2013 22:13:32
Renych
И необязательно попадать им в какие-то там фронты.

А я думал надо как в мануале. Ок, буду пробовать, спс )
Только в регистры нужно 16 бит посылать, а не 8

Это я знаю )

Re: Управление LED индикатором.

Добавлено: Ср окт 23, 2013 16:23:11
Renych
Ура, получилось! )

Теперь застрял с таймером. Пытаюсь инициализировать таймер 1 и обрабатывать его прерывания.
Куски кода:

Векторы прерываний

Код: Выделить всё

.cseg         ; сегмент кода
.org 0      ; начальный адрес 0

; инициализирую векторы прерываний
Start:     
         rjmp    Init;
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti      ; хочу поймать любое прерывание от таймера 1
         rjmp      TimerInterrupt ; Timer/Counter1 Compare Match A
         rjmp      TimerInterrupt ; Timer/Counter1 Compare Match B
         rjmp      TimerInterrupt ; Timer/Counter1 Compare Match C
         rjmp      TimerInterrupt ; Timer/Counter1 Overflow
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti
         reti

Прерывания моего МК:

Изображение

инициализация таймера

Код: Выделить всё

         ; инициализация таймера
         ldi      TEMP,   0x0D         ; 00001101 указываю предделитель 1024
         sts      TCCR1B,   TEMP         ; и режим CTC – (Clear Timer on Compare)
         
         ldi      TEMP,   high( TIMER_RATIO )   ; загружаю коэффициент таймера (780)
         sts      OCR1AH,   TEMP
         ldi      TEMP,   low( TIMER_RATIO )  ; загружаю коэффициент таймера (780)
         sts      OCR1AL,   TEMP


кусок даташита:
Изображение

разрешаю 4 прерывания от таймера

Код: Выделить всё

         ; маска прерываний
         ldi      TEMP,   0b00001111 ; тут я включаю все 4, для теста
         sts      TIMSK1,   TEMP


кусок даташита:
Изображение

Код: Выделить всё

         ; инициализация компаратора
         ldi      TEMP,   0x80         ;(0b10000000) выключим компаратор
         out      ACSR,   TEMP         ; зачем - не знаю, но так в книжке Белова


кусок даташита:
Изображение

Ну и сам обработчик прерываний:

Код: Выделить всё

TimerInterrupt:
         sbi      PORTE,   PE6      ; зажигаю светодиод, чтоб убедиться,
         reti                   ; что сюда попадает управление


в итоге светодиод не загорается.
понимаю, что скорее всего неправильно инициализировал таймер.
подскажите.

Re: Управление LED индикатором.

Добавлено: Чт окт 24, 2013 12:40:25
Renych
Может я неправильно подключил кварц?
В даташите вычитал:
The device is shipped with Low Power Crystal Oscillator (8.0MHz-16MHz) enabled and with the
fuse CKDIV8 programmed, resulting in 1.0MHz system clock with an 8 MHz crystal.
The default setting of CKSEL3..0 results in Low Power Crystal Oscillator for ATmega16U4 and
ATmega32U4,

Если я правильно понимаю - МК по дефолту настроен на работу с Low Power Crystal Oscillator, который требует кварц 8-16 мГц.
Если предположить, что мой кварц нерабочий (я его за неимением выпаял из старой платы),
могут от этого не срабатывать прерывания от таймера? Не знаю, что ещё предположить.

Re: Управление LED индикатором.

Добавлено: Чт окт 24, 2013 20:54:40
Renych
Победил! )
нужно было выключить JTAG... кто бы мог подумать?

Код: Выделить всё

ldi TEMP, ( 1 << JTD )
out MCUCR, TEMP

Re: Управление LED индикатором.

Добавлено: Чт окт 24, 2013 21:11:14
Аlex
Мои поздравления :beer: