CodeVision AVR в вопросах и ответах
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
существует, но не рекомендую - косяков в нём много, лучше грызть технический инглиш, потихоньку он пойдёт, да и потом всёравно его учить придётся - сейчас без него никуда...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: CodeVision AVR в вопросах и ответах
косяки существуют даже в оригинале. Получить вменяемую информацию и выучить язык - как-бы не равнозначные по времени вещи...Ivanoff-iv писал(а):но не рекомендую - косяков в нём много
- со временем это приходит автоматическиIvanoff-iv писал(а):лучше грызть технический инглиш
Re: CodeVision AVR в вопросах и ответах
Добрый день city77 подскажи по поводу вот этой строки
TCCR1B = _BV(WGM12) | // WGM = 0100 - режим CTC
_BV(CS12)| // CS = 111 - от внешнего источника (по фронту)
_BV(CS11)|
_BV(CS10);
Должно быть так
TCCR1B = (1<<WGM12) | // WGM = 0100 - режим CTC
(1<<CS12)| // CS = 111 - от внешнего источника (по фронту)
(1<<CS11)|
(1<<CS10);
книги которые вы посоветовали скачал и даже начал читать но мне кажется начал еще больше запутываться. И на данном этапе хочу хотя бы откомпилировать программу и загрузить ее в протеус и хотя бы увидеть в чем проблема, просматривая по шагам.
TCCR1B = _BV(WGM12) | // WGM = 0100 - режим CTC
_BV(CS12)| // CS = 111 - от внешнего источника (по фронту)
_BV(CS11)|
_BV(CS10);
Должно быть так
TCCR1B = (1<<WGM12) | // WGM = 0100 - режим CTC
(1<<CS12)| // CS = 111 - от внешнего источника (по фронту)
(1<<CS11)|
(1<<CS10);
книги которые вы посоветовали скачал и даже начал читать но мне кажется начал еще больше запутываться. И на данном этапе хочу хотя бы откомпилировать программу и загрузить ее в протеус и хотя бы увидеть в чем проблема, просматривая по шагам.
Re: CodeVision AVR в вопросах и ответах
Подскажите пожалуйста. Делаю опрос кнопок во так
#define KEY1 (!PIND.2) // сохранить
#define KEY2 (PORTD.3 = 1)// уменьшить
#define KEY3 (1 << PORTD.4)// увеличить
#define ANYKEY (KEY1 | KEY2 | KEY3)// маска кнопок
#define NOKEY 0 // кнопки не нажаты
switch (gety_key())
{
case KEY1 :
Buton_save(); // Проверим состояние кнопки "Save" и сохраним соотвествующие переменные
break;
};
Создал макрос KEY пробовал варианты 1 2 3 ни один не проходит выдает ошибку
Error: buton 1.c(155): constant integral expression required
и указывает на строку case KEY1 :
я так понимаю, что это макрос неправильно я записал.
#define KEY1 (!PIND.2) // сохранить
#define KEY2 (PORTD.3 = 1)// уменьшить
#define KEY3 (1 << PORTD.4)// увеличить
#define ANYKEY (KEY1 | KEY2 | KEY3)// маска кнопок
#define NOKEY 0 // кнопки не нажаты
switch (gety_key())
{
case KEY1 :
Buton_save(); // Проверим состояние кнопки "Save" и сохраним соотвествующие переменные
break;
};
Создал макрос KEY пробовал варианты 1 2 3 ни один не проходит выдает ошибку
Error: buton 1.c(155): constant integral expression required
и указывает на строку case KEY1 :
я так понимаю, что это макрос неправильно я записал.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
нет, вы неверно макрос применили.bango писал(а):я так понимаю, что это макрос неправильно я записал
PORT.x в нотации CVAVR (это не язык Си!!!) не является константой, а в качестве case-ветвей оператора switch допустимы только константные выражения.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
я вас понял но не понятно как это исправить.
А все вроде бы так хорошо получалось.
Добавлено after 23 minutes 13 seconds:
в се спасибо что на путь истинный направили сделал так
if (gety_key())
{
if (KEY1)
{
Buton_save(); // Проверим состояние кнопки "Save" и сохраним соотвествующие переменные
}
А все вроде бы так хорошо получалось.
Добавлено after 23 minutes 13 seconds:
в се спасибо что на путь истинный направили сделал так
if (gety_key())
{
if (KEY1)
{
Buton_save(); // Проверим состояние кнопки "Save" и сохраним соотвествующие переменные
}
Re: CodeVision AVR в вопросах и ответах
Всем привет! Извините за детский вопрос ))
Хочу отцепить порт от микроконтроллера atmega8 (перевести его в Z-состояние).
В CVAVR набрал код:
#include <mega8.h>
void main(void)
{
DDRD = 0;
}
Это правильно? Как проверить, что ножка порта находится в Z-состоянии? Померить тестером, и омметр должен показывать разрыв?
Хочу отцепить порт от микроконтроллера atmega8 (перевести его в Z-состояние).
В CVAVR набрал код:
#include <mega8.h>
void main(void)
{
DDRD = 0;
}
Это правильно? Как проверить, что ножка порта находится в Z-состоянии? Померить тестером, и омметр должен показывать разрыв?
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
нет, неправильно:
1) надо указывать конкретную ногу: DDRD.1 = 0; (в вашем случае на вход переключится весь порт (8 ног)).
2) нужно выключить возможно включенную подтяжку PORTD.1 = 0;
так я в кодевижне перевёл 1 ногу порта д в z состояние.
а зачем вам z состояние?
Добавлено after 3 minutes 34 seconds:
[uquote="geodx",url="/forum/viewtopic.php?p=3324478#p3324478"]омметр должен показывать разрыв?[/uquote] разрыв с чем?
Не забывайте, кроме отключенного порта остаются как минимум защитные диоды (также периферия иногда может на ноги влиять)
1) надо указывать конкретную ногу: DDRD.1 = 0; (в вашем случае на вход переключится весь порт (8 ног)).
2) нужно выключить возможно включенную подтяжку PORTD.1 = 0;
так я в кодевижне перевёл 1 ногу порта д в z состояние.
а зачем вам z состояние?
Добавлено after 3 minutes 34 seconds:
[uquote="geodx",url="/forum/viewtopic.php?p=3324478#p3324478"]омметр должен показывать разрыв?[/uquote] разрыв с чем?
Не забывайте, кроме отключенного порта остаются как минимум защитные диоды (также периферия иногда может на ноги влиять)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- RusikOk
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн янв 24, 2011 01:51:48
- Откуда: Украина, Киев
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
кто нибудь знает как поменять язык вывода для макроса __DATE__? а еще лучше поменять формат вывода на числовой
- Dr.Seldom
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Ср окт 21, 2009 11:10:53
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
спрашивал в теме про 1307, спршу тут:
DS1307+CVAVR3.22+Proteus8
чтобы не заморачиваться кодом решил использовать счетчик "день недели" из самой 1307 (естественно записав в нее правильные время, дату и день недели.
При переходе на новые сутки счетчик автоматом прибавляет к week_day единицу и при опросе таймера показания выводятся на экранчик.
если установить "6" (суббота) то следующее значение будет "7" т.е. воскресенье... а потом следующее "0" ...задумался )))
это у кого глюки?
ps пробовал считать и вскр = 1, результат тот же - после 7-го дня начинается с ноля
DS1307+CVAVR3.22+Proteus8
чтобы не заморачиваться кодом решил использовать счетчик "день недели" из самой 1307 (естественно записав в нее правильные время, дату и день недели.
При переходе на новые сутки счетчик автоматом прибавляет к week_day единицу и при опросе таймера показания выводятся на экранчик.
если установить "6" (суббота) то следующее значение будет "7" т.е. воскресенье... а потом следующее "0" ...задумался )))
это у кого глюки?
ps пробовал считать и вскр = 1, результат тот же - после 7-го дня начинается с ноля
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Согласно даташиту должно быть 1-7. Где-то код лажает походу.
Docendo discimus
- Dr.Seldom
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Ср окт 21, 2009 11:10:53
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
или протеус.
инкрементация значения происходит в самой 1307, код только читает оттуда.
инкрементация значения происходит в самой 1307, код только читает оттуда.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Без программы и желательно схемы только гадать.
Docendo discimus
- Dr.Seldom
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Ср окт 21, 2009 11:10:53
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
[uquote="pyzhman",url="/forum/viewtopic.php?p=3341753#p3341753"]Без программы и желательно схемы только гадать.[/uquote]
Добавлено after 2 minutes 19 seconds:
проект
Код: Выделить всё
#include <io.h>
#include <delay.h>
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
// TWI functions
#include <twi.h>
// DS1307 Real Time Clock functions for TWI
#include <ds1307_twi.h>
// Alphanumeric LCD functions
#include <alcd.h>
#include <stdio.h>
#define MAX_DEVICES 8
#define SEARCH_ROM 0xF0
unsigned char rom_code[MAX_DEVICES][9];
// Declare your global variables here
unsigned char hour, minu, sec;
unsigned char string[20], string1[20];
unsigned char week_day,day,month,year,c, m, s, d, me, g;
unsigned char i,j,devices;
unsigned char n=1;
unsigned int aa,mm, addr = 1;
volatile int timm, temp;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// Mode: TWI Master
// Bit Rate: 100 kHz
twi_master_init(100);
// 1 Wire Bus initialization
// 1 Wire Data port: PORTC
// 1 Wire Data bit: 0
// Note: 1 Wire port settings are specified in the
// Project|Configure|C Compiler|Libraries|1 Wire menu.
w1_init();
delay_ms(100);
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
lcd_init(16);
// Globally enable interrupts
#asm("sei")
// DS1307 Real Time Clock initialization for TWI
// Square wave output on pin SQW/OUT: On
// Square wave frequency: 1 Hz
rtc_init(0,1,0);
aa=rtc_read(0); //прочесть нулевой байт
//rtc_write(0,(a&=0b01111111)); //обнулить старший бит(CH) запустить внутренний генератор
rtc_set_time(23, 59, 51);
rtc_set_date(7,26,3,18);
// rtc_write(0,0); //Запуск часов
devices=w1_search(0xf0,rom_code);
sprintf(string1,"Device #%u:",devices);
lcd_puts(string1);
delay_ms(20);
w1_init();
devices=w1_search(0xf0,rom_code);
delay_ms(1900);
while (1)
{
if (PIND.1==0)
{
lcd_gotoxy(0,0);
rtc_get_time(&c, &m, &s);
rtc_get_date(&week_day,&day,&month,&year);
//тут вариант исправления
if (week_day == 0) {week_day=1; rtc_set_date(week_day,day,month,year);}
// Отформатировали
sprintf(string, "%02i:%02i:%02i=%02i ", c, m,s, week_day );
// Вывели время
lcd_puts(string);
lcd_gotoxy(0,1);
sprintf(string1,"%+.2f\xdf" "C",ds18b20_temperature(&rom_code[0][0]));
lcd_puts(string1);
delay_ms(1900);
timm=c*100+m;
}
///////////////////////////////////////////////
// тут ниже всякие недоделки
if (PIND==6){
lcd_clear();
rtc_get_time(&hour, &minu, &sec);
//mm=&minu;
hour++;
if (hour>23){hour=0;}
rtc_set_time(hour, minu, sec);
rtc_get_time(&hour, &minu, &sec);
lcd_gotoxy(0,0);
sprintf(string, "%02i:%02i=%02i ",hour, minu, week_day );
lcd_puts(string);
delay_ms(200);
// #asm("sei")
}
if (PIND==10){
lcd_clear();
rtc_get_time(&hour, &minu, &sec);
//mm=&minu;
minu++;
if (minu>59){minu=0;}
rtc_set_time(hour, minu, sec);
rtc_get_time(&hour, &minu, &sec);
lcd_gotoxy(0,0);
lcd_gotoxy(0,0);
sprintf(string, "%02i:%02i=%02i ", hour, minu, week_day );
lcd_puts(string);
delay_ms(200);
// #asm("sei")
}
//////////////////////////////////////////
if (PIND==18){
lcd_clear();
rtc_get_time(&hour, &minu, &sec);
//mm=&minu;
minu++;
if (minu>59){minu=0;}
rtc_set_time(hour, minu, sec);
rtc_get_time(&hour, &minu, &sec);
lcd_gotoxy(0,0);
lcd_gotoxy(0,0);
sprintf(string, "%02i:%02i=%02i ", hour, minu, week_day );
lcd_puts(string);
delay_ms(200);
// #asm("sei")
}
}
}
проект
- Вложения
-
- AAA.rar
- (20.21 КБ) 221 скачивание
-
- 2018-03-29_15-09-12.png
- (41.06 КБ) 520 скачиваний
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Про отступы в коде для его читабельности не в курсе?
Тогда для наглядности взгляните на это и это.
Я бы постыдился такой код выкладывать.
По теме:Здесь Вы сами и добавляете этот сдвиг. Хотя, технически, 0 в качестве дня недели из часов получаться не должен, и этот код срабатывать тоже.
Нужно просто читать данные из RTC, и всё. Числа в диапазоне 1..7 - это дни недели. По даташиту 1 - это воскресенье, но чистая условность (хотя при эмуляции в Proteus это тоже так).
Тогда для наглядности взгляните на это и это.
Я бы постыдился такой код выкладывать.
По теме:
Код: Выделить всё
if (week_day == 0) {
week_day = 1;
rtc_set_date(week_day, day, month, year);
}Нужно просто читать данные из RTC, и всё. Числа в диапазоне 1..7 - это дни недели. По даташиту 1 - это воскресенье, но чистая условность (хотя при эмуляции в Proteus это тоже так).
- Dr.Seldom
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Ср окт 21, 2009 11:10:53
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
В соседней теме результат тот же.Хотя, технически, 0 в качестве дня недели из часов получаться не должен, и этот код срабатывать тоже.
тут
проверено oleg110592

- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Да, тоже сейчас в своём проекте попробовал выставить 23:59 - текущий день, пятница (число 6 в регистре RTC) так и не переключился на субботу (7). Так что, похоже, Proteus действительно подвирает в этом смысле.
Собственно, предпочитаю в железе прошивки проверять. Это понадёжнее будет.
P.S. остальные байты - дата и прочее, срабатывают нормально.
Для себя, в своих проектах, я вообще не читаю weekday байт из часов в отдельную переменную. Предпочитаю вычислять день недели по дате приблизительно так:
Собственно, предпочитаю в железе прошивки проверять. Это понадёжнее будет.
P.S. остальные байты - дата и прочее, срабатывают нормально.
Для себя, в своих проектах, я вообще не читаю weekday байт из часов в отдельную переменную. Предпочитаю вычислять день недели по дате приблизительно так:
Код: Выделить всё
int8_t rtcWeekDay()
{
uint8_t a, y, m;
int8_t ret;
a = (rtc.month > 2 ? 0 : 1);
y = 12 + rtc.year - a;
m = rtc.month + 12 * a - 2;
ret = (rtc.date + y + (y / 4) + ((31 * m) / 12)) % 7;
if (ret == 0)
ret = 7;
return ret;
}Re: CodeVision AVR в вопросах и ответах
Подскажите в CV есть аналогичный $PROJ_DIR$ как в IAR указывающий путь к текущей папке?
- rxstart1
- Вымогатель припоя
- Сообщения: 508
- Зарегистрирован: Пт фев 22, 2013 18:00:43
- Откуда: Беларусь, г. Гомель
Re: CodeVision AVR в вопросах и ответах
Срочно нужна помощь Codevision AVRC. На железе не работает, в протеусе все ОК.
Как только отключаю запись в eeprom на железе начинает работать. Подскажите плз. куда рыть? Голову уже сломал ((((
#include <mega8.h>
// Макро-функции для работы с битами, где reg - байт, b - номер бита в байте reg
#define SB(reg, b) reg |= (1<<b) // Установить бит SetBit
#define CB(reg, b) reg &= (~(1<<b)) // Очистить бит ClearBit
#define IB(reg, b) reg ^= (1<<b) // Инвертировать бит InvertBit
#define VB(reg, b) ((reg & (1<<b)) != 0) // Проверить бит VerifyBit
#define SECURITY PINB.3
volatile unsigned char eeprom Err; // Сюда считывается ошибка из энергонезависимой память EEPROM
void WriteEEPROM (unsigned char Flag)
{
while (EECR & (1<<EEWE));
EEAR = 0x00;
EEDR =Flag;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
void main(void)
{
PORTB=0x0C; // Настройка портов
DDRB=0x00;
DDRC=0x1F;
PORTC=0x00;
DDRD=0x43;
PORTD=0x04;
GIFR=(1<<INTF0)|(1<<INTF1); // Установить флаг пререрывания INT0 и INT1
MCUCR=(1<<ISC00)|(0<<ISC10)|(0<<ISC11); // Настроить прерывание INT0 по любому состоянию, а прерыввание INT1 по низкому уровню
GICR=(1<<INT0)|(1<<INT1); // Разрешить прерывания INT0, INT1
TCCR0=(1<<CS02)|(1<<CS00); // Настроить TIMER0 на частоту 7812 Гц
TCCR1B=(1<<CS11)|(1<<CS10); // Предделитель TIMER1=64 частота 8000000/64=125000Гц
TCNT0=0x37; // Начальное значение счетчика TIMER0 (переполнение будет происходить 39,06 раз в секунду)
TCNT1=0x00; // Сброс счетчика TIMER1
ICR1=0x00; // Сброс регистра захвата TIMER1
CB(TCCR1B,ICES1); // Устанавливаем прерывание по спадающему фронту импульса
TIMSK=(1<<TICIE1)|(1<<TOIE1)|(1<<TOIE0); // Настроить TIMER0 по переполнению, а TIMER1 по захвату и переполнению
UCSRB=(1<<TXEN); // Разрешить передачу
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Работаем с регистром UCSRC|8 бит данных|1 стоп бит
UBRRL=0x33; // Скорость передачи 9600 бит/сек
#asm("sei") // Разрешить внешние прерывания
if (Err==0xFF) WriteEEPROM(0x00); // Если первый запуск контроллера то заменить в EEPROM FF на 00
while (1)
{
if (!SECURITY) {#asm("sei") PORTD.0=1;PORTD.6=1;} else {#asm("cli") PORTD.0=0;PORTD.6=0;}
}
}
Как только отключаю запись в eeprom на железе начинает работать. Подскажите плз. куда рыть? Голову уже сломал ((((
#include <mega8.h>
// Макро-функции для работы с битами, где reg - байт, b - номер бита в байте reg
#define SB(reg, b) reg |= (1<<b) // Установить бит SetBit
#define CB(reg, b) reg &= (~(1<<b)) // Очистить бит ClearBit
#define IB(reg, b) reg ^= (1<<b) // Инвертировать бит InvertBit
#define VB(reg, b) ((reg & (1<<b)) != 0) // Проверить бит VerifyBit
#define SECURITY PINB.3
volatile unsigned char eeprom Err; // Сюда считывается ошибка из энергонезависимой память EEPROM
void WriteEEPROM (unsigned char Flag)
{
while (EECR & (1<<EEWE));
EEAR = 0x00;
EEDR =Flag;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
void main(void)
{
PORTB=0x0C; // Настройка портов
DDRB=0x00;
DDRC=0x1F;
PORTC=0x00;
DDRD=0x43;
PORTD=0x04;
GIFR=(1<<INTF0)|(1<<INTF1); // Установить флаг пререрывания INT0 и INT1
MCUCR=(1<<ISC00)|(0<<ISC10)|(0<<ISC11); // Настроить прерывание INT0 по любому состоянию, а прерыввание INT1 по низкому уровню
GICR=(1<<INT0)|(1<<INT1); // Разрешить прерывания INT0, INT1
TCCR0=(1<<CS02)|(1<<CS00); // Настроить TIMER0 на частоту 7812 Гц
TCCR1B=(1<<CS11)|(1<<CS10); // Предделитель TIMER1=64 частота 8000000/64=125000Гц
TCNT0=0x37; // Начальное значение счетчика TIMER0 (переполнение будет происходить 39,06 раз в секунду)
TCNT1=0x00; // Сброс счетчика TIMER1
ICR1=0x00; // Сброс регистра захвата TIMER1
CB(TCCR1B,ICES1); // Устанавливаем прерывание по спадающему фронту импульса
TIMSK=(1<<TICIE1)|(1<<TOIE1)|(1<<TOIE0); // Настроить TIMER0 по переполнению, а TIMER1 по захвату и переполнению
UCSRB=(1<<TXEN); // Разрешить передачу
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Работаем с регистром UCSRC|8 бит данных|1 стоп бит
UBRRL=0x33; // Скорость передачи 9600 бит/сек
#asm("sei") // Разрешить внешние прерывания
if (Err==0xFF) WriteEEPROM(0x00); // Если первый запуск контроллера то заменить в EEPROM FF на 00
while (1)
{
if (!SECURITY) {#asm("sei") PORTD.0=1;PORTD.6=1;} else {#asm("cli") PORTD.0=0;PORTD.6=0;}
}
}
- RusikOk
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн янв 24, 2011 01:51:48
- Откуда: Украина, Киев
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
[uquote="rxstart1",url="/forum/viewtopic.php?p=3396962#p3396962"]Как только отключаю запись в eeprom...[/uquote]https://www.drive2.ru/b/1299334/