Чт дек 26, 2019 23:05:37
Пт дек 27, 2019 07:57:42
Пт дек 27, 2019 10:58:09
Сб дек 28, 2019 21:49:10
#include <avr/io.h>
#include <avr/interrupt.h>
#include "shiftreg.h"
/* macro definition which returns the number of elements in an arraay */
//#define GetArrayElements(x) sizeof(x)/sizeof(x[0])
/* 7 Segment Codes */
#define ZERO 0x3F
#define ONE 0x06
#define TWO 0x5B
#define THREE 0x4F
#define FOUR 0x66
#define FIVE 0x6D
#define SIX 0x7D
#define SEVEN 0x07
#define EIGHT 0x7F
#define NINE 0x6F
int main(void)
{
//unsigned short counter = 0;
//unsigned char temp;
//unsigned char digits[] = {ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE};
//unsigned char display[4];
SHIFTREG_register reg;
reg = SHIFTREG_InitRegister(&DDRB, &PORTB, PB0, PB1, PB2);
sei();
while (1) { }
}
/******************************************************************************
* File Name : shiftreg.h
* Author : D.Gotic
* Version : V0.1
* Date : 03/12/2010
* Description : This file contains all the functions prototypes
* and structure definitions for the 74HC595 shit register driver
******************************************************************************/
/* Define to prevent recursive inclusion ----------*/
#ifndef SHIFTREG_H
#define SHIFTREG_H
/* Includes ----------*/
#include <inttypes.h>
/* a structure which defines the interface from the uC to the SHIFT REGISTER */
typedef struct _SHIFTREG_register
{
volatile uint8_t *DDR_addr; /* address of the uC Data Direction Register */
volatile uint8_t *PORT_addr; /* address of the uC PORT Register */
uint8_t DS_pin; /* Pin number to which the DS pin is connected */
uint8_t ST_CP_pin; /* Pin number to which the ST_CP pin is connected */
uint8_t SH_CP_pin; /* Pin number to which the SH_CP pin is connected */
} SHIFTREG_register;
/* Function prototypes ----------*/
SHIFTREG_register SHIFTREG_InitRegister(
volatile uint8_t *ddr_addr,
volatile uint8_t *port_addr,
uint8_t ds_pin,
uint8_t st_cp_pin,
uint8_t sh_cp_pin
);
void SHIFTREG_OutputValue(
SHIFTREG_register *reg,
unsigned char *bytes,
unsigned char nbytes
);
#endif /* SHIFTREG_H */
/************************** END OF FILE **************************/
/****************************************************************************
* File Name : shiftreg.c
* Author : D.Gotic
* Version : V0.1
* Date : 03/12/2010
* Description : This file contains all the functions definitions
* for the 74HC595 shit register driver
*****************************************************************************/
/* Includes ----------*/
#include "shiftreg.h"
#include "macros.h"
#define BIT_MASK 0x80
/* Private macros-----------------------------------------------------------*/
/* Private functions ----------*/
#define shift_in_pulse(port,reg_pin) sbi(port,reg_pin); cbi(port,reg_pin)
#define parallel_out_pulse(port,reg_pin) sbi(port,reg_pin); cbi(port,reg_pin)
//
// Function Name : SHIFTREG_InitRegister
// Description : Initializes the interface from the uC to the shift register
// Input : DDR adress and PORT adress of the interface and pin numbers
// of the uC interface
// Return : initialized register structure
//
SHIFTREG_register SHIFTREG_InitRegister(
volatile uint8_t *ddr_addr,
volatile uint8_t *port_addr,
uint8_t ds_pin,
uint8_t st_cp_pin,
uint8_t sh_cp_pin)
{
SHIFTREG_register tmp_reg;
tmp_reg.DDR_addr = ddr_addr;
tmp_reg.PORT_addr = port_addr;
tmp_reg.DS_pin = ds_pin;
tmp_reg.ST_CP_pin = st_cp_pin;
tmp_reg.SH_CP_pin = sh_cp_pin;
sbi(*(tmp_reg.DDR_addr),tmp_reg.DS_pin);
sbi(*(tmp_reg.DDR_addr),tmp_reg.ST_CP_pin);
sbi(*(tmp_reg.DDR_addr),tmp_reg.SH_CP_pin);
return tmp_reg;
}
/****************************************************
* Function Name : SHIFTREG_OutputValue
* Description : Transmits nbytes bytes to nbytes shift registers and outputs
* : the values
* Input : shift register structure, bytes to transmit, number of bytes
* : to transmit
* Return : None
******************************************************/
void SHIFTREG_OutputValue(
SHIFTREG_register *reg,
unsigned char *bytes,
unsigned char nbytes )
{
unsigned char mask, i, j;
for (i=0; i<nbytes; i++)
{
mask = BIT_MASK;
for (j = 0; j< 8; j++)
{
/* mask bit
* if bit 0 output 0
* else output 1
* shift bit mask one place right */
if (bytes[i] & mask)
{
sbi(*(reg->PORT_addr),reg->DS_pin);
shift_in_pulse(*(reg->PORT_addr),reg->SH_CP_pin);
}
else
{
cbi(*(reg->PORT_addr),reg->DS_pin);
shift_in_pulse(*(reg->PORT_addr),reg->SH_CP_pin);
}
mask = (mask >> 1);
}
}
parallel_out_pulse(*(reg->PORT_addr),reg->ST_CP_pin);
}
/***********************END OF FILE***********************/
/*************************************************************************
* File Name : shiftreg.h
* Author : D.Gotic
* Version : V0.1
* Date : 03/12/2010
* Description : Helper macros for setting and clearing a bit in a register
**************************************************************************/
#ifndef MACROS_H
#define MACROS_H
#define cbi(addr,bit) addr &= ~(1 << bit)
#define sbi(addr,bit) addr |= (1 << bit)
#endif /* MACROS_H */
/****************************END OF FILE**********************************/
/* ---------- Function prototypes ----------*/
SHIFTREG_register SHIFTREG_InitRegister(volatile uint8_t *ddr_addr, volatile uint8_t *port_addr,uint8_t ds_pin, uint8_t st_cp_pin, uint8_t sh_cp_pin);
Сб дек 28, 2019 22:40:25
Сб дек 28, 2019 22:51:38
Вс дек 29, 2019 08:35:53
Вот пример хидер-файла:
- Код:
#ifdef __cplusplus
extern "C" {
#endif
int sumI(int a, int b);
float sumF(float a, float b);
#ifdef __cplusplus
} // end extern "C"
#endif
Эти ifdef/endif разделяют способ, как компиляторы его будут видеть.
компилятор C:
- Код:
int sumI(int a, int b);
float sumF(float a, float b);
компилятор C++ :
- Код:
extern "C" {
int sumI(int a, int b);
float sumF(float a, float b);
} // end extern "C"
Вс дек 29, 2019 10:47:02
#include <avr/io.h>
#include <avr/interrupt.h>
#include "shiftreg.h"
/* macro definition which returns the number of elements in an arraay */
#define GetArrayElements(x) sizeof(x)/sizeof(x[0])
#define Prescaler_No (1<<CS00) //No prescaling)
#define Prescaler_8 (1<<CS01)
#define Prescaler_64 (1<<CS01)|(1<<CS00)
#define Prescaler_256 (1<<CS02)
#define Prescaler_1024 (1<<CS00)|(1<<CS02);
/* 7 Segment Codes */
#define ZERO 0x3F
#define ONE 0x06
#define TWO 0x5B
#define THREE 0x4F
#define FOUR 0x66
#define FIVE 0x6D
#define SIX 0x7D
#define SEVEN 0x07
#define EIGHT 0x7F
#define NINE 0x6F
volatile uint8_t increment_counter = 0;
ISR(TIM0_COMPA_vect)
{
cli();
increment_counter = 1;
sei();
}
int main(void)
{
unsigned short counter = 0;
unsigned char temp;
unsigned char digits[] = {ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE};
unsigned char display[4];
SHIFTREG_register reg;
TCNT0 = 0; //Очищаем счетный регистр (на ваякий случай)
OCR0A = (256-1)-0;//Регистр сравнения, (256-1)-число
TCCR0A = (1<<WGM01);// Сброс при совпадении.
TIFR0 = (1<<OCF0A); // Регистр флагов прерываний таймера счетчика
TIMSK0 = (1<<OCIE0A); //Разрешение прерывания по совпадению таймера/счётчика 0A
TCCR0B = Prescaler_No;// Делитель частоты
// ds_pin,st_cp_pin,sh_cp_pin
reg = SHIFTREG_InitRegister(&DDRB, &PORTB, PB0, PB1, PB2);
sei();
while (1) {
if(increment_counter)
{
++counter;
if(counter > 9999){ counter = 0; }
increment_counter = 0;
}
temp = counter / 1000;
display[0] = digits[temp];
temp = (counter / 100) % 10;
display[1] = digits[temp];
temp = (counter / 10) % 10;
display[2] = digits[temp];
temp = counter % 10;
display[3] = digits[temp];
SHIFTREG_OutputValue(®,display,GetArrayElements(display));
}
return 0;
}
Вс дек 29, 2019 11:39:39
Вс дек 29, 2019 12:19:57
Вс дек 29, 2019 13:19:13
Вс дек 29, 2019 13:42:41
Вс дек 29, 2019 13:53:28
любознательность - это очень похвально!VladislavS писал(а):А можно узнать, как тогда вы попадаете в прерывание, если они у вас были запрещены?
Вс дек 29, 2019 14:12:13
такое может понадобиться, если есть необходимость, чтобы другое прерывание (более важное) могло прервать ход выполняемого прерывания.ARV писал(а):а вот sei() может быть оправдано.
Вс дек 29, 2019 14:38:21
ISR(INT0_vect)//External Interrupt
{
ips++;//На порт PB2 подаем импульсы _П_П_П_П_П_
};
ISR(TIM0_COMPA_vect)//прерывание по совпадению
{
MAX7219_display_number(ips);//выводим на дисплей цифры
ips=0;
};
Вс дек 29, 2019 15:07:12
Вс дек 29, 2019 15:49:15
Вс дек 29, 2019 16:47:39
ISR(TIM0_COMPA_vect, ISR_NOBLOCK)
Вс дек 29, 2019 18:02:48
Вс дек 29, 2019 19:26:50