Немного не в тему - TM1628 посмотрите, если хочется много выводить инфы. Во первых она до 8 разрядов умеет, во вторыху нее подключение на SPI чем то смахивает, только вместо CS у нее вывод STB есть - по сути тот же CS. Я с 1628, 1637, 1650 много работал - очень простые и удобные они. Если библиотеки не использовать, то без проблем с любым МК работают, даже с самыми чахлыми.
_________________ Не важно чем все начнется. Важно чем кончится!
Viper_Snake, есть у вас для ТМ1637 программка для AVR контроллера и модель для Протеуса? Хочу в симуляторе опробовать этот индикатор, пока реальные из Китая жду.
К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать - лично у меня это программный I2C и буфер для вывода на дисплей 4-х байтный в виде массива. Я использую фиксированную адресацию при работе с этими контроллерами, сначала собираю изображение в буфер, к потом скармливаю его контроллеру. По сути у меня эти дисплеи в графическом режиме работают.
_________________ Не важно чем все начнется. Важно чем кончится!
Что то там каша... Смотрите, вкратце: в даташите подробно описан формат посылки для корректной работы контроллера: сначала мы сообщаем ему что хотим делать (писать в регистры чтобы выводить изображение или читать состояние кнопок), после этого сообщаем адрес регистра, куда будем писать данные(соответственно какой разряд будем показывать), затем пишем сами данные и в конце байт управления дисплеем(включен/выключен) какая яркость.
Добавлено after 16 minutes 46 seconds: Грубо говоря, чтобы вывести символ единицы в старшем сегменте надо скормить контроллеру следующее: START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP Тут мы сообщаем, что будем писать в фиксированный адрес (0x44 - в даташите таблица 1 Data command setting), собственно говоря сообщаем адрес первого разряда (0xC0 - табл. 2 Adress command setting), пихаем то, что хотим записать (0x06 - по той же таблице 2) и в конце сообщаем, что дисплей включен на максимальной яркости (0x8F - табл 3 Display control). Вот и все, что надо.
_________________ Не важно чем все начнется. Важно чем кончится!
Добавлено after 7 minutes 6 seconds: Я когда вынужденно с TM1650 переходил на ТМ1637 очень долго плевался, так как сразу этого нюанса не увидел. Надо было на плату с ОК индикатором впилить ОА индикатор - пригодился китайский шилд на 1637. Но грабли нападают изза угла неожиданно - не сразу сообразил, чего он у меня не кажет.
Добавлено after 7 minutes 55 seconds: TM1650 кстати, на мой взгляд, наиболее удачная из всей серии, что мне попадались. И клавиатуру большую можно навесить на нее и дополнительные выводы для этого на ней не нужны в отличие от той же 1628
_________________ Не важно чем все начнется. Важно чем кончится!
;--- Порт D --- ; Порт D0 - clock ; Порт D1 - data
ldi R26, (1<<pin_clk) out port_TM1637, R26 out ddr_TM1637, R26 ;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки. ;data - вход без внутренней подтяжки, работает внешняя подтяжка.
;--- --- stop: sbi port_TM1637, pin_clk ; clock = 1 nop nop cbi ddr_TM1637, pin_data ; data = 1, за счет внешней подтяжки ret
;--- --- ;R26 - передаваемый байт write_byte: ldi count_bits, 8 ; счетчик битов cycle_write_byte: cbi port_TM1637, pin_clk ; clock = 0 lsr R26 ; сдвиг байта вправо brcc set_0 ; если бит = 0, переходим на метку set_0 cbi ddr_TM1637, pin_data ; если бит = 1, data = 1, за счет внешней подтяжки rjmp yes_1 ; и переходим на метку set_1 set_0: sbi ddr_TM1637, pin_data ; если бит = 0, data = 0, тут data - активный выход nop yes_1: nop nop sbi port_TM1637, pin_clk ; clock = 1 dec count_bits brne cycle_write_byte
; далее действия на время ответного нулевого импульса. cbi port_TM1637, pin_clk ; clock = 0 cbi ddr_TM1637, pin_data ; data = 1 за счет внешней подтяжки sbi port_TM1637, pin_clk ; clock = 1, data = 1 за счет ответного нулевого импульса nop nop cbi port_TM1637, pin_clk ; clock = 0 sbi ddr_TM1637, pin_data ; data = 0, тут data - активный выход ret
посмотри, может, поможет тебе.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...
Да. да. На С++ код больше чем на Си, а на Си больше чем на асм. Я по таймеру уже пример приводил, не дошло? А во вторых, у человека в Протеусе Мега32, ага?
Не, ну если так, к чему тогда вопросы: берите библиотеку и вперёд. Просто все эти библиотеки не дают понимания как работает железяка и в случае если надо сделать что-то нестандартное - начинается период глубокого непонимания и затяжного отупения. Вот, например, попробуйте с помощью вышеуказанной библиотеки кнопочки опросить, или энкодер, подключенные к этой микросхеме. Тут и начнутся главные вилы, ибо в библиотеку этот функционал автор по причине лени не завез. А перевести весь интерфейс управления на плечи ТМки и освободив несколько портов МК, иногда которых и так не всегда хватает, это вполне себе отличное решение.
_________________ Не важно чем все начнется. Важно чем кончится!
Согласно поставленным целям: - готовый код/библиотека: с идеями/ограничениями автора, но запускается быстро, самому ничего не придумываешь - собственный код, скомпилированный из чужых программ: с необходимых функций, но все равно большим по объему, сборка кода требует времени - собственный код, для конкретной задачи, используя pdf упр. устройтво: минимальный по объёму кода, учтенные функции и анализ алгоритмов, оптимизированные по времени, используется память, функции конкретного устройства и т.д., но это требует времени, испытаний и собственного мышления.
Особенно то, если код будет "универсальной", как все используемые или редко используемые функции должны быть добавлены, вкл с реальных тестов оптимальности. Больше всего нравится последний путь, но всегда нет времени ... А напр. мне потребовалось 10..12 минут, чтобы запустить готовый код, приведенный выше, от загрузки либа из и-нета до запуска в симуляторе (с заранее нарисованной схемой из других проектов).
Да я и не спорю, просто найти качественную библиотеку, которая не перегружает процессор избыточными операциями и не жрет память как собака мясо сейчас гораздо труднее, чем увидеть как паровоз @бет козу. Например - прикупил по случаю два дисплейчика TFT 160x80 на ST7735. Ну, решил посмотреть, что к чему. Так как проще всего их пощупать с помощью ардуины - к ней же и подключил, а в качестве либы Адафрутовское поделие взял. И хоть я пытался по минимуму код написать - фиг вам получился. Подтянулась еще пачка либ, которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world" высрать на экран?
_________________ Не важно чем все начнется. Важно чем кончится!
... которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world"...
Прежде чем писать так, поставьте себя хотя бы раз на противоположную сторону: допишите/напишите "с нуля"/программный код для чего-то (напр. новое устройство, или набор функций), разработайте прогр. код, почистите ошибки, подробно опишите и опубликуйте код для бесплатного использования. Также можете оставить канал открытым для рекомендаций и дополнений. Напр. под лицензии GNU. Обнаружите, насколько это сложно, насколько трудоемко, отнимает много времени и т.д. и как невозможно удовлетворить все пожелания потребителей.
После того, как сделаете основной код/функции, напр. приду и спрошу: А где функция для ... ? - чего-то особенного или никогда не используемого . Но это делает код неуниверсальным. И будет версия 1,2,3..100 ... написано годами. Дело не в том, что они не могли писать "простой код". Они ушли оттуда, чтобы код стал универсальным. И всегда найдется тот, кому что-то не-ОК по какой-то причине.
Т.е. вероятно, код Adafruit предназначен не только для Hello world. Постарайтесь посмотреть и понять, что уже сделали (функции напр. в .h файл), и использовать все это, когда нужно. Сэкономлены тысячи человеко-часов труда. И все ето бесплатно. (частично пользуюсь переводчиком бг->ру)
veso74, я вас прекрасно понимаю и ваши доводы вполне весомы, но есть другая сторона этого библиотечного безумия: вы ни на шаг не можете отступить от рамок, в которые вас загоняет библиотека, так как вынуждены использовать только ее функции. Свои вы не можете добавить, так как не понимаете, как именно работает железо. Это тупиковая ветвь развития, свойственная всем любителям Arduino которые пользуются исключительно возможностями языка Wiring. Да и сами библиотеки для Arduino зачастую на этом языке и написаны, поэтому кроме базовых возможностей человек, пользующийся подобным, больше ничего не может. А пересилить себя и копнуть чуть глубже многим откровенно лень. Я тоже был таким, пока не нарвался на ситуацию, когда для интересующей меня железки библиотеки рабочей просто не нашлось и мне самому пришлось узнавать, насколько глубока кроличья нора. Теперь я стараюсь избегать любых библиотек - лучше написать свои функции в коде, но только те, которые нужны и самому понятны, чем пытаться вникнуть в логику автора. Было время, я на проклятом модуле с TM1637 точки не мог зажечь нормально - просто не понимал, что и куда писать надо, а сейчас, когда потроха данной микросхемы мне известны, я могу сделать из нее все что угодно в рамках ее функционала. А сделать можно очень много.
_________________ Не важно чем все начнется. Важно чем кончится!
Открываете файл .C и берете то, что вам нужно. Есть одна проблема: надо думать головой автора: что он хотел написать и что он написал, чтобы решить вопрос. Поверьте, это тоже сложно.
Со временем становится легче - лучше понимаете авторов, и "не изобретаете велосипед" для уже проверенных методов и алгоритмов. Через несколько лет будет и следующий шаг: в вашем коде все написано вами. И будет все равно, алгоритм описан ли в основном коде или в библиотеке. В качестве рекомендации: при наличии большого количества упр. устройств проще иметь внешнюю библиотеку для каждого устройства: напр. дисплей, енкодер, вн. EEPROM, DDS, PLL, expander и т.д. Таким образом, в случае возникновения ошибок и неточностей /без них невозможно писать / отправляетесь в соответствующее место для исправления. В противном случае, напр. с пр. кодом из 1 000..10 000 строк, происходит большая "прокрутка" от одного конца программы к другому изменить напр. один бит.
А чтобы подобного не было, нужно заранее продумать, какие биты могут быть подвержены изменениям и удобно оформить их. На чужих мозгах далеко не уехать в любом случае.
_________________ Не важно чем все начнется. Важно чем кончится!
;--- Порт D --- ; Порт D0 - clock ; Порт D1 - data
ldi R26, (1<<pin_clk) out port_TM1637, R26 out ddr_TM1637, R26 ;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки. ;data - вход без внутренней подтяжки, работает внешняя подтяжка.
;--- --- stop: sbi port_TM1637, pin_clk ; clock = 1 nop nop cbi ddr_TM1637, pin_data ; data = 1, за счет внешней подтяжки ret
;--- --- ;R26 - передаваемый байт write_byte: ldi count_bits, 8 ; счетчик битов cycle_write_byte: cbi port_TM1637, pin_clk ; clock = 0 lsr R26 ; сдвиг байта вправо brcc set_0 ; если бит = 0, переходим на метку set_0 cbi ddr_TM1637, pin_data ; если бит = 1, data = 1, за счет внешней подтяжки rjmp yes_1 ; и переходим на метку set_1 set_0: sbi ddr_TM1637, pin_data ; если бит = 0, data = 0, тут data - активный выход nop yes_1: nop nop sbi port_TM1637, pin_clk ; clock = 1 dec count_bits brne cycle_write_byte
; далее действия на время ответного нулевого импульса. cbi port_TM1637, pin_clk ; clock = 0 cbi ddr_TM1637, pin_data ; data = 1 за счет внешней подтяжки sbi port_TM1637, pin_clk ; clock = 1, data = 1 за счет ответного нулевого импульса nop nop cbi port_TM1637, pin_clk ; clock = 0 sbi ddr_TM1637, pin_data ; data = 0, тут data - активный выход ret
Спасибо, конечно, за подпрограммки, но можно бы какой-то пример вывода цифр и точек на экран? С кнопками потом буду разбираться. Я вот пытаюсь что-то подобное выдать: ;START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP, но на индикаторе не "1", а что-то совсем другое. Вот такой вариант (все есть в прикрепленном архиве): Спойлер
;--- Порт C --- ; Порт C0 - clock ; Порт C1 - data
;***** Векторы Прерываний *****
.CSEG .org $000 rjmp RESET ;Сброс вектор .org $002 reti .org $004 reti .org $006 reti .org $008 reti .org $00A reti .org $00C reti .org $00E reti .org $010 reti .org $012 reti .org $014 reti .org $016 reti .org $018 reti .org $01A reti .org $01C reti .org $01E reti .org $020 reti .org $022 reti .org $024 reti .org $026 reti .org $028 reti
RESET: ldi temp,high(RAMEND) ;назначить стек out SPH,temp ldi temp,low(RAMEND) out SPL,temp
ldi R26, (1<<pin_clk) out port_TM1637, R26 out ddr_TM1637, R26 ;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки ;data - вход без внутренней подтяжки, работает внешняя подтяжка
;--- --- stop: sbi port_TM1637, pin_clk ;clock = 1 nop nop cbi ddr_TM1637, pin_data ;data = 1, за счет внешней подтяжки ret
;--- --- ;R26 - передаваемый байт write_byte: ldi count_bits, 8 ;счетчик битов cycle_write_byte: cbi port_TM1637, pin_clk ;clock = 0 lsr R26 ;сдвиг байта вправо brcc set_0 ;если бит = 0, переходим на метку set_0 cbi ddr_TM1637, pin_data ;если бит = 1, data = 1, за счет внешней подтяжки rjmp yes_1 ;и переходим на метку set_1 set_0: sbi ddr_TM1637, pin_data ;если бит = 0, data = 0, тут data - активный выход nop yes_1: nop nop sbi port_TM1637, pin_clk ;clock = 1 dec count_bits brne cycle_write_byte
;далее действия на время ответного нулевого импульса cbi port_TM1637, pin_clk ;clock = 0 cbi ddr_TM1637, pin_data ;data = 1 за счет внешней подтяжки sbi port_TM1637, pin_clk ;clock = 1, data = 1 за счет ответного нулевого импульса nop nop cbi port_TM1637, pin_clk ;clock = 0 sbi ddr_TM1637, pin_data ;data = 0, тут data - активный выход ret
veso74, ваш код работает, но С++ я не знаю, сейчас Си изучаю.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения