Aula de programação C – 12

12. PRÁTICA 12: IMPLEMENTAÇÃO SUBROTINAS PARA CONTROLE DO MOTOR

Referencial Teórico: Operadores de atribuição; Laço While; Funções/Subrotinas.

Objetivo: Controlar o estado de funcionamento e rotação de um motor, por meio da subrotinas de programação.

Materiais: Utilizar botão presente na placa, potenciômetro ligado à entrada 1, motor de corrente contínua ligado à saída A e fonte de alimentação.

12.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	MOTOR_AB_EN = 1;

	configura_conversor();

	while(1){
		ler_sensor();
		if (sensor >= 500) para_ca_motor();
		if (sensor <= 500) para_la_motor();
		if (botao == 1) ligar_motor();
		if (botao == 0) desligar_motor();
	}
}

12.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void configura_conversor(){
	OpenADC(ADC_FOSC_8
	&ADC_RIGHT_JUST
	&ADC_4_TAD,
	ADC_CH0
	&ADC_INT_OFF
	&ADC_VREFPLUS_VDD
	&ADC_VREFMINUS_VSS,
	ADC_1ANA);
}

unsigned long sensor;

void ler_sensor(){
	SetChanADC(ADC_CH0);
	ConvertADC();
	while(BusyADC());
	sensor = ReadADC();
}

void ligar_motor();
void para_ca_motor();
void para_la_motor();
void ligar_por_motor();
void desligar_motor();
void freiar_motor();
void invereter_motor();

void ligar_motor(){
	MTR1_EN = 1;
}

void para_ca_motor(){
	MTR1_CW = 1;
	MTR1_CC = 0;
}

void para_la_motor(){
	MTR1_CW = 0;
	MTR1_CC = 1;
}

void ligar_por_motor(){
	MTR1_EN = 1;
	espere_por(10);
	MTR1_EN = 0;
}

void desligar_motor(){
	MTR1_EN = 0;
}

void freiar_motor(){
	MTR1_CW = 1;
	MTR1_CC = 1;
	espere_por(10);
	MTR1_CW = 0;
	MTR1_CC = 0;
	espere_por(10);
}

void invereter_motor(){
	MTR1_CW = ~MTR1_CW;
	MTR1_CC = ~MTR1_CC;
}

Aula de programação C – 11

11. PRÁTICA 11: USO DE MEMÓRIA EEPROM COM BOTÃO E CONTROLE DO LED

Referencial Teórico: Operadores de atribuição; Funções; Memórias do Microcontrolador.

Objetivo: Controlar o estado de funcionamento de um led presente na placa, por meio da gravação e leitura de dados em memória não volátil.

Materiais: Utilizar led e botão presentes na placa e memória EEPROM interna.

11.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	while(1){
		if (botao == 1){
			escrever_memoria(0x0A,'H');
		}
		if (botao == 0){
			escrever_memoria(0x0A,'L');
		}
		ler_memoria(0x0A);
		if (dado == 'H') led = 1;
		if (dado == 'L') led = 0;
	}
}

11.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

unsigned char escrever_memoria(unsigned char endereco, unsigned char dado){
	EEADR = endereco;
	EEDATA = dado;
	EECON1bits.EEPGD = 0;
	EECON1bits.CFGS = 0;
	EECON1bits.WREN = 1;
	INTCONbits.GIE = 0;
	EECON2 = 0x55;
	EECON2 = 0xAA;
	EECON1bits.WR = 1;
	while(EECON1bits.WR);
	INTCONbits.GIE = 1;
	EECON1bits.WREN = 0;
}

unsigned char dado;

unsigned char ler_memoria(unsigned char endereco){
	EEADR = endereco;
	EECON1bits.EEPGD = 0;
	EECON1bits.CFGS = 0;
	EECON1bits.RD = 1;
	dado = EEDATA;
	return dado;
}

Aula de programação C – 10

10. PRÁTICA 10: CONTROLE DO MOTOR E LED COM TIMERS

Referencial Teórico: Operadores de atribuição; Laço While; Funções de atraso; Funções.

Objetivo: Controlar o estado de funcionamento de um motor e led presente na placa, por meio da interrupção por tempo.

Materiais: Utilizar led presente na placa, motor de corrente contínua ligado à saída A e fonte de alimentação.

10.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	configura_relogio();

	habilita_ponteh();

	MTR1_CW = 1;
	MTR1_CC = 0;

	while(1){

	}
}

10.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

// acrescentar ao iniciog // pratica 10

