Пт июн 30, 2017 15:55:02
#include <avr/io.h> //Подключаем библиотеку AVR
#include <avr/iotn2313.h> //Подключаем библиотеку ATtiny2313
#include <avr/interrupt.h> //Подключаем библиотеку прерываний
#define F_CPU 1000000UL
#include <util/delay.h>
//Глобальные переменные сюда:
volatile unsigned char reg=0; //Переменная reg - режим
//Обработка прерывания по спаду напряжения на INT0
ISR(INT0_vect)
{
_delay_ms(10);
reg++; //при нажатии на кнопку Увеличиваем значение переменной reg на 1
if (reg==4) reg=0; //Если досчитали до 4, то reg=0
}
void INTinit()
{
GIMSK=(1<<6); //Разрешаем прерывание INT0
MCUCR=(1<<0)|(1<<1); //Прерывыание по ниспадающему форонту (с 1 на 0); ISC01=1, ISC00=1
}
int main (void)
{
DDRB=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7); //Порт В на ВЫХод
PORTD=(1<<2); //Порт PD2 Подтягивающий резистор ВКлючен
INTinit(); // вызываем функцию инициализации прерываний
sei(); //Глобальное разрешение прерываний
while (1)
{
switch(reg)
{
case 1:
PORTB=(1<<0);
break;
case 2:
PORTB=(1<<1);
break;
case 3:
PORTB=(1<<2);
break;
default:
PORTB=0;
}
};
}
#include <avr/io.h> //Подключаем библиотеку AVR
#include <avr/iotn2313.h> //Подключаем библиотеку ATtiny2313
#include <avr/interrupt.h> //Подключаем библиотеку прерываний
#define F_CPU 1000000UL
#include <util/delay.h>
//Глобальные переменные сюда:
volatile unsigned char reg=0; //Переменная reg - режим
//Обработка прерывания по спаду напряжения на INT0
ISR(INT0_vect)
{
_delay_ms(10);
reg++; //при нажатии на кнопку Увеличиваем значение переменной reg на 1
if (reg==4) reg=0; //Если досчитали до 4, то reg=0
}
int main (void)
{
DDRB=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7); //Порт В на ВЫХод
PORTD=(1<<2); //Порт PD2 Подтягивающий резистор ВКлючен
GIMSK=(1<<6); //Разрешаем прерывание INT0
MCUCR=(1<<0)|(1<<1); //Прерывыание по ниспадающему форонту (с 1 на 0); ISC01=1, ISC00=1
sei(); //Глобальное разрешение прерываний
while (1)
{
switch(reg)
{
case 1:
PORTB=(1<<0);
break;
case 2:
PORTB=(1<<1);
break;
case 3:
PORTB=(1<<2);
break;
default:
PORTB=0;
}
};
}
Пн июл 03, 2017 22:43:35
ПЕРВЫЙ ВАРИАНТ
void INTinit()
{
GIMSK=(1<<6); //Разрешаем прерывание INT0
MCUCR=(1<<0)|(1<<1); //Прерывыание по ниспадающему форонту (с 1 на 0); ISC01=1, ISC00=1
}
int main (void)
{
INTinit(); // вызываем функцию инициализации прерываний
sei(); //Глобальное разрешение прерываний
while (1)
{
}
}
ВТОРОЙ ВАРИАНТ
int main (void)
{
GIMSK=(1<<6); //Разрешаем прерывание INT0
MCUCR=(1<<0)|(1<<1); //Прерывыание по ниспадающему форонту (с 1 на 0); ISC01=1, ISC00=1
sei(); //Глобальное разрешение прерываний
while (1)
{
}
}
Пн июл 03, 2017 23:22:37
Вот так писать не надо. Специально для наглядности кода существуют константы:MCUCR=(1<<0)|(1<<1); //Прерывыание по ниспадающему форонту (с 1 на 0); ISC01=1, ISC00=1
Вроде как это делается для большей структуризации кода и некоторого увеличения его безопасности. В контроллерах, где идет прямое обращение к регистрам, это лишнее.Видел так делают, когда принимают или отправляют значение, так называемые геттеры и сеттеры, но это не тот случай.
Вт июл 04, 2017 16:17:09
Вт июл 04, 2017 18:38:16
uint32_t - unsigned integer 32-битный.Для чего применяется запись uint32_t?
Ср июл 05, 2017 09:49:30
Ср июл 05, 2017 10:27:48
Ср июл 05, 2017 11:12:06
Ср июл 12, 2017 10:00:34
Ср июл 12, 2017 10:16:21
Ср июл 12, 2017 10:26:17
Ср июл 12, 2017 11:38:13
TIFR = 0;
OCR1A = 0xEFFF; //Значение перегрузки таймера (30гц)
Пт июл 14, 2017 09:19:32
// UART.c
#include "usart.h"
//передающий буфер
unsigned char usartTxBuf[SIZE_BUF];
unsigned char txBufTail = 0;
unsigned char txBufHead = 0;
unsigned char txCount = 0;
void uart_init( void ) //функция инициализации UART
{
//настройка скорости обмена
UBRR0H = 0;
UBRR0L = 15; // скорость 57600 для 14 745 600
//разрешить прием и передачу данных
UCSR0B = (1<<TXCIE0)|(1<<TXEN0); //включаем прерывание по передаче и саму передачу
//8 бит данных, 1 стоп бит, без контроля четности
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
}
//передача
//возвращает колличество символов передающего буфера
unsigned char USART_GetTxCount(void)
{
return txCount;
}
//"очищает" передающий буфер
void USART_FlushTxBuf(void)
{
txBufTail = 0;
txCount = 0;
txBufHead = 0;
}
//помещает символ в буфер, инициирует начало передачи
void USART_PutChar(unsigned char sym)
{
//если модуль usart свободен и это первый символ
//пишем его прямо в регистр UDR
if(((UCSR0A & (1<<UDRE0)) != 0) && (!txCount))
{
UDR0 = sym;
}
else
{
if (txCount < SIZE_BUF) //если в буфере еще есть место
{
usartTxBuf[txBufTail] = sym; //помещаем в него символ
txCount++; //инкрементируем счетчик символов
txBufTail++; //и индекс хвоста буфера
if (txBufTail == SIZE_BUF)
{
txBufTail = 0;
}
}
}
}
//функция отправки строки
void USART_SendStr(char * data)
{
unsigned char sym;
while(*data){
sym = *data++;
USART_PutChar(sym);
}
}
//обработчик прерывания по завершению передачи
ISR(USART_TX_vect)
{
if (txCount > 0) //если буфер не пустой
{
UDR0 = usartTxBuf[txBufHead]; //записываем в UDR символ из буфера
txCount--; //уменьшаем счетчик символов
txBufHead++; //инкрементируем индекс головы буфера
if (txBufHead == SIZE_BUF)
{
USART_FlushTxBuf();
}
}
}
// USART.H
#ifndef USART_H
#define USART_H
#include <avr/io.h>
#include <avr/interrupt.h>
//размер буфера
#define SIZE_BUF 65
void uart_init( void );
unsigned char USART_GetTxCount(void); //взять число символов передающего буфера
void USART_FlushTxBuf(void); //очистить передающий буфер
void USART_PutChar(unsigned char sym); //положить символ в буфер
void USART_SendStr(char * data); //послать строку по usart`у
#endif //USART_H
Пт июл 14, 2017 12:58:17
Пт июл 14, 2017 22:13:55
Сб июл 15, 2017 11:42:19
Сб июл 15, 2017 13:33:07
Сб июл 15, 2017 14:38:30
Сб июл 15, 2017 17:12:32
Ср авг 02, 2017 19:45:45