На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
    > Atmel AT90S2313 + COM порт , помогите плиз передать данные
      Radagast выкинь лучше на порт ноль, и проверяй замером напряжения нога передатчика - питание. Так поймаешь если импеданс.

      Добавлено
      А про очередь передатчика - игнор? :D
        medved_68 ой...так "в состоянии покоя" на ножке TXD высокий потенциал? :(
        про очередь - спасибо за совет, это мне пригодится, когда буду полноценную прогу писать. Т.е. сегодня :)
          Цитата Radagast @
          medved_68 ой...так "в состоянии покоя" на ножке TXD высокий потенциал?

          Нет, это импеданс. По сбросу нога подключена к порту D - режим ввод. Поэтому и говорю - выбрось ноль. :D И увидишь, что ничего не измениться.
            скажите еще плиз, чем отличается jmp от rjmp? судя по описанию в прогах для перехода на метку нужно юзать jmp, так же как и в ASM8086, но в примерах прог я везде вижу rjmp

            Добавлено
            medved_68 хорошо, я выброшу ноль, только объясните, что значит умное слово "импеданс"? оно как-то выражается в вольтах?
              Цитата Radagast @
              скажите еще плиз, чем отличается jmp от rjmp? судя по описанию в прогах для перехода на метку нужно юзать jmp, так же как и в ASM8086, но в примерах прог я везде вижу rjmp

              А где ты в даташите увидел инструкцию jmp??? :) rjmp - это короткий переход высчитывается смещением от места вызова (относительный), до 80Н - вперед, свыше назад + 1 к программному счетчику.
              Цитата Radagast @
              medved_68 хорошо, я выброшу ноль, только объясните, что значит умное слово "импеданс"? оно как-то выражается в вольтах?

              Отключен, или Z-состояние. Вольтметром ловится порядка 3 - 3.8В - достаточно, чтобы сделать вывод: "Ага, единица!!!", но на деле это не так. Осциллографом - если в момент контакта с пином тронуть шину пальцем - видно на экране шум, чего не бывает при достоверном логическом уровне. :)
                medved_68 а какие вольтажи для AT90S2313 соответствуют "1" и "0" ? в документации я не нашел :(
                  Цитата Radagast @
                  а какие вольтажи для AT90S2313 соответствуют "1" и "0" ? в документации я не нашел

                  0.3 - 0.8В для "0", 70%VCC - для "1". Стандарты соответствуют уровням CMOS технологии, поэтому в даташитах обычно опускается. :)
                    medved_68 спасибо :)
                    предыдущая прога заработала нормально (выкидывал 0)
                    сегодня написал прогу собственно по курсачу. Компилится нормально, но я так и не увидел, где в симуляторе AVR Studio можно имитировать сигнал на RXD, так что перед прошивкой выложу код. Глянь плиз, может глазами увидишь какие-то логические ошибки.
                    Принцип работы такой - через UART принимается 100 байт данных на скорости 2400 бит/с, записываются в SRAM, а потом передаются через TXD на скорости 4800 бит/с.
                    ExpandedWrap disabled
                      .include "2313def.inc"
                      .def x1=r16         ;accumulator
                      .def x2=r17         ;byte counter up to 100
                       
                      .org 0              ; вектора прерываний
                              rjmp Reset    
                      .org    URXCaddr
                              rjmp mrxc   ;interrupt RXC
                      .org    UDREaddr
                              rjmp mudre  ;interrupt UDRE
                       
                      RESET:
                          ldi x1,ramend   ;stack define
                          out spl,x1
                          
                      recpr:  ldi x1,0b10010000           ;подготовка к приему
                          ;бит7-RX Complete Interrupt Enable
                          ;бит6-TX Complete Interrupt Enable
                          ;бит5-UART Data Register Empty Interrupt Enable
                          ;бит4-Receiver Enable
                          ;бит3-Transmitter Enable
                          ;бит2-9 Bit Characters
                          ;бит1-Receive Data Bit 8
                          ;бит0-Transmit Data Bit 8
                          out UCR,X1
                       
                          ldi x1,191  ; при кварце 7.3728МГц, скорость =2400
                          out UBRR,x1
                          ldi zh,0    ;инициализация адреса ОЗУ
                          ldi zl,$60
                          ldi x2,0    
                          sei
                       
                      wait:   rjmp wait   ;infinite cycle
                      ;-------------------------------------
                      trapr:  ldi x1,0b00101000 ;подготовка к передаче
                          out UCR,X1
                          ldi x1,95   ; при кварце 7.3728МГц, скорость =4800
                          out UBRR,x1
                          ldi zh,0    
                          ldi zl,$60
                          ldi x2,0
                          sei
                          rjmp trans
                      ;-------------------------------------
                       
                      mrxc:   in x1, UDR ;прием
                          st Z+, x1
                          inc x2
                          cpi x2, 100
                          BREQ trapr
                          reti
                      ;-------------------------------------
                      trans: ;передача
                      mudre:  LD x1, Z+
                          out UDR, x1
                          inc x2
                          cpi x2, 100
                          BREQ recpr
                          reti
                    Сообщение отредактировано: Radagast -
                      Цитата Radagast @
                      А теперь вопросы:
                      1) Я правильно понимаю, что ,как правило, COM1, который юзается и для передачи, и для приема на др компе, на матке находится выше, чем СОМ2 (если смотреть на заднюю стенку)?

                      Не всегда, лучше ссылаться на документацию к матке.
                      Цитата

                      2) Реально ли вообще передавать данные чисто через TXD/RXD, без вникания в протокол и использования служебных пинов типа DCD, DTR или WinAPI без них откажется просто отсылать/считывать сигнал по TXD/RXD с заданной частотой(с учетом стартового, стопового и паритетного бита)? А можно ли с использованием ассемблерной вставки получить доступ к этим пинам напрямую?


                      Реально. Поставить на портах перемычки на DTR-DSR и RTS-CTS или отключить их проверку программно.

                      Насчет прямого доступа к портам, в принципе можно и под NT5+ через драйвера
                      giveIO, ntport,
                      WinIO
                      но для совместимости ИМХО лучше по максимуму держаться подальше от таких решений.
                        Цитата Radagast @
                        Компилится нормально, но я так и не увидел, где в симуляторе AVR Studio можно имитировать сигнал на RXD, так что перед прошивкой выложу код.

                        Нет эмуляции передачи. Ты можешь эмулировать прерывание (если разрешено) записав в приемный регистр байт, который якобы пришел на порт и в отладчике просмотреть по шагам работу программы (отклик на прерывание).
                        Цитата Radagast @
                        Глянь плиз, может глазами увидишь какие-то логические ошибки.

                        1. Главное правило - сохраняй ВСЕ регистры при переходе по вектору прерывания, вплоть до регистров статуса и флагов. У тебя этого нет.
                        2. Идем по логике - принял на скорости 2400, передал на 4800, а если в цикле??? Каким макаром главная программа, которая крутиться в бесконечном цикле:
                        Цитата Radagast @
                        ExpandedWrap disabled
                          wait:   rjmp wait
                        узнает, что все передано и что то нужно далее делать, например, опять вернуть скорость порта назад (для дальнейшего приема) или залечь в Sleep для экономии энергии??? Я понимаю, что ты пока учишься, но ТАКИЕ вещи (оставление "черных ходов") для "себя любимого", чтобы облегчить себе дальнейшую жизнь при наращивании прошивки - надо закладывать сразу, это фундамент. :) Да и препод, зацепившись за это, начнет задавать вопросы в ЭТОМ русле, а не в другом, а ты к ним готов! :D Надеюсь - мысль понятно оформил? ;)
                          medved_68
                          1. наверно вопрос прозвучит диким, но - зачем? :unsure: в данном случае я такой необходимости не вижу. Дальнейшего развития у проги не будет - сдам и забуду, как страшный сон :)
                          и что конкретно Вы имеете в виду?
                          ExpandedWrap disabled
                            push sreg

                          и куда это запихнуть? и потом pop'ить? и что такое регистр флагов? :blink:

                          2.
                          Цитата
                          узнает, что все передано и что то нужно далее делать

                          переход по метке mudre при каждом прерывании "регистр данных UART'a пуст" - при передаче данных.
                          есть отдельные блоки для подготовки приема и передачи - с обнулением счетчика и настройкой UART'a, вроде все логично связано...
                            Цитата Radagast @
                            и куда это запихнуть? и потом pop'ить? и что такое регистр флагов?

                            Перед началом обработки прерывания. Флаги - флаг нуля, переполнения переноса, частичного переноса и т.д.
                            Цитата Radagast @
                            переход по метке mudre при каждом прерывании "регистр данных UART'a пуст" - при передаче данных.

                            Цитата Radagast @
                            ExpandedWrap disabled
                              mudre:  LD x1, Z+
                                      out UDR, x1
                                      inc x2
                                      cpi x2, 100
                                      BREQ recpr
                                      reti
                            Если равно 100 - пропускаем загрузку регистра передатчика и на выход. А на выходе бесконечный цикл...и прерываний от передатчика больше не будет и? :D Так и будет крутиться, бедняга. :D Хотя для этого:
                            Цитата Radagast @
                            Дальнейшего развития у проги не будет - сдам и забуду, как страшный сон
                            даже того, что написал и прерывания прицепил - достаточно, здесь я полностью с тобой согласен. :D
                              Цитата
                              пропускаем загрузку регистра передатчика и на выход.

                              а на выходе подготовка к приему след. 100 байт и ожидание
                              Цитата
                              даже того, что написал и прерывания прицепил - достаточно

                              надо, чтобы прога работала...потому что на данный момент что-то не пашет :( данные с компа уходят, а прога на принимающем компе виснет на Listening... так что хочется быть уверенным, что причина не в АСМ коде.

                              Добавлено
                              я правильно понимаю, что BREQ - переход по метке, если числа равны?
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0689 ]   [ 15 queries used ]   [ Generated: 28.04.24, 04:51 GMT ]