Re: Цифровой одометр на Atmega8
Добавлено: Пн фев 07, 2011 23:59:58
все кнопки управления на одну ногу АЦП.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
//числа для вывода на индикатор
volatile unsigned char data1 = 0;
volatile unsigned char data2 = 0;
volatile unsigned char data3 = 0;
void main( void )
{
//порт, к которому подкл. сегменты
PORTB = 0xff;
DDRB = 0xff;
//порт, к которому подкл. катод
PORTD = 0;
DDRD |= (1<<2)|(1<<1)|(1<<0);
//инициализация таймера Т0
TIMSK = (1<<TOIE0);
TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0xb2;
#asm("sei");
while(1){
//программный счетчик секунд
data3++;
if (data3 == 10){
data3 = 0;
data2++;
if (data2 == 1) data2 = 0;
data1++;
if (data1 == 10) data1 = 0;
}
delay_ms(100);
}
}
//прерывания таймера Т0 - вывод на индикатор
interrupt [TIM0_OVF] void Timer0Ovf(void)
{
static unsigned char count = 0;
TCNT0 = 0xb2;
//гасим оба разряда
PORTD &= ~((1<<2)|(1<<1)|(1<<0));
//зажигаем следующий разряд
if (count == 2) {
PORTB = number[data3];
PORTD |= (1<<2);
}
if (count == 0) {
PORTB = number[data2];
PORTD |= (1<<1);
}
if (count == 1) {
PORTB = number[data1];
PORTD |= (1<<0);
}
count++;
if (count == 3) count = 0;
}Код: Выделить всё
#asm("sei");
while(1){
//программный счетчик секунд
data3++;
if (data3 == 10){
data3 = 0;
data1++;
if (data1 == 10) {data1 = 0;
data2++;
if (data2 == 10){ data2 = 0;
} }}
delay_ms(100);
}
}так задавай вопросы конкретнее, тогда и ответы будут.yur4ik писал(а):КРУТЬЬЬ и с кнопочками разобралсяблин не радовался так еще никогда как ща
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста
ВСе уже не надо разобрался самs64 писал(а):так задавай вопросы конкретнее, тогда и ответы будут.yur4ik писал(а):КРУТЬЬЬ и с кнопочками разобралсяблин не радовался так еще никогда как ща
Теперь застопорился на внешнем прерывании помогите кто чем может пожалуйста
Код: Выделить всё
#include <mega8.h>
//#include <delay.h>
unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
//числа для вывода на индикатор
volatile unsigned char data1 = 0;
volatile unsigned char data2 = 0;
volatile unsigned char data3 = 0;
volatile unsigned char data4 = 0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
data4++;
if (data4 == 10){ data4 = 0;
data3++;
if (data3 == 10){ data3 = 0;
data1++;
if (data1 == 10) {data1 = 0;
data2++;
if (data2 == 10){ data2 = 0;
} }}}
}
void main(void){
//порт, к которому подкл. сегменты
PORTB = 0xff;
DDRB = 0xff;
//кнопка сброса
PORTC=0xFF;
DDRC=0x00;
//порт, к которому подкл. катод
PORTD = 0;
DDRD |= (1<<5)|(1<<4)|(1<<1)|(1<<0);
// //инициализация таймера Т0
// TIMSK = (1<<TOIE0);
// TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
// TCNT0 = 0xb2;
GICR|=0xC0;
MCUCR=0x0A;
GIFR=0xC0;
//разрешаем прерывания
#asm("sei")
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
static unsigned char count = 0;
TCNT0 = 0xb2;
//гасим оба разряда
PORTD &= ~((1<<5)|(1<<4)|(1<<1)|(1<<0));
//зажигаем следующий разряд
if (count == 3) {
PORTB = number[data4];
PORTD |= (1<<5);
}
if (count == 2) {
PORTB = number[data3];
PORTD |= (1<<4);
}
if (count == 0) {
PORTB = number[data2];
PORTD |= (1<<1);
}
if (count == 1) {
PORTB = number[data1];
PORTD |= (1<<0);
}
count++;
if (count == 4) count = 0;
if (PINC.0==0){
data1 = 0;
data2 = 0;
data3 = 0;
data4 = 0;
}
}
Код: Выделить всё
eeprom volatile unsigned char data1;
eeprom volatile unsigned char data2;
eeprom volatile unsigned char data3;
eeprom volatile unsigned char data4;
eeprom volatile unsigned char dataa1;
eeprom volatile unsigned char dataa2;
eeprom volatile unsigned char dataa3;
eeprom volatile unsigned char dataa4;
eeprom volatile unsigned char dataa5;
eeprom volatile unsigned char dataa6;
eeprom volatile unsigned char dataa7;даташит 1-я страница.yur4ik писал(а): объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
100000 циклов стирания/записиs64 писал(а):даташит 1-я страница.yur4ik писал(а): объявив сами переменные в еепром. а еепром туда ваще сколько можно записывать то раз?
хмм... у меня в распоряжении всего одна ножка осталась я скорее всего не так сделаю, а вот такs64 писал(а):контролировать напряжение перед 5v стабилизатором, как только упало ниже 11 вольт, записывать нужные данные в EEPROM.
ахахахха вернулась старая проблемаs64 писал(а):поставь IRLML6402 и убери резистор. Так как ты нарисовал делать нельзя, нужен p-n-p транзистор, эмиттером на плюс, но тогда на базе и соответственно на МК будет попадать 12 вольт.
Код: Выделить всё
#include <mega8.h>
//#include <delay.h>
unsigned char number[] =
{
0b11000000,
0b11111001,
0b10100100,
0b10110000,
0b10011001,
0b10010010,
0b10000010,
0b11111000,
0b10000000,
0b10010000
};
//числа для вывода на индикатор
eeprom volatile unsigned char data1 = 0 ;
eeprom volatile unsigned char data2 = 0;
eeprom volatile unsigned char data3 = 0;
eeprom volatile unsigned char data4 = 0;
eeprom volatile unsigned char dataa1= 0;
eeprom volatile unsigned char dataa2= 0;
eeprom volatile unsigned char dataa3= 0;
eeprom volatile unsigned char dataa4= 0;
eeprom volatile unsigned char dataa5= 0;
eeprom volatile unsigned char dataa6= 0;
eeprom volatile unsigned char dataa7= 0;
volatile unsigned char dat1 = 0 ;
volatile unsigned char dat2 = 0;
volatile unsigned char dat3 = 0;
volatile unsigned char dat4 = 0;
volatile unsigned char dataaa1= 0;
volatile unsigned char dataaa2= 0;
volatile unsigned char dataaa3= 0;
volatile unsigned char dataaa4= 0;
volatile unsigned char dataaa5= 0;
volatile unsigned char dataaa6= 0;
volatile unsigned char dataaa7= 0;
//число импульсов с датчика
volatile unsigned char imp= 0 ;
volatile unsigned char i= 0 ;
volatile unsigned char im= 0 ;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
im++;
}
void main(void){
//порт, к которому подкл. сегменты
PORTB = 0xff;
DDRB = 0xff;
//порт, к которому подкл. катод
PORTC = 0;
DDRC |= (1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
PORTD = 0;
DDRD |= (1<<5)|(1<<4)|(1<<1)|(1<<0);
// //инициализация таймера Т0
TIMSK = (1<<TOIE0);
TCCR0 = (0<<CS02)|(1<<CS01)|(0<<CS00);
TCNT0 = 0xb2;
GICR|=0xC0;
//MCUCR=0x0A;
//GIFR=0xC0;
if(i<=1){
dat1=data1;
dat2=data2;
dat3=data3;
dat4=data4;
dataaa6=dataa6;
dataaa1=dataa1;
dataaa2=dataa2;
dataaa3=dataa3;
dataaa4=dataa4;
dataaa5=dataa5;
dataaa6=dataa6;
dataaa7=dataa7;
}else{i++;}
//разрешаем прерывания
#asm("sei");
while(1){
if (im==1){
im=0;
if (imp==0){
imp=0;
dat4++;
if (dat4 == 10){ dat4 = 0;
dat3++;
if (dat3 == 10){ dat3 = 0;
dat1++;
if (dat1 == 10) {dat1 = 0;
dat2++;
if (dat2 == 10){ dat2 = 0;
}}}}
dataaa7++;
if (dataaa7 == 10){ dataaa7 = 0;
dataaa6++;
if (dataaa6 == 10){ dataaa6 = 0;
dataaa5++;
if (dataaa5 == 10){ dataaa5 = 0;
dataaa4++;
if (dataaa4 == 10) {dataaa4 = 0;
dataaa3++;
if (dataaa3 == 10){ dataaa3 = 0;
dataaa2++;
if (dataaa2 == 10){ dataaa2 = 0;
dataaa1++;
if (dataaa1 == 10){ dataaa1 = 0;
}}}}}}}
}else imp++; }
}
}
//interrupt [EXT_INT1] void ext_int1_isr(void)
//{
interrupt [TIM0_OVF] void Timer0Ovf(void)
{
static unsigned char count1 = 0;
TCNT1 = 0xb2;
PORTD &= ~((1<<5)|(1<<4)|(1<<1)|(1<<0));
PORTC &= ~((1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0));
//зажигаем следующий разряд
if (count1 == 9) {
PORTB = number[dat4];
PORTD |= (1<<5);
}
if (count1 == 8) {
PORTB = number[dat3];
PORTB.7=0;
PORTD |= (1<<4);
}
if (count1 == 7) {
PORTB = number[dat2];
PORTD |= (1<<1);
}
if (count1 == 6) {
PORTB = number[dat1];
PORTD |= (1<<0);
}
if (count1 == 5) {
PORTB = number[dataaa6];
PORTC |= (1<<5);
}
if (count1 == 4) {
PORTB = number[dataaa5];
PORTC |= (1<<4);
}
if (count1 == 3) {
PORTB = number[dataaa4];
PORTC |= (1<<3);
}
if (count1 == 2) {
PORTB = number[dataaa3];
PORTC |= (1<<2);
}
if (count1 == 1) {
PORTB = number[dataaa2];
PORTC |= (1<<1);
}
if (count1 == 0) {
PORTB = number[dataaa1];
PORTC |= (1<<0);
}
count1++;
if (count1 == 10) count1 = 0;
if (PIND.6==0)
{
dat1 = 0;
dat2 = 0;
dat3 = 0;
dat4 = 0;
}
if (PIND.7==0)
{
data1=dat1;
data2=dat2;
data3=dat3;
data4=dat4;
dataa1=dataaa1;
dataa2=dataaa2;
dataa3=dataaa3;
dataa4=dataaa4;
dataa5=dataaa5;
dataa6=dataaa6;
dataa7=dataaa7;
}
}