void configura_relogio(){
	INTCON = 0b10100000;
	T0CON = 0x80; // 20ms
  	TMR0H = 0x15; // 20ms
  	TMR0L = 0xA0; // 20ms
}

void zera_relogio(){
	INTCONbits.TMR0IF = 0;
 	TMR0H = 0x15; // 20ms
	TMR0L = 0xA0; // 20ms
}

#pragma code int_hr = 0x1848
#pragma interrupt trata_interrupcao

void trata_interrupcao(){
	MTR1_EN = ~MTR1_EN;
	led = ~led;
	zera_relogio();
}

Aula de programação C – 09

9. PRÁTICA 09: CONTROLE DE MOTOR COM POTENCIÔMETRO E BOTÃO (SELO)

Referencial Teórico: Operadores de atribuição; Laço While; Funções de atraso; Funções.

Objetivo: Controlar o estado de funcionamento e a rotação de um motor por meio de um botão e um potenciômetro.

Materiais: Utilizar botão presente na placa, potenciômetro ligado à entrada 1, motor de corrente contínua ligado à saída A e fonte de alimentação.

9.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	habilita_ponteh();

	configura_conversor();

	while(1){
		ler_sensor();

		MTR1_CW = 1;
		MTR1_CC = 0;
		espere_por(sensor);

		MTR1_CW = 0;
		MTR1_CC = 0;
		espere_por(sensor);

		if (botao == 1) MTR1_EN = ~MTR1_EN;
	}
}

9.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void configura_conversor(){
	OpenADC(ADC_FOSC_8
	&ADC_RIGHT_JUST
	&ADC_4_TAD,
	ADC_CH0
	&ADC_INT_OFF
	&ADC_VREFPLUS_VDD
	&ADC_VREFMINUS_VSS,
	ADC_1ANA);
}

unsigned long sensor;

void ler_sensor(){
	SetChanADC(ADC_CH0);
	ConvertADC();
	while(BusyADC());
	sensor = ReadADC();
}

Aula de programação C – 08

8. PRÁTICA 08: CONTROLE DE MOTOR COM POTENCIÔMETRO E BOTÃO

Referencial Teórico: Operadores de atribuição; Laço While; Funções de atraso; Funções.

Objetivo: Controlar o estado de funcionamento e a rotação de um motor por meio de um botão e um potenciômetro.

Materiais: Utilizar botão presente na placa, potenciômetro ligado à entrada 1, motor de corrente contínua ligado à saída A e fonte de alimentação.

8.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	habilita_ponteh();

	configura_conversor();

	while(1){
		ler_sensor();

		MTR1_CW = 1;
		MTR1_CC = 0;
		espere_por(sensor);

		MTR1_CW = 0;
		MTR1_CC = 0;
		espere_por(sensor);

		if (botao == 1) MTR1_EN = 1;
		if (botao == 0) MTR1_EN = 0;
	}
}

8.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void configura_conversor(){
	OpenADC(ADC_FOSC_8
	&ADC_RIGHT_JUST
	&ADC_4_TAD,
	ADC_CH0
	&ADC_INT_OFF
	&ADC_VREFPLUS_VDD
	&ADC_VREFMINUS_VSS,
	ADC_1ANA);
}

unsigned long sensor;

void ler_sensor(){
	SetChanADC(ADC_CH0);
	ConvertADC();
	while(BusyADC());
	sensor = ReadADC();
}

Aula de programação C – 07

7. PRÁTICA 07: CONTROLE DE VELOCIDADE MOTOR COM POTENCIÔMETRO

Referencial Teórico: Portas I/O; Registradores TRIS; Registradores PORT.

Objetivo: Controlar a rotação de um motor por meio de um potenciômetro e da conversão de sinal analógico para digital.

Materiais: Utilizar potenciômetro ligado à entrada 1, motor de corrente contínua ligado à saída A e fonte de alimentação.

7.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	habilita_ponteh();

	configura_conversor();

	while(1){
		ler_sensor();

		MTR1_CW = 1;
		MTR1_CC = 0;
		espere_por(sensor);

		MTR1_CW = 0;
		MTR1_CC = 0;
		espere_por(sensor);
	}
}

7.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void configura_conversor(){
	OpenADC(ADC_FOSC_8
	&ADC_RIGHT_JUST
	&ADC_4_TAD,
	ADC_CH0
	&ADC_INT_OFF
	&ADC_VREFPLUS_VDD
	&ADC_VREFMINUS_VSS,
	ADC_1ANA);
}

unsigned long sensor;

