реклама на сайте
подробности

 
 
> Microbalze MCS и программируемый таймер
Weyland
сообщение Apr 4 2014, 09:31
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 3-02-10
Пользователь №: 55 267



Здравствуйте. Пытаюсь освоить работу с Programmable Interval Timer в Microbalze Micro Controller System (v1.0). Написал программу суть которой сводится к обработке прерывания (нажатие кнопки на плате) и вывод на шину IO Bus подряд двух разных значений. Программа работает и я с помощью CHipScope Analyzer вижу что между импульсами записи 7 тактов. Далее хочу вставить задержку между обращениями на шину. За основу взял кусок кода из примера http://www.fpgadeveloper.com/2008/10/micro...lcd-driver.html, переделал его перед библиотеку XIOModule и вставляю в свой код обращение к функции delay_us. Тут для меня начинаются непонятки: расстояние между испульсами увеличивается, но связать его со значением которое отправляю в функцию не получается. Отправлял 1 и 10, расстояние между импульсами в обоих случаях равно 273 тактам. При генерации ядра Microbalze MCS для Programmable Interval Timer 1 выбрал такие настойки: Use Timer - вкл., Number of Bits for Timer - 32, Shall Counter Value Be Readable - вкл., Define Prescaler - None, Generate Interrupt - выкл. Далее привожу код:

Код
#include <stdio.h>
#include "platform.h"
#include "XIOModule.h"

#define IOBUS_write_fifo       (*(volatile u32 *) 0xC0000000)

XIOModule DelayTimer;

void delay_us(u32 time);

void myISR( void )
{
        IOBUS_write_fifo = 0xA;
        delay_us(1);
        IOBUS_write_fifo = 0xB;
}

int main()
{
    init_platform();

    u32 uGpi0;
    //external interrupt
    u8  uIntrId = 16;//XPAR_IOMODULE_0_SYSTEM_INTC_INTERRUPT_0_INTR;

    XIOModule NfdsIOMdule;

    XIOModule_Initialize(&NfdsIOMdule, XPAR_IOMODULE_0_DEVICE_ID);
    XIOModule_Start(&NfdsIOMdule);

    // Initialize the Timer
    u32 status;
    status = XIOModule_Timer_Initialize(&DelayTimer, XPAR_IOMODULE_0_DEVICE_ID);
    if (status != XST_SUCCESS){
        xil_printf("Timer failed to initialize\r\n");
        return XST_FAILURE;
    }

    XIOModule_Timer_SetOptions(&DelayTimer, 0, XTC_INT_MODE_OPTION);

    microblaze_register_handler(XIOModule_DeviceInterruptHandler, XPAR_IOMODULE_0_DEVICE_ID);
    XIOModule_Connect(&NfdsIOMdule, uIntrId, myISR, XPAR_IOMODULE_0_DEVICE_ID);
    XIOModule_Enable(&NfdsIOMdule, uIntrId);

    microblaze_enable_interrupts();

    while(1)
    {
        uGpi0 = XIOModule_DiscreteRead(&NfdsIOMdule, 1); //read gpio (Slide Switches)
        XIOModule_DiscreteWrite(&NfdsIOMdule, 1, uGpi0); //write gpio (Discrete LEDs)
    }

    cleanup_platform();

    return 0;
}

void delay_us(u32 time)
{
    XIOModule_SetResetValue(&DelayTimer, 0, time);
    XIOModule_Timer_Start(&DelayTimer, 0);
    while(!(XIOModule_IsExpired(&DelayTimer, 0))){}
    XIOModule_Timer_Stop(&DelayTimer, 0);
}


В моем понимании обращение delay_us(1) должно давать задержку в 1 такт или я не прав?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.02305 секунд с 7
ELECTRONIX ©2004-2016