Вот скачал книгу, переписал код - часы показывают что-то не понятное не могу правильно сконфигурировать порты. Господа глянте где ошибка?
Прошу строго не судить - учусь я
/*
1. С помощью прерывания получаем точные временные интервалы - например 1сек
2. Считаем эти интервалы. из них слаживаем минуты, часы.
3. Загружаем значение текущего времени в некий буфер, откуда оно будет выводится на индикаторы с помощью динамической индикации.
4. кнопки для управления часами - это уже по вкусу.
Микроконтроллер тактируется кварцем с частотой 16 МГц.
В качестве счетчика времени, внутри микроконтроллера запущен 16 битный таймер с предделителем 256 (т.е. частота отсчетов таймера 62500 Гц),
настроенный на создание прерывания по достижении счетчиком значения 625. Таким образом, мы получаем прерывания ровно 100 раз в секунду (тоесть получаем временный интервал 10 милисекунд).
Значение времени хранится в глобальных переменных, и каждое прерывание мы увеличиваем значение миллисекунд на 1.
Если количество миллисекунд достигает 100, то мы увеличиваем на 1 значение секунд, а значением миллисекунд сбрасываем.
И так далее вплоть до десятков часов, которые сбрасываются по достижении 24 без увеличения следующего разряда.
Часы предельно простые, поэтому не считают ни дату, ни перевод на зимнее/летнее время и т.д.
Данные функции можно реализовать программно, без изменения аппаратной части, поэтому остаются для реализации желающим.
Разобравшись с таймером и прерываниями мы получаем значение текущего времени в глобальных переменных. Теперь займемся выводом этих значений.
Так как количество портов микроконтроллера ограничено, то будем эксплуатировать инерционность зрения.
Катоды всех 4 индикаторов соединены параллельно, а аноды коммутируются отдельно, что позволяет нам в любой момент
времени вывести любую цифру на любой индикатор. Быстро переключая порт B, к которому подключены катоды и быстро переключая
аноды мы можем создать видимость, что у нас работают все 4 цифры, хотя единовременно работает только одна. Иными словами,
если текущее время 12:51, то мы выводим цифру 1 на первый индикатор, спустя малый промежуток времени (у меня 1 мс)
выводим цифру 2 на второй индикатор, спустя 1 мс выводим 5 на 3 индикатор, спустя 1 мс выводим 1 на 4 индикатор и так далее по кругу.
Кнопки опрашиваются после каждого цикла отображения (примерно 40 раз в сек), обработка нажатия снабжена антидребезгом и «защелкой» в виде флага,
что позволяет считать именно нажатия не отвлекаясь на удержание.
*/
#include <avr/io.h> //Тут названия регистров и основные макросы
#include <util/delay.h> //Библиотека обработки задержек
#include <avr/interrupt.h> //Библиотека прерываний
#define digit_display_time 1 //Частота обновления индикации
//частота тактирования микроконтроллера
//#define F_CPU 1600000
//Обьявляем переменные
volatile unsigned char ten_milliseconds, seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours;
volatile unsigned char button_set_minutes, button_set_hours;
//обработчик прерывания таймера Т0
ISR(TIMER0_OVF_vect)
{
ten_milliseconds++;
TCNT0=96; // выставляем начальное значение таймера/счетчика T0
if (ten_milliseconds >= 100 )
{
ten_milliseconds = 0;
seconds++;
};
if (seconds >= 10)
{
seconds = 0;
ten_seconds++;
};
if (ten_seconds >= 6)
{
ten_seconds = 0;
minutes++;
};
if (minutes >= 10)
{
minutes = 0;
ten_minutes++;
};
if (ten_minutes >= 6)
{
ten_minutes = 0;
hours++;
};
if (hours >= 10)
{
hours = 0;
ten_hours++;
};
if (ten_hours >= 2 && hours == 4)
{
ten_hours = 0;
hours = 0;
};
}
int main(void)
{
// 0 1 2 3 4 5 6 7 8 9
const unsigned char digits[10]={0x3F,0xC,0x5B,0x5E,0x6C,0x76,0x77,0x1C,0x7F,0x7E}; //массив для генерации цифр. Какой элемент массива будет отправлен в порт, такая цифра и загорится.
DDRB = 0xff; // все выводы порта B сконфигурировать как выходы
PORTB = 0x00; // установить "0" на всех линиях порта B
DDRD = (1<<6)|(1<<5)(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0); //конфигурация порта D
PORTD = 0x78; // устанавливаем уровни на линиях порта B
TCCR0A = (1<<CS02)|(0<<CS01)|(0<<CS00); // настраиваем делитель на 256
TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
TCNT0=96; // выставляем начальное значение таймера/счетчика T0
sei(); // Разрешение прерываний
while (1)
{
PORTD |=1<<5; //включаем первый индикатор
PORTB = digits[ten_hours]; //выводим на него десятки часов
_delay_ms(digit_display_time); //ждем, время индикации одного разряда задается в заголовке программы
PORTD &=~(1<<5); //выключаем первый индикатор и переходим дальше и так в цикле для каждого из 4 разрядов
PORTD |=1<<4;
PORTB = digits[hours];
if (ten_milliseconds >= 50) PORTB &=~(1<<4); else PORTB|=1<<4; //моргание точки
_delay_ms(digit_display_time);
PORTD &=~(1<<4);
PORTD |=1<<3;
PORTB = digits[ten_minutes];
_delay_ms(digit_display_time);
PORTD &=~(1<<3);
PORTD |=1<<6;
PORTB = digits[minutes];
_delay_ms(digit_display_time);
PORTD &=~(1<<6);
//а вот теперь проверим кнопочки в стиле часов Электроника 13
if ((PIND & 1<<0) == 0 && button_set_hours == 0) //Если нажата кнопка 1
{
_delay_ms(1);
hours++;
button_set_hours = 1;
};
if ((PIND & 1<<0) == 1) button_set_hours=0; //Если отпущена то сбрасываем флаг
if ((PIND & 1<<1) == 0 && button_set_minutes == 0) //Если нажата кнопка 2
{
_delay_ms(1);
minutes++;
button_set_minutes = 1;
};
if (PIND & 1<<1) button_set_minutes=0;
};
}
main.c:1: error: stray '\357' in program
main.c:1: error: stray '\273' in program
main.c:1: error: stray '\277' in program
main.c: In function 'main':
main.c

error: called object '32' is not a function