Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Уважаемые, подскажите пустяк:

    _чем_ и _как_ заменить printf в драйвере?

    Буду ОЧЕНЬ признателен за кусок кода.

    Нужно заменить строку вида:

    wspintf(Buf,"%#0lx",dwVar);
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    wspintf работает и в драйвере.
     
  3. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    n0name

    error C4013: 'wsprintf' undefined; assuming extern returning int

    как ее запустить?
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    q_q
    Нужно так
    Под отладчиком смотрела/анализировала?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    #include <stdio.h>
     
  6. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    n0name

    Добавил. Толку - нуль. Как была ошибка - так и осталась.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    IceFire

    wsprintf находится в winuser.h
     
  8. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    cresta

    Падаем с ошибками при добавлении этого хидера.

    Ну ладно, я уже просто sprintf обошелся =) Всем спасибо.
     
  9. Pellegrino

    Pellegrino Сергей

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    5
    Адрес:
    Самара
    Нужна прога на любой AVR контроллер со встроенным АЦП (можно и без него, но уже с цифровыми датчиками), что бы она преобразовала аналоговый сигнал с датчика температуры измеряемой в Кельвинах (температура в Кельвинах 0 Цельсия=273 Кельвина = 2,73Вольта, 100 Цельсия =373 Кельвина 3,73 Вольта), и выдавалась в десятичном виде на семисегментный индикатор. Модель термодатчика и индикатора не имеет значения. Микроконтроллер то же можно любой, но желательно AVR. Прога, как я понимаю, состоит из двух частей, преобразовать сигнал из аналогового в цифровой и вывести на индикатор в десятичном виде. Любой пример похожего задания то же пойдет. Нужна просто прога на ассемблере для отображения самого хода процесса на AVR Studio. Есть кусок проги для выдачи сведений на выход, но нужен еще вход и связать их.
    Код (Text):
    1. .include "2313def.inc"
    2.     LDI R16, 0b00001000;
    3. DIND:clr r30;
    4.     ser r31;
    5.     out DDRB, R31;
    6.     out PORTB,r30;
    7.     LSR R16;
    8.     BRCC M1;
    9.     LDI R16, 0b00001000;
    10.     MOV R0,R4;
    11. M1: SBRC R16,2;
    12.     MOV R0,R3;
    13.     SBRC R16,1;
    14.     MOV R0,R2;
    15.     SBRC R16,0;
    16.     MOV R0,R1;
    17.  
    18. INR0: ldi r30,low(tab0);
    19.     ldi r31,high(tab0);
    20.     lsl r30;
    21.     rol r31;
    22.     add r30,r0;
    23.     clr r0;
    24.     adc r31,r0;
    25.     lpm;
    26.     out PORTD, r16;
    27.     out PORTB, r0;
    28.    
    29.     RJMP DIND
    30. TAB0: .DB 0b00111111, 0b00010010, 0b01011011, 0b01001111, 0b01110010, 0b01111001, 0b01111101, 0b00000111, 0b01111111, 0b01101111;
    31. .exit
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Pellegrino
    Выдернул код для работы с АЦП из своего проекта на AVR Tiny26, может пригодится ;)
    Код (Text):
    1. .include "tn26def.inc"
    2. .cseg
    3. ;------------------------------------------------------------------------------------------
    4. .org 0          ; -------- Таблица прерываний ----------
    5.         rjmp    Reset   ; $000 переход к обработке reset
    6.         reti            ; $001 INT0 Внешнее прерывание Request 0
    7.         reti            ; $002 I/O Pins Pin Change Interrupt
    8.         reti            ; $003 TIMER1, CMPA Timer/Counter1 Compare Match 1A
    9.         reti            ; $004 TIMER1, CMPB Timer/Counter1 Compare Match 1B
    10.         reti            ; $005 TIMER1, OVF1 Timer/Counter1 Overflow
    11.         reti            ; $006 TIMER0, OVF0 Timer/Counter0 Overflow
    12.         reti            ; $007 USI_STRT USI Start
    13.         reti            ; $008 USI_OVF USI Overflow
    14.         reti            ; $009 EE_RDY EEPROM Ready
    15.         reti            ; $00A ANA_COMP Analog Comparator
    16.         rjmp  ADC_int       ; $00B ADC ADC Conversion Complete
    17. ;--------------------- Начало программы ---------------------
    18. Reset:  ; действия после сброса процессора
    19.         ; - - - Общая настройка - - -
    20.         ldi r16, RAMEND     ; установить стек в конец ОЗУ ($0DF)
    21.         ; - - - Настройка портов A,B ввода вывода - - -
    22.         ; - - - Порт В - - -  0111 1000 --- сначала верхние ключи ---
    23.         ldi r16, $78        ; PB3, PB4, PB5, PB6 - выходы, остальные - входы
    24.         out DDRB, r16       ; порт выбора направления порта B
    25.         com r16         ; инверсия r16
    26.         out PORTB, r16      ; подтягивающие резисторы подключены
    27.         ; - - - Порт A - - -
    28.         ldi r16, $0F        ;  младшие 4 бита порта A - выходы, старшие 4 бита - входы
    29.         out DDRA, r16       ; порт выбора направления порта A
    30.         com r16             ; инверсия r16
    31. ;       andi r16, $EF       ; отключить подтягивающий резистор на PA4 (ADC3) - задатчик частоты вращения двигателя
    32.         out PORTA, r16      ; подтягивающие резисторы подключены
    33.         ; - - - Настройка спящего режима - - -
    34.         in  r16, MCUCR      ; порт управления спящим режимом
    35.         ori r16, $20        ;  установить бит разрешения спящего режима
    36.         andi r16, $E7       ;  обнулить биты соответствия режиму idle
    37.         out MCUCR, r16      ; порт управления спящим режимом
    38.         ; - - - Настройка АЦП - - -
    39.         ldi r16, (0<<REFS0|1<<ADLAR|$4) ; REFS = 0 - выбрать опорный источник +5В (Uпит)
    40.                 ; ADLAR - выбрать выравнивание результата по старшему байту
    41.                 ; MUX = $4 - установить считывание АЦП с входа ADC4 - задатчик частоты вращения двигателя (средний резистор)
    42.         out ADMUX, r16
    43.         ldi r16, (1<<ADEN|0<<ADIE|$6); ADEN - включить АЦП
    44.                 ; ADIE = 1 - разрешить прерывания от АЦП
    45.                 ; ADPS = $6 - Установить делитель АЦП в 8МГц / 64 = 125кГц (максимальная документированная скорость)
    46.         out ADCSR, r16
    47.         sei             ; Разрешить прерывания
    48. Base_cicle: ; ----- Основной цикл программы -----     
    49.         sleep   ; Вся работа в прерываниях
    50.     rjmp Base_cicle ; --- Конец основного цикла программы ---
    51.  
    52. ;------------------------- Прерывания -----------------------------------
    53. ;-------------------- Прерывание от АЦП ------------------------
    54. ADC_int:   
    55.         in r18, ADCH        ; Прочитать 8 разрядные данные из АЦП (вход ADC4)
    56.         sbi ADCSR, ADSC     ; Начать новое преобразование АЦП
    57.        
    58.     reti    ; --- Конец обработчика прерывания от АЦП ---
     
  11. Pellegrino

    Pellegrino Сергей

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    5
    Адрес:
    Самара
    Y_Mur
    А что за код? Что он делает то? Какие параметры у AVR Tiny26?
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Pellegrino
    Активизирует работу АЦП с входа ADC4 и читает старшие 8бит (из 10ти) в обработчике АЦП прерывания по готовности результатов :)
    AVR Tiny26 - 20 ног, куча полезных функций,
    2K Flash Program Memory, 128 Bytes SRAM, 128-Byte EEPROM, 11-Channel 10-bit A/D converter. Universal Serial Interface. High Frequency PWM. Up to 16 MIPS throughput at 16 MHz.
    подробнее качай даташит на сайте атмела там же свой 2313 найдёшь :)
     
  13. Pellegrino

    Pellegrino Сергей

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    5
    Адрес:
    Самара
    А с температурой это мне как связать или с частотой вращения вала? В проге данные поступают и выводятся на индикатор и все, так что ли или нет?
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Pellegrino
    С АЦП данные поступают в виде числа в диапазоне 0-255 (если 8битный режим) или 0-1024 (10 битный режим). Соответственно если разделить опорное напряжение (5В как у меня в примере или можно выбрать 2,54В; или задать любое удобное резистором на соответсвующем входе) на 255 или 1024 то получишь сколько вольт приходится на "внутреннюю единицу измерения", а соответствие между вольтами и градусами ты же сам приводил :)
     
  15. Pellegrino

    Pellegrino Сергей

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    5
    Адрес:
    Самара
    А схемка подключения его есть? Или схема с расписанными входами и выходами? В коде есть выдача данных на выходной порт?
     
  16. Teel

    Teel New Member

    Публикаций:
    0
    Регистрация:
    15 май 2007
    Сообщения:
    2
    Очень нужна помощь.. лабы (.

    1. Ввести с клавиатуры строку, содержащую не-сколько слов, разделенных пробелом. Переставить в ней слова, поменяв местами первое слово с послед-ним, второе с предпоследним и т.д. Вывести резуль-таты на экран.

    2. Вывести несколько строк произвольного текста, содержащие лишь латинские буквы. Каждые 10 секунд заглавные буквы сменяются строчными и т. д.

    со строками как-то у меня совсем не вяжеться..
    **прикреплена метода в соответствии с которой нужно сделать. но если что, думаю, подправить смогу..
    **это вот такие задачи на специальности информатика в экономике!!!
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Pellegrino
    На входе 23 (PA5\ADC4) потенциометр (переменный резистор подключенный к +5В, общиму и ADC4) которым я задаю частоту вращения двигателя (у тебя вместо него должен быть твой термодатчик), кофигурацию остальных входов\выходов смотри в коде при настройке портов А, В. Но вывод управляющих сигналов на эти выходы я из примера выкинул, поскольку они тебе не по теме, а ты и с этим упрощённым вариантом никак не разберёшся :) Хотя совершенно непонятно как можно чего то не понять в этом перенасыщенном комментариями примере :)

    Teel
    Неплохо вас учат - путная методичка :)
    У тебя же в п7.4 шикарный пример вывода символа по таймеру - тебе просто нужно вывести не один символ а несколько, а чтобы менять заглавные\строчные буквы вычитай\прибавляй к коду символа число 20h ('A'=41h, 'a'=61h)
     
  18. Teel

    Teel New Member

    Публикаций:
    0
    Регистрация:
    15 май 2007
    Сообщения:
    2
    Y_Mur, пасиб.. со второй попробую разобраться.

    а с первой? что подскажите?

    added 16.05.07 - 15.18: пример из п.7.4 не работает (, ну это и не важно.
    ..по идеи мне нужно сделать несколько процедур:
    1. Очистка экрана.
    2. Вывод строки
    3. Преобразование строки
    4. Задержка

    и после организовать их в цикле. но мне непонятно как строку преобразовать.. (т.е. конечно понятно что нужно вычитать и прибавлять 20h, но дальше..) может кто поможет в написании хотябы этой процедуры?..

    added 16.50 - все вторая работает. хмм.. вот код:
    Код (Text):
    1. data    segment
    2. DIRECT  db  1   ; направление перемещения
    3. EXIT        db  0   ; признак завершения программы (не 0)
    4. OLD_CS  dw  ?   ; адрес сегмента старого вектора 1Сh
    5. OLD_IP  dw  ?   ; адрес смещения старого вектора 1Сh
    6. str1        db  0dh,0ah, "StrokavOtTaKaia", "$"
    7. str2        db  0dh,0ah, "aNdVoTTaKaia", "$"
    8. str3        db  0dh,0ah, "ieWEtAkaYavoT", "$"
    9. data    ends
    10.  
    11. code    segment
    12. assume cs:code, ds:data
    13. ; Подпрограмма обработки прерывания 1Сh
    14. NEW_1C  proc        far
    15. push    ax      ; сохранить все регистры
    16. push    bx
    17. push    cx
    18. push    dx
    19. push    ds
    20. push    es
    21. mov  ax, DATA       ; установить ds на сегмент данных
    22. mov  ds, ax         ; основной программы
    23.         mov ax, 40h     ; установить es на
    24.         mov es, ax      ; сегмент данных bios
    25.         mov ax, es:[1ch]     
    26.         mov bx, es:[1ah]
    27.         cmp bx , ax
    28.         je  back
    29.         mov al, es:[bx]
    30.         mov es:[1ch], bx
    31.         cmp al, 30h
    32.         jne back
    33.         mov EXIT, 1
    34. back:       pop es
    35.         pop ds
    36.         pop dx
    37.         pop cx
    38.         pop bx
    39.         pop ax
    40.         iret
    41. NEW_1C  endp
    42. ; Подпрограмма очистки экрана
    43. CLS     proc        near
    44.     mov ax, 0600h
    45.     mov bh, 07h
    46.     mov cx, 0000h
    47.     mov dx, 184fh
    48.     int 10h
    49.     ret
    50. CLS endp   
    51. ; Подпрограмма задержки
    52. DELAY   proc        near
    53.         push    cx
    54.         mov cx, 10000
    55. d12:        push    cx
    56.         xor cx,cx
    57. d11:        nop
    58. loop    d11
    59.         pop     cx
    60.         loop    d12
    61.         pop cx
    62.         ret
    63. DELAY   endp
    64. ; Подпрограмма вывода строки (в dx должен находиться адрес строки)
    65. OUT_STR proc    near
    66.         mov ah, 9
    67.         int 21h
    68.         ret
    69. OUT_STR endp        
    70. ; Подпрограмма преобразования строки (в dx должен находиться адрес строки)
    71. STR_PR  proc    near
    72.         mov bx, dx
    73.         mov si,0
    74. contpr: mov al, [bx+si+2]
    75.         cmp al,'$'
    76.         je endpr
    77.         cmp al,60h
    78.         jg subs
    79.         add al,20h
    80.         jmp nexts
    81. subs:            sub al,20h
    82. nexts:           mov [bx+si+2], al
    83.         inc si
    84.         jmp contpr
    85. endpr:      ret
    86. STR_PR  endp
    87.  
    88. ; Основная программа
    89. START:  mov ax, DATA
    90.         mov ds, ax
    91. ; чтение вектора прерывания
    92.         mov ah, 35h
    93.         mov al, 1Ch
    94.         int 21h
    95.         mov OLD_IP, bx
    96.         mov OLD_CS, es
    97. ; установка вектора прерывания
    98.         push    ds
    99.         mov dx, offset NEW_1C
    100.         mov ax, seg NEW_1C
    101.         mov ds, ax
    102.         mov ah, 25h
    103.         mov al, 1Ch
    104.         int 21h
    105.         pop ds
    106.         mov ax, 0B800h
    107.         mov es, ax
    108. cont:       cmp Exit, 1
    109.         je quit
    110.         call    CLS
    111.         lea     dx, str1
    112.         call    OUT_STR
    113.         call    STR_PR
    114.         lea     dx, str2
    115.         call    OUT_STR
    116.         call    STR_PR
    117.         lea     dx, str3
    118.         call    OUT_STR
    119.         call    STR_PR
    120.         call    DELAY
    121.         jmp cont
    122. quit:       mov dx, OLD_IP
    123.         mov ax, OLD_CS
    124.         mov ds, ax
    125.         mov ah, 25h
    126.         mov al, 1Ch
    127.         int 21h
    128.         mov ax, 4c00h
    129.         int 21h
    130. CODE    ends
    131.     end START
    осталось сделать первую лабу.
     
  19. LIX

    LIX New Member

    Публикаций:
    0
    Регистрация:
    1 май 2007
    Сообщения:
    1
    Лабораторная.
    Одна ее часть - перейти в защищенный режим из реального, и организовать там трансляцию страниц. При возвращении в реальный режим требуется:
    Объясните дураку доступным языком, что это значит? Если я правильно понял, то
    база сегмента, в котором мы находимся+текущее смещение в нем=лин. адрес (| №таблицы, №страницы, смещение в странице | ). Так ли это, и как этого проще всего добиться?
    Заранее спасибо за помощь.
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    угу.
    Чего? Ты же сам настраиваешь таблицу страниц, ну вот и впиши про эту страницу то, что она физически отображается в твой адрес.