void ler_sensor(){
	SetChanADC(ADC_CH0);
	ConvertADC();
	while(BusyADC());
	sensor = ReadADC();
}

Aula de programação C – 06

6. PRÁTICA 06: ACIONAMENTO DO MOTOR COM POTENCIÔMETRO

Referencial Teórico: Arquitetura do Microcontrolador; Registradores de Função Especiais – SRF.

Objetivo: Controlar o estado de funcionamento do motor por meio de um potenciômetro e da  conversão de sinal analógico para digital.

Materiais: Utilizar potenciômetro ligado à entrada 1, motor de corrente contínua ligado à saída A e fonte de alimentação.

6.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	habilita_ponteh();

	configura_conversor();

	while(1){
		ler_sensor();

		if (sensor >= 500) {
			MTR1_CW = 1;
			MTR1_CC = 0;
		}
		if (sensor <= 500) {
			MTR1_CW = 0;
			MTR1_CC = 0;
		}
	}
}

6.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void configura_conversor(){
	OpenADC(ADC_FOSC_8
	&ADC_RIGHT_JUST
	&ADC_4_TAD,
	ADC_CH0
	&ADC_INT_OFF
	&ADC_VREFPLUS_VDD
	&ADC_VREFMINUS_VSS,
	ADC_1ANA);
}

unsigned long sensor;

void ler_sensor(){
	SetChanADC(ADC_CH0);
	ConvertADC();
	while(BusyADC());
	sensor = ReadADC();
}

Aula de programação C – 05

5. PRÁTICA 05: ACIONAMENTO DO MOTOR COM BOTÃO

Referencial Teórico: Pinagem do Microcontrolador; Ciclo de Máquina; Oscilador.

Objetivo: Controlar o estado de funcionamento de um motor por meio do pressionamento de um botão.

Materiais: Utilizar botão presente na placa, motor de corrente contínua ligado à saída A e fonte de alimentação.

5.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	habilita_ponteh();

	while(1){
		if (botao == 1) {
			MTR1_CW = 1;
			MTR1_CC = 0;
		}
		if (botao == 0) {
			MTR1_CW = 0;
			MTR1_CC = 0;
		}
	}
}

5.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

Aula de programação C – 04

4. PRÁTICA 04: ACIONAMENTO DO MOTOR POR TEMPORIZAÇÃO

Referencial Teórico: Estudo das Interrupções; Interrupção por tempo; Timer 0.

Objetivo: Controlar o estado de funcionamento de um motor por meio das funções de atraso.

Materiais: Utilizar motor de corrente contínua ligado à saída A e fonte de alimentação.

4.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	habilita_ponteh();

	while(1){
		MTR1_CW = 1;
		MTR1_CC = 0;
		espere_por(250); // 100ms
		MTR1_CW = 0;
		MTR1_CC = 0;
		espere_por(250); // 100ms
	}
}

4.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void configura_relogio(){
	INTCON = 0b10100000;
	T0CON = 0x80; // 20ms
  	TMR0H = 0x15; // 20ms
  	TMR0L = 0xA0; // 20ms
}

void zera_relogio(){
	INTCONbits.TMR0IF = 0;
 	TMR0H = 0x15; // 20ms
	TMR0L = 0xA0; // 20ms
}

#pragma code int_hr = 0x1848
#pragma interrupt trata_interrupcao

void trata_interrupcao(){
	MTR1_EN = ~MTR1_EN;
	led = ~led;
	zera_relogio();
}

Aula de programação C – 03

3. PRÁTICA 03: LEITURA ANALÓGICA DO SENSOR E ACIONAMENTO DO LED

Referencial Teórico: Conversão Analógica/Digital Interna; identificadores; Tipos de Dados.

Objetivo: Controlar o estado de funcionamento de um led, realizando a conversão de um sinal analógico para digital proveniente de um sensor.

Materiais: Utilizar led presente na placa e potenciômetro ligado à entrada 1.

3.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();

	configura_conversor();

	while(1){
		ler_sensor();

		if (sensor >= 500) led = 1;
		if (sensor <= 500) led = 0;
	}
}

3.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void configura_conversor(){
	OpenADC(ADC_FOSC_8
	&ADC_RIGHT_JUST
	&ADC_4_TAD,
	ADC_CH0
	&ADC_INT_OFF
	&ADC_VREFPLUS_VDD
	&ADC_VREFMINUS_VSS,
	ADC_1ANA);
}

unsigned long sensor;

void ler_sensor(){
	SetChanADC(ADC_CH0);
	ConvertADC();
	while(BusyADC());
	sensor = ReadADC();
}