September 29th, 2013

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

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

Примеры

Задание 1 - зажечь лампочку ассемблером MIPS
Например мы хотим зажечь светодиодную лампочку, подключенную к нашей знакомой ножке pic32 #44 (chipKIT #8), которая одновременно с этим является 10й ножкой внутри порта PORTD, т. е. к ножке RD10.

Программа на ассемблере MIPS32 выглядит следующим образом:

task1-light-asm/light.S

# Зажечь лампочку на ножке RD10 (chipKIT #8) ассемблером
main: .global main # Помечаем метку main как глобальную

    # Установить ножку RD10 как вывод - установить бит TRISD[10] в 1 - отправить 0x400 в TRISDCLR
    li $t1, 1 << 10
    la $t2, 0xBF8860C4 #TRISDCLR
    sw $t1, 0 ($t2)
    
    # Установить значение 1 на ножке RD10 - установить бит LATD[10] в 1 - отправить 0x400 в LATDSET
    li $t1, 1 << 10
    la $t2, 0xBF8860E8 #LATDSET
    #la $t2, 0xBF8860E4 #LATDCLR
    sw $t1, 0 ($t2)


Collapse )

Еще пара аналогичных примеров на Си и для лабы достаточно.

Код лабы на github, подсветка синтаксиса.

Лабораторная работа 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();
}



Collapse )

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

Код лабы на github, подсветка синтаксиса.