1i7 (1i7) wrote,
1i7
1i7

Лабораторная работа 6: знакомство с промышленной реализацией архитектуры MIPS на примере pic32 (5)

Продолжение, начало Лабораторная работа 6: знакомство с промышленной реализацией архитектуры MIPS на примере pic32 (4) <<

Задание 3 - мигаем лампочкой программой на Си

И наконец входим в зону комфорта - к привычным и понятным языкам высокого уровня - помигаем лампочкой на Си. Ножка все та же RD10 (chipKIT #8).

task3-blink-c/blink.c

#include <p32xxxx.h>
/**
* Помигать лампочкой на ножке pic32 RD10 (chipKIT #8).
*/

/**
* Настраиваем пины ввода-вывода и таймер.
*/
void setup() {
    // режим вывода для ножки RD10 - установить бит PORTD[10] в 0
    TRISDCLR = 1 << 10;

    // включить таймер (записать специальное значение 0x8030 в регистр T1CON) 
    T1CON = 0x8030;
}

/**
* Запуск бесконечного цикла с миганием.
*/
void blink() {
    while(1) {
        // установить значение - включить лампочку
        PORTDSET = 1 << 10;

        // сбросить счетчик таймера
        TMR1 = 0;
        // подождать
        while(TMR1 < 0xffff) {
        }

        // очистить значение - выключить лампочку
        PORTDCLR = 1 << 10;

        // сбросить счетчик таймера
        TMR1 = 0;
        // подождать
        while(TMR1 < 0xffff) {
        }
    }
}

void main() {
    setup();

    blink();
}




Подключаем заголовочный файл с константами для pic32, чтобы не прописывать адреса всяких регистров в коде вручную.
#include <p32xxxx.h>

Точка входа в программу.

void main() {
    setup();

    blink();
}


Инициализация. Уже привычным способом настраиваем RD10 на режим вывода, также включаем таймер, который понадобится нам, чтобы отсчитывать задержки между морганиями.

/**
* Настраиваем пины ввода-вывода и таймер.
*/
void setup() {
    // режим вывода для ножки RD10 - установить бит PORTD[10] в 0
    TRISDCLR = 1 << 10;

    // включить таймер (записать специальное значение 0x8030 в регистр T1CON)
    T1CON = 0x8030;
}


Собственно процесс мигания - включаем и выключаем лампочку с небольшими промежутками в бесконечном цикле.

/**
 * Запуск бесконечного цикла с миганием.
 */
void blink() {
    while(1) {
        // установить значение - включить лампочку
        PORTDSET = 1 << 10;

        // сбросить счетчик таймера
        TMR1 = 0;
        // подождать
        while(TMR1 < 0xffff) {
        }

        // очистить значение - выключить лампочку
        PORTDCLR = 1 << 10;

        // сбросить счетчик таймера
        TMR1 = 0;
        // подождать
        while(TMR1 < 0xffff) {
        }
    }
}


(задание: сделать код еще компактнее при помощи использования региста PORTDINV).

Компилируем, загружаем:
> make; make upload

Проверяем. На фото - лампочка горит, но скоро потухнет, а потом опять загорится:


Подтверждает видео:

Работа с регистрами SFR pic32 на Си: вывод значения на ножку from 1i7 on Vimeo.



Задание 4: считать значение с ножки программой на Си

И наконец считаем значение с ножки программой на Си. Входной провод (кнопка как вариант) подключен к ножке RF1 (chipKIT #4), в зависимости от подаваемого значения включаем или выключаем лампочку RD10.

task4-input-c/input.c

#include <p32xxxx.h>
/**
* Зажечь лампочку RD10 (chipKIT #8) по нажатию кнопки RF1 (chipKIT #4).
*/

/**
* Настраиваем пины ввода-вывода.
*/
void setup() {
    // режим вывода для ножки RD10 (установить бит PORTD[10] в 0)
    TRISDCLR = 1 << 10;

    // режим ввода для ножки RF1 (устновить бит PORTF[1] в 1)
    TRISFSET = 1 << 1;
}

/**
* Прочитать текущее значение кнопки: 1 - вкл, 0 - выкл.
*/
int readButton() {
    if(PORTF & 1 << 1)
        return 1;
    else
        return 0;
}

/**
* Будем читать кнопку в бесконечном цикле и в зависимости от значения переключать лампочку.
*/
void on_off() {
    while(1) {
        if(readButton()) {
            // установить значение - включить лампочку
            PORTDSET = 1 << 10;
        } else {
            // очистить значение - выключить лампочку
            PORTDCLR = 1 << 10;
        }
    }
}

void main() {
    setup();

    on_off();
}


Вход в программу.

void main() {
    setup();

    on_off();
}


Первоначальные настройки - RD10 на вывод, RF1 на ввод.

/**
* Настраиваем пины ввода-вывода.
*/
void setup() {
    // режим вывода для ножки RD10 (установить бит PORTD[10] в 0)
    TRISDCLR = 1 << 10;

    // режим ввода для ножки RF1 (устновить бит PORTF[1] в 1)
    TRISFSET = 1 << 1;
}


Читаем значение с ножки - проверяем значение 1го бита (нумерация с нуля) регистра PORTF при помощи оператора & (побитовое "и") и возвращаем 1 или 0 по результату.

/**
* Прочитать текущее значение кнопки: 1 - вкл, 0 - выкл.
*/
int readButton() {
    if(PORTF & 1 << 1)
        return 1;
    else
        return 0;
}


Ну и сама процедура - проверяем ввод на RF1 и устанавливаем вывод RD10 в бесконечном цикле.

/**
* Будем читать кнопку в бесконечном цикле и в зависимости от значения переключать лампочку.
*/
void on_off() {
    while(1) {
        if(readButton()) {
            // установить значение - включить лампочку
            PORTDSET = 1 << 10;
        } else {
            // очистить значение - выключить лампочку
            PORTDCLR = 1 << 10;
        }
    }
}


Компилируем, загружаем:
> make; make upload

Проверяем. Подключаем провод RF1 (chipKIT #4) к "+" - лампочка RD10 (chipKIT #8) горит:


Подключаем провод RF1 (chipKIT #4) к "-" (GND - земля) - лампочка RD10 (chipKIT #8) не горит:


Тоже на видео:

Работа с регистрами SFR pic32 на Си: ввод значения с ножки from 1i7 on Vimeo.




На этом курс по пересечению пропасти от физики к программированию завершается. Мы начали с мигающих лампочек на макетной плате и завершили программой на Си, запущенной на промышленном микроконтроллере, при этом пройдя значительную часть промежуточных шагов, каждый из которых открывал доступ к последующему сохраняя логику повествования с самого начала. Далее можно углубляться в практические применения в любой точке этого пути уже исходя из личных желаний и потребностей, но при наличии в голове общей картины мира это будет сделать надеюсь проще.

Код лабы на github, подсветка синтаксиса.
Tags: chipkit, mips, pic32, лаба 6, цифровая электроника для программистов
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment