2016-12-03 7 views
0
//*---------------------------------- 
    //* 
    //* PROGRAM NAME: 
    //* MAX5402_test.asm 
    //* 
    //* AUTHOR(S): 
    //* Wilmer 
    //* 
    //* Version: 
    //* 1.0 
    //* 
    //* Last Updated: 
    //* 12/01/2016 
    //* 
    //* Target: 
    //* ATmega16A 
    //* 
    //* DESCRIPTION: 
    //* This program tests the 
    //* MAX5402 Digital POT. using 
    //* subroutines MAX5402_SPI_init, 
    //* to initialize the ATmega16A's 
    //* hardware for SPI, and 
    //* subroutine MAX5402_SPI_write 
    //* to write an 8-bit value to the 
    //* Digital POT to set the position 
    //* of the wiper. 
    //* 
    //* PORTS: 
    //* 
    //* PORTA: 
    //* Not Used. 
    //* 
    //* PORTB: 
    //* PIN5 = MOSI OUPUT 
    //* PIN7 = SCK OUTPUT 
    //* 
    //* PORTC: 
    //* J-Tag Pins 
    //* PIN0 = CHIP SELECT OUTPUT 
    //* 
    //* PORTD: 
    //* Not Used. 
    //* 
    //* Version History: 
    //* 1.0 Original Version 
    //* 
    //*---------------------------------- 

    start: 
    //--------Port Configuration--------// 
     sbi DDRC, 0 ; Port C, Pin0 as 
        ; output for chip 
        ; select 

     ldi r16, $BF ; PORTB as output 
     out DDRB, r16; and MISO as Input 

    //----------Initilize Stack----------// 
    ldi r16, LOW(RAMEND) 
    out SPL, r16 
    ldi r16, HIGH(RAMEND) 
    out SPH, r16 

    //Initialize SPI// 
    call MAX5402_SPI_init 

    main_loop: 
    //Write to the MAX5402// 
     ldi r16, $AB 
     call MAX5402_SPI_write 

     rjmp main_loop 

    //*------------------------------------- 
    //* 
    //* SUBROUTINE NAME: 
    //* MAX5402_SPI_init 
    //* 
    //* AUTHOR(S): 
    //* Wilmer 
    //* 
    //* MODIFIES: 
    //* SPCR (SPI Control Register) 
    //* 
    //* DESCRITION: 
    //* Initialize SPI hardware to 
    //* communicate with the MAX5402 
    //* 
    //*------------------------------------- 

    MAX5402_SPI_init: 
     push r16 ; conserve 

    //---Configuring SPI Control Register---// 
     ;SPI Interrupt disabled 
     ;SPI enabled 
     ;MSB transmitted first 
     ;Master Selected 
     ;Clock Phase & Polarity = 0 
     ;SCK Frequency = fosc/128 

     ldi r16, (0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | 
     (0 << CPOL) | (0 << CPHA) | (1 << SPR1) | (1 << SPR0) 
     out SPCR,r16 

    //-------Clear SPI Interrupt Flag-------// 
     in r16, SPSR 
     in r16, SPDR 

     pop r16 ; restore 
     ret 

    //*-------------------------------- 
    //* 
    //* SUBROUTINE NAME: 
    //* MAX5402_SPI_write 
    //* 
    //* AUTHOR(S): 
    //* Wilmer 
    //* 
    //* MODIFIES: 
    //* R16 
    //* 
    //* DESCRITION: 
    //* Writes 8-bit value in r16. 
    //* This value is used to set the 
    //* wiper position of the MAX5402. 
    //* 
    //*-------------------------------- 

    MAX5402_SPI_write: 
     push r17 ; conserve 
     push r18 
     push r19 

     ldi r19, $FF ; Max Value 

     ldi r17, $00 ; select MAX5402 
     out PINC, r17 

    //----------Send Data to Slave----------// 
    send_data: 
     out SPDR, r16 ; send data to the 
         ; SPI Data Register 

    //-----Wait for Data to be Transfered-----// 
    wait: 
     sbis SPSR, SPIF 
     rjmp wait 

     inc r16  ; cpmare r16 to max value 
     cpse r16, r19 ; if equal, stop sending data 
     rjmp send_data ; and repeat 

     ldi r17, 1 ; de-select MAX5402 

     out PINC, R16 

     pop r19 
     pop r18 
     pop r17 ; restore 
     ret 

Здравствуйте, я пишу эту программу (тестер) для MAX5402 цифрового потенциометра с помощью ATmega16A. Для этой программы клемма H MAX5402 установлена ​​на +5 В, а клемма L - на землю, чтобы создать простой делитель потенциалов с выходом на клемме W (Техническое описание для справки: https://datasheets.maximintegrated.com/en/ds/MAX5402.pdf).конфигурации SPI для MAX5402 цифрового потенциометра с использованием ATmega16A

Что мне нужно сделать, это написать подпрограмму, которая инициализирует аппаратное обеспечение SPI MCU для MAX5402 и другую подпрограмму, которая отправляет ему 8-битное значение с использованием r16 (0x00 -> 0xFF). Это 8-битное значение используется для установки положения стеклоочистителя MAX5402.

Моя проблема заключается в том, что при использовании ATMEL STUDIO 7.0 для эмуляции стеклоочиститель выводит только 2,5 В. Независимо от того, какое значение я посылаю на него, вывод не изменяется.

Я проверил тройные проверки всех физических подключений, поэтому проблема должна быть в коде; но я не могу понять, что случилось. Любая помощь очень ценится, спасибо!

ответ

0

MAX5402_SPI_write рутины выглядят своеобразно. Почему вы отправляете так много бит по SPI?

Из спецификации, похоже, устройство ожидает: notCS низкий, один байт по SPI, затем еще не высокий. Вы отправляете много байтов по SPI на среднем шаге. Это повредит данные, и устройство будет по умолчанию использовать среднее значение, как вы видите.

+0

Я не понимаю. Я отправляю один байт данных в MAX5402, используя: 'send_data: out SPDR, r16' Затем, ожидая передачи данных перед отправкой другого байта в банк. – Anviori

+0

Ах! Пожалуйста, проигнорируйте мой последний комментарий. Я просто прочитал то, о чем вы говорили в спецификации. Я должен сначала установить/CS перед отправкой другого байта данных! Благодарим вас за помощь! – Anviori