Тут делаю небольшое устройство (пишу на сишке) на базе пичка (PIC18F1230). Его задачи:
Спойлер
1. По нажатию кнопки пуск - работать, по нажатию кнопки стоп - не работать.2. Формировать импульсы постоянной длительности со случайными задержками (импульс - 30 мкс, задержка от 100 мкс до 400 мс).
3. Работает - горит зеленый светодиот, не работает - красный.
В ходе работы возникли следующие вопросы:
1. Как выбрать правильно МК под мою задачу?
Спойлер
Как минимум, я могу предположить, что МК должен нормально работать с импульсами, имеющими длительность 30 мкс. Но сейчас, как мне кажется, любой, даже самый дешевый МК может это.Вот я выбрал PIC18F1230, но что-то мне кажется, что это не совсем рационально, т.к. я использую функции в работе только те, которые есть в каждом пичке.
3. Как сделать задержку на определенное время?
Спойлер
Читал, что можно сделать задержку через циклы, но я не совсем понимаю, как приблизительно хотя бы прикинуть, сколько времени занимает выполнение одной пустой итерации цикла.Где-то читал, что цикл for выполняется за 3 такта, а частота моего внутреннего генератора вроде бы 4 МГц (Oscillator frequency), так вот, получается, что 1 итерация цикла задерживает работу на:
t = 3/F = 3/(4*10^6) = 0,75 мкс. Я взял для уверенности 1 мкс. В итоге я потерпел фиаско, скажем, раз в 15 примерно. Прикладываю картинку выходного сигнала. Сигнал должен был длиться 15 мкс...

5. Является ли признаком быдло-кода использование оператора goto программировании МК на C?
6. Как правильно настроить биты конфигурации в МК (использую MPLAB X 4.05)? А то я фигню какую-то понастраивал.
7. Какой компилятор оптимальнее всего использовать для решения таких задач? И какие у него должны быть настройки?
Прикладываю все важные файлы (проект в протосе, мплабе, изображение пичка)
Картинка пичка:
Спойлер

Спойлер
Код: Выделить всё
/*#include <pic.h> // Библитека пичков
#include <stdio.h>*/
#include <stdlib.h>
//#include <pic18f1230.h> // Библиотека конкретного пичка
#include <xc.h>
// PIC18F1230 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1H
#pragma config OSC = RCIO // Oscillator (External RC oscillator, port function on RA6)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = BOHW // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3 // Brown-out Reset Voltage bits (Minimum setting)
// CONFIG2H
#pragma config WDT = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3L
#pragma config PWMPIN = OFF // PWM Output Pins Reset State Control bit (PWM outputs disabled upon Reset)
#pragma config LPOL = HIGH // Low-Side Transistors Polarity bit (Even PWM Output Polarity Control bit) (PWM0, PWM2 and PWM4 are active-high (default))
#pragma config HPOL = HIGH // High Side Transistors Polarity bit (Odd PWM Output Polarity Control bit) (PWM1, PWM3 and PWM5 are active-high (default))
// CONFIG3H
#pragma config FLTAMX = RA5 // FLTA Mux bit (FLTA input is muxed onto RA5)
#pragma config T1OSCMX = LOW // T1OSO/T1CKI MUX bit (T1OSO/T1CKI pin resides on RB2)
#pragma config MCLRE = ON // Master Clear Enable bit (MCLR pin enabled, RA5 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Reset on stack overflow/underflow enabled)
#pragma config BBSIZ = BB256 // Boot Block Size Select bits (256 Words (512 Bytes) Boot Block size)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled)
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit Block 0 (000400-0007FF) (Block 0 is not code-protected)
#pragma config CP1 = OFF // Code Protection bit Block 1 (000800-000FFF) (Block 1 is not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Code Protection bit (Boot Block Memory Area) (Boot Block is not code-protected)
#pragma config CPD = OFF // Code Protection bit (Data EEPROM) (Data EEPROM is not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit Block 0 (000400-0007FF) (Block 0 is not write-protected)
#pragma config WRT1 = OFF // Write Protection bit Block 1 (000800-000FFF) (Block 1 is not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Write Protection bit (Configuration Registers) (Configuration registers are not write-protected)
#pragma config WRTB = OFF // Write Protection bit (Boot Block Memory Area) (Boot Block is not write-protected)
#pragma config WRTD = OFF // Write Protection bit (Data EEPROM) (Data EEPROM is not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit Block 0 (000400-0007FF) (Block 0 is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit Block 1 (000800-000FFF) (Block 1 is not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Table Read Protection bit (Boot Block Memory Area) (Boot Block is not protected from table reads executed in other blocks)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#define SIGNAL 30 // Длительность сигнала в мкс
#define DELMIN 100 // Минимальное время задержки в мкс
#define DELMAX 400000 // Максимальное время задержки в мкс
void delay(int type); // Функция задержки
void Prepare(void); // Функция подготовки МК
int main()
{
Prepare(); // Запуск подготовки МК
while(1) // Бесконечный цикл, основная задача МК
{
delay(0); // Задержка межуд сигналами
TRISB = 0b00010000; // Подаем на выход лог. единицу
delay(1); // Длительность сигнала
TRISB = 0b00000000; // Выставляем лог. ноль
}
return 0;
}
void delay(int type) // Функция задержки
{
int N; // Локальная переменная для промежуточных присвоений
if(type == 0)
{
N = DELMIN + rand() % DELMAX; // Формируем случайную задержку
}
else
{
N = SIGNAL; // Определяем длительность сигнала
}
for(int i = 0; i <= N; i++) {} // Держим заданный лог. уровень
}
// Подготовка МК
void Prepare(void)
{
TRISA = 0b00000000; // Направление работы ножек порта А
TRISB = 0b00010000; // Направление работы ножек порта В
CMCON = 0x07; // Отключение компараторов
PORTA = 0; // Очищаем порт А
PORTB = 0; // Очищаем порт Б
RBPU = 0; // Подтягивающие R (0-вкл, 1-выкл)
}




