CodeVision AVR в вопросах и ответах
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
выше прота г и не должно... т.к. там кончается доступное для битовых операций пространство.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Реклама
Re: CodeVision AVR в вопросах и ответах
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3957440#p3957440"]выше прота г и не должно... т.к. там кончается доступное для битовых операций пространство.[/uquote]
ОФигеть, где про это почитать?
ОФигеть, где про это почитать?
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
в даташите на процессоры серии авр - в частности на любой атмеге написаны пределы доступности команд cbi sbi и почему так - можно понять по размеру их аргумента - тупо не хватило бит на бОльшее кол-во адресов
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
Re: CodeVision AVR в вопросах и ответах
[uquote="clawham",url="/forum/viewtopic.php?p=3957626#p3957626"]в даташите на процессоры серии авр - в частности на любой атмеге написаны пределы доступности команд cbi sbi и почему так - можно понять по размеру их аргумента - тупо не хватило бит на бОльшее кол-во адресов[/uquote]
Коммон, мне не нужно установить бит, мне нужно его посмотреть.
Коммон, мне не нужно установить бит, мне нужно его посмотреть.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
а это не важно
флаговые операции через точку транслируются в sbi cbi и если такового не может быть осуществлено - то и читать и писать вы это не сможете через точку.
это написано в подсказке самой CVAVR
The bit level access to the I/O registers can be also accomplished by using bit selectors appended after the name of the I/O register.
Because bit level access to I/O registers is done using the CBI, SBI, SBIC and SBIS instructions, the register address must be in the 0 to 1Fh range
Note: Bit selector access to I/O registers located in internal RAM above address 5Fh (like PORTF for the ATmega128 for example) will not work, because the CBI, SBI, SBIC and SBIS instructions can't be used for RAM access.
Перевод нужен? порты с адресами выше 0x1F - недоступны для битовых атомарных операций CBI, SBI, SBIC and SBIS
туда доступ только через команду out
так же в файле atmega2560юр есть перечень всех регистров, к которым допустимо битовое атомарное обращение
sfrb PINA=0;
sfrb DDRA=1;
sfrb PORTA=2;
sfrb PINB=3;
sfrb DDRB=4;
sfrb PORTB=5;
sfrb PINC=6;
sfrb DDRC=7;
sfrb PORTC=8;
sfrb PIND=9;
sfrb DDRD=0xa;
sfrb PORTD=0xb;
sfrb PINE=0xc;
sfrb DDRE=0xd;
sfrb PORTE=0xe;
sfrb PINF=0xf;
sfrb DDRF=0x10;
sfrb PORTF=0x11;
sfrb PING=0x12;
sfrb DDRG=0x13;
sfrb PORTG=0x14;
sfrb TIFR0=0x15;
sfrb TIFR1=0x16;
sfrb TIFR2=0x17;
sfrb TIFR3=0x18;
sfrb TIFR4=0x19;
sfrb TIFR5=0x1a;
sfrb PCIFR=0x1b;
sfrb EIFR=0x1c;
sfrb EIMSK=0x1d;
sfrb GPIOR0=0x1e;
sfrb EECR=0x1f;
sfrb EEDR=0x20;
sfrb EEARL=0x21;
sfrb EEARH=0x22;
sfrw EEAR=0X21; // 16 bit access
sfrb GTCCR=0x23;
sfrb TCCR0A=0x24;
sfrb TCCR0B=0x25;
sfrb TCNT0=0x26;
sfrb OCR0A=0x27;
sfrb OCR0B=0x28;
sfrb GPIOR1=0x2a;
sfrb GPIOR2=0x2b;
sfrb SPCR=0x2c;
sfrb SPSR=0x2d;
sfrb SPDR=0x2e;
sfrb ACSR=0x30;
sfrb OCDR=0x31;
sfrb SMCR=0x33;
sfrb MCUSR=0x34;
sfrb MCUCR=0x35;
sfrb SPMCSR=0x37;
sfrb RAMPZ=0x3b;
sfrb EIND=0x3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-
как видите всё закончилось на PORTK
это написано в подсказке самой CVAVR
The bit level access to the I/O registers can be also accomplished by using bit selectors appended after the name of the I/O register.
Because bit level access to I/O registers is done using the CBI, SBI, SBIC and SBIS instructions, the register address must be in the 0 to 1Fh range
Note: Bit selector access to I/O registers located in internal RAM above address 5Fh (like PORTF for the ATmega128 for example) will not work, because the CBI, SBI, SBIC and SBIS instructions can't be used for RAM access.
Перевод нужен? порты с адресами выше 0x1F - недоступны для битовых атомарных операций CBI, SBI, SBIC and SBIS
туда доступ только через команду out
так же в файле atmega2560юр есть перечень всех регистров, к которым допустимо битовое атомарное обращение
sfrb PINA=0;
sfrb DDRA=1;
sfrb PORTA=2;
sfrb PINB=3;
sfrb DDRB=4;
sfrb PORTB=5;
sfrb PINC=6;
sfrb DDRC=7;
sfrb PORTC=8;
sfrb PIND=9;
sfrb DDRD=0xa;
sfrb PORTD=0xb;
sfrb PINE=0xc;
sfrb DDRE=0xd;
sfrb PORTE=0xe;
sfrb PINF=0xf;
sfrb DDRF=0x10;
sfrb PORTF=0x11;
sfrb PING=0x12;
sfrb DDRG=0x13;
sfrb PORTG=0x14;
sfrb TIFR0=0x15;
sfrb TIFR1=0x16;
sfrb TIFR2=0x17;
sfrb TIFR3=0x18;
sfrb TIFR4=0x19;
sfrb TIFR5=0x1a;
sfrb PCIFR=0x1b;
sfrb EIFR=0x1c;
sfrb EIMSK=0x1d;
sfrb GPIOR0=0x1e;
sfrb EECR=0x1f;
sfrb EEDR=0x20;
sfrb EEARL=0x21;
sfrb EEARH=0x22;
sfrw EEAR=0X21; // 16 bit access
sfrb GTCCR=0x23;
sfrb TCCR0A=0x24;
sfrb TCCR0B=0x25;
sfrb TCNT0=0x26;
sfrb OCR0A=0x27;
sfrb OCR0B=0x28;
sfrb GPIOR1=0x2a;
sfrb GPIOR2=0x2b;
sfrb SPCR=0x2c;
sfrb SPSR=0x2d;
sfrb SPDR=0x2e;
sfrb ACSR=0x30;
sfrb OCDR=0x31;
sfrb SMCR=0x33;
sfrb MCUSR=0x34;
sfrb MCUCR=0x35;
sfrb SPMCSR=0x37;
sfrb RAMPZ=0x3b;
sfrb EIND=0x3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-
как видите всё закончилось на PORTK
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- Реклама
Re: CodeVision AVR в вопросах и ответах
Угу, я уже и сам понял.
Re: CodeVision AVR в вопросах и ответах
Доброго времени суток. Столкнулся с вопросом: CodeVisionAVR для студентов-нищебродов не могу найти с наскоку бесплатный. подскажите где скачать? мне нужна версия для тиньки2313 ,говнокод сильно меньше 4 кБ,современных дисплеев не буду подключать,современные библиотеки не нужны =( может у кого дистрибутив старый завалялся?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: CodeVision AVR в вопросах и ответах
добрый день.
как получить разные случайные числа при каждом запуске программы? использовать текущее время в качестве начального числа для генератора случайных чисел
#include<time.h>
srand(time(0));
не получается в CodeVision AVR не такой библиотеки, тогда как?
[uquote="ARV",url="/forum/viewtopic.php?p=3960070#p3960070"]
в общем и целом как-то так:MAXRAM - это максимальный адрес доступного RAM в выбраном МК, а clc_crc_1wire - это функция вычисления CRC по алгоритму 1-wire, можно и по любому иному алгоритму, но этот самый известный и в CVAVR тоже по идее должен быть в библиотеке...[/uquote]
может кто то может пример ARV в CVAVR написать . за ранее спасибо.
как получить разные случайные числа при каждом запуске программы? использовать текущее время в качестве начального числа для генератора случайных чисел
#include<time.h>
srand(time(0));
не получается в CodeVision AVR не такой библиотеки, тогда как?
[uquote="ARV",url="/forum/viewtopic.php?p=3960070#p3960070"]
проще некуда.Serzh2000 писал(а):желательно попроще и поподробнее!
а вот с этим никак, ибо использую только avr-gcc (WinAVR).Serzh2000 писал(а):с примером в CodeVisionAVR
в общем и целом как-то так:
Код: Выделить всё
unsigned char *ptr = (void*)0;
int sum = 0;
for(int i=0; i < MAXRAM; ptr++) sum = calc_crc_1wire(sum, *ptr);
srand(sum);может кто то может пример ARV в CVAVR написать . за ранее спасибо.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Откуда в МК может быть текущее время ?Serzh2000 писал(а):не получается в CodeVision AVR не такой библиотеки
А что конкретно из этого непонятно ?Serzh2000 писал(а):может кто то может пример ARV в CVAVR написать
Примеров CRC для 1-Wire полно в интернете.
MAXRAM - это Вам только знать, сколько и чего у Вас там ...
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: CodeVision AVR в вопросах и ответах
У МЕНЯ АТМЕГА 8.
если можете напишите как сделать чтоб rand() был случайным числом при включении каждый раз.
или поделитесь своим примером для задания начального значения случайной последовательности .
я не понимаю как читать точнее написать это в CVAVR. Эта функция из библиотеки clc_crc_1wire ? какой то.А что конкретно из этого непонятно ?
Примеров CRC для 1-Wire полно в интернете.
MAXRAM - это Вам только знать, сколько и чего у Вас там ...
если можете напишите как сделать чтоб rand() был случайным числом при включении каждый раз.
или поделитесь своим примером для задания начального значения случайной последовательности .
- Вложения
-
- ZveZda.zip
- (979.1 КБ) 251 скачивание
Re: CodeVision AVR в вопросах и ответах
[uquote="Аlex",url="/forum/viewtopic.php?p=3988961#p3988961"]Откуда в МК может быть текущее время ?
[/uquote]
А мож у него DS1307 к МК прикошачен ?
А мож у него DS1307 к МК прикошачен ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Это :Serzh2000 писал(а):Эта функция из библиотеки clc_crc_1wire ? какой то.
Serzh2000 писал(а):функция вычисления CRC по алгоритму 1-wire
Вы можете взять любой, удобный Вам алгоритм. Хоть самый простой, типа обычной суммы.
Может быть. Но я не уверен, судя по вопросамJack_A писал(а):А мож у него DS1307 к МК прикошачен ?
Re: CodeVision AVR в вопросах и ответах
К чему эти извращения.
Код: Выделить всё
EEMEM uint8_t ee_seed;
randomSeed(eeprom_read_byte(&ee_seed));
eeprom_write_byte(&ee_seed, eeprom_read_byte(&ee_seed) + 1);- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: CodeVision AVR в вопросах и ответах
[uquote="Jack_A",url="/forum/viewtopic.php?p=3989104#p3989104"][uquote="Аlex",url="/forum/viewtopic.php?p=3988961#p3988961"]Откуда в МК может быть текущее время ?
[/uquote]
А мож у него DS1307 к МК прикошачен ?
[/uquote]
нет не прикошачен
#include <mega8.h>
#include <stdlib.h>
#include <delay.h>
unsigned char digit_out[5], // буфер экрана (нумерация от 0 до 4 разрядa)
cur_dig; // тек.высвечиваемый символ (позиция)
unsigned int speed,delit, // время кадра
h=1, // число повторов эффекта
yarkost=255; // яркость
static flash unsigned char digits[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// ---------------- Timer 2 overflow interrupt service routine -----------------------------
interrupt [TIM2_OVF] void timer2_ovf_isr(void){
PORTC&=0b00000000; // потушить все (разряды - off)
PORTD=~digits[digit_out[cur_dig]];
PORTC |= (1<<cur_dig); // засветить нужный разряд (бит знакоместа - on)
cur_dig++; if (cur_dig >= 5) {
cur_dig = 0;
OCR2 = yarkost;
}
}// ----------------------------------------------------------------------------------------
// ------------------ Timer2 output compare interrupt service routine ----------------------
interrupt [TIM2_COMP] void timer2_comp_isr(void){
PORTC&=0b00000000;
// PORTD=0b11111111;
}
// ------------------ случайная скорость эффекта ------------------------------------------
void view_speed(void) {
yarkost=255;
speed=rand()%4+1; // случайное число от 1 до 6
delit= rand()%100+80; // случайное число от 50 до 100
speed=speed*delit;
}
//-----------------------------------------------------------------------------------------
void yarkost_umenshit(void) {
while(yarkost>2)
{
yarkost--;
delay_ms(10);
}
}
// view_speed(); delay_ms(speed);
//-----------------------------------------------------------------------------------------
void view_flasher_0(void) {
int j;
for (j =0; j<h;++j){
yarkost=2;
digit_out[0] = 15;
digit_out[1] = 15;
digit_out[2] = 15;
digit_out[3] = 15;
digit_out[4] = 15;
while(yarkost<255)
{
yarkost++;
delay_ms(10);
}
delay_ms(400);
while(yarkost>2)
{ yarkost--;
delay_ms(10);
}
}
}
//-----------------------------------------------------------------------------------------
void view_flasher_1(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = {15,15,15,15,15};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A;
digit_out[1] = B;
digit_out[2] = C;
digit_out[3] = D;
digit_out[4] = E;
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
void view_flasher_2(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = {15,15,15,15,15};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A;
digit_out[1] = B;
digit_out[2] = C;
digit_out[3] = D;
digit_out[4] = E;
delay_ms(speed);
}
}
void view_flasher_3(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = {15,15,15,15,15};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
//----------------------------------------------------------------------------------------
void view_flasher_4(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = {15,15,15,15,15};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
void view_flasher_5(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = {15,15,15,15,15};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
//=================== main ==========
//основаня функция
void main(void){
int seed;
digit_out[0]=0; // очистить экран
digit_out[1]=0;
digit_out[2]=0;
digit_out[3]=0;
digit_out[4]=0;
srand(2); // устанавливаем стартовое значение - 4 541
//настройка портов
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000000; //порт С 4 первые по умолчанию 1
DDRC=0b00011111; //порт С 4 первые ноги на вывод
PORTD=0b00000000; //порт D по умолчанию все ноги на 0
DDRD=0b00001111; //порт D все ноги на вывод
TCCR2=0x04;
TIMSK=0b11000000;
// 0b11000001
// || | |
// || | Timer0
// || Timer1
// |Timer2
//
#asm("sei") // Глобальные прерывания включения
// -------------------------------- рабочая часть ------------------------------------------
while (1) {
int ef,t,g,j,k,n;
int effect[] = {0,1,2,3,4,5};
n = sizeof(effect) / sizeof(effect[0]);
for (k = 0; k < n - 1; k++)
{
j = rand()% (n - k);
t = effect[k];
effect[k] = effect[j];
effect[j] = t;
}
for(g = 0; g < n; g++) {
ef = effect[g];
//----------
switch(ef)
{
case 0:
view_flasher_5();
break;
case 1:
view_flasher_1();
break;
case 2:
view_flasher_2();
break;
case 3:
view_flasher_3();
break;
case 4:
view_flasher_4();
break;
}
}
view_flasher_0();
}; // ----------------------------- рабочая часть (end) ------------------------------------
} // ================= end main ======
//
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The End -=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
я новичок в программировании ... приведите рабочий пример в CVAVR попробую разобраться/ вникнуть /понять
да да eeprom пробывал получается... смущает одно атмега 8 китайская и сколько перезаписей она выдержит вопрос ... по этому вариант
при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении не хочу использовать
А мож у него DS1307 к МК прикошачен ?
нет не прикошачен
Спойлер
/*****************************************************#include <mega8.h>
#include <stdlib.h>
#include <delay.h>
unsigned char digit_out[5], // буфер экрана (нумерация от 0 до 4 разрядa)
cur_dig; // тек.высвечиваемый символ (позиция)
unsigned int speed,delit, // время кадра
h=1, // число повторов эффекта
yarkost=255; // яркость
static flash unsigned char digits[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// ---------------- Timer 2 overflow interrupt service routine -----------------------------
interrupt [TIM2_OVF] void timer2_ovf_isr(void){
PORTC&=0b00000000; // потушить все (разряды - off)
PORTD=~digits[digit_out[cur_dig]];
PORTC |= (1<<cur_dig); // засветить нужный разряд (бит знакоместа - on)
cur_dig++; if (cur_dig >= 5) {
cur_dig = 0;
OCR2 = yarkost;
}
}// ----------------------------------------------------------------------------------------
// ------------------ Timer2 output compare interrupt service routine ----------------------
interrupt [TIM2_COMP] void timer2_comp_isr(void){
PORTC&=0b00000000;
// PORTD=0b11111111;
}
// ------------------ случайная скорость эффекта ------------------------------------------
void view_speed(void) {
yarkost=255;
speed=rand()%4+1; // случайное число от 1 до 6
delit= rand()%100+80; // случайное число от 50 до 100
speed=speed*delit;
}
//-----------------------------------------------------------------------------------------
void yarkost_umenshit(void) {
while(yarkost>2)
{
yarkost--;
delay_ms(10);
}
}
// view_speed(); delay_ms(speed);
//-----------------------------------------------------------------------------------------
void view_flasher_0(void) {
int j;
for (j =0; j<h;++j){
yarkost=2;
digit_out[0] = 15;
digit_out[1] = 15;
digit_out[2] = 15;
digit_out[3] = 15;
digit_out[4] = 15;
while(yarkost<255)
{
yarkost++;
delay_ms(10);
}
delay_ms(400);
while(yarkost>2)
{ yarkost--;
delay_ms(10);
}
}
}
//-----------------------------------------------------------------------------------------
void view_flasher_1(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = {15,15,15,15,15};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A;
digit_out[1] = B;
digit_out[2] = C;
digit_out[3] = D;
digit_out[4] = E;
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
void view_flasher_2(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = {15,15,15,15,15};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A;
digit_out[1] = B;
digit_out[2] = C;
digit_out[3] = D;
digit_out[4] = E;
delay_ms(speed);
}
}
void view_flasher_3(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = {15,15,15,15,15};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
//----------------------------------------------------------------------------------------
void view_flasher_4(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = {15,15,15,15,15};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
void view_flasher_5(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = {15,15,15,15,15};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
//=================== main ==========
//основаня функция
void main(void){
int seed;
digit_out[0]=0; // очистить экран
digit_out[1]=0;
digit_out[2]=0;
digit_out[3]=0;
digit_out[4]=0;
srand(2); // устанавливаем стартовое значение - 4 541
//настройка портов
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000000; //порт С 4 первые по умолчанию 1
DDRC=0b00011111; //порт С 4 первые ноги на вывод
PORTD=0b00000000; //порт D по умолчанию все ноги на 0
DDRD=0b00001111; //порт D все ноги на вывод
TCCR2=0x04;
TIMSK=0b11000000;
// 0b11000001
// || | |
// || | Timer0
// || Timer1
// |Timer2
//
#asm("sei") // Глобальные прерывания включения
// -------------------------------- рабочая часть ------------------------------------------
while (1) {
int ef,t,g,j,k,n;
int effect[] = {0,1,2,3,4,5};
n = sizeof(effect) / sizeof(effect[0]);
for (k = 0; k < n - 1; k++)
{
j = rand()% (n - k);
t = effect[k];
effect[k] = effect[j];
effect[j] = t;
}
for(g = 0; g < n; g++) {
ef = effect[g];
//----------
switch(ef)
{
case 0:
view_flasher_5();
break;
case 1:
view_flasher_1();
break;
case 2:
view_flasher_2();
break;
case 3:
view_flasher_3();
break;
case 4:
view_flasher_4();
break;
}
}
view_flasher_0();
}; // ----------------------------- рабочая часть (end) ------------------------------------
} // ================= end main ======
//
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The End -=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
Serzh2000 писал(а):
функция вычисления CRC по алгоритму 1-wire
Вы можете взять любой, удобный Вам алгоритм. Хоть самый простой, типа обычной суммы.
я новичок в программировании ... приведите рабочий пример в CVAVR попробую разобраться/ вникнуть /понять
К чему эти извращения.
Код:
EEMEM uint8_t ee_seed;
randomSeed(eeprom_read_byte(&ee_seed));
eeprom_write_byte(&ee_seed, eeprom_read_byte(&ee_seed) + 1);
да да eeprom пробывал получается... смущает одно атмега 8 китайская и сколько перезаписей она выдержит вопрос ... по этому вариант
при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении не хочу использовать
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Попробуйте :Serzh2000 писал(а):приведите рабочий пример в CVAVR попробую разобраться/ вникнуть /понять
Код: Выделить всё
#define MAX_RAM 1024 // Размер ОЗУ
unsigned char crc = 0;
unsgned char *p_mem = (unsigned char*) 0;
for(int i=0; i<MAX_RAM; i++) crc += p_mem[i];
Re: CodeVision AVR в вопросах и ответах
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3989121#p3989121"]да да eeprom пробывал получается... смущает одно атмега 8 китайская и сколько перезаписей она выдержит вопрос ...[/uquote]
Офигеть! Тяжело, чтоль, посчитать?
Офигеть! Тяжело, чтоль, посчитать?
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: CodeVision AVR в вопросах и ответах
???Serzh2000 писал(а):
да да eeprom пробывал получается... смущает одно атмега 8 китайская и сколько перезаписей она выдержит вопрос ...
Офигеть! Тяжело, чтоль, посчитать?
да для профессионала наверно все просто ... для меня вообще не ясно что посчитать?
Попробуйте :
Код:
#define MAX_RAM 1024 // Размер ОЗУ
unsigned char crc = 0;
unsgned char *p_mem = (unsigned char*) 0;
for(int i=0; i<MAX_RAM; i++) crc += p_mem;
это отрывок кода из Atmel Studio , а я пишу в CVAVR... выдает ошибки
Спойлер
/*****************************************************This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : zvezda
Version : luchshaay
Date : 12.12.2018
Author : Serzh
Company :
Comments:
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
/* Движок в звезде от часов Danko, большое спасибо ему.
https://radiokot.ru/forum/viewtopic.php?f=57&t=21235 */
#include <mega8.h>
#include <stdlib.h>
#include <delay.h>
unsigned char crc = 0;
unsgned char *p_mem;
unsigned char digit_out[5], // буфер экрана (нумерация от 0 до 4 разрядa)
cur_dig; // тек.высвечиваемый символ (позиция)
unsigned int speed,ii,delit, // время кадра
h=1, // число повторов эффекта
yarkost=255; // яркость
static flash unsigned char digits[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// ---------------- Timer 2 overflow interrupt service routine -----------------------------
interrupt [TIM2_OVF] void timer2_ovf_isr(void){
PORTC&=0b00000000; // потушить все (разряды - off)
PORTD=~digits[digit_out[cur_dig]];
PORTC |= (1<<cur_dig); // засветить нужный разряд (бит знакоместа - on)
cur_dig++; if (cur_dig >= 5) {
cur_dig = 0;
OCR2 = yarkost;
}
}// ----------------------------------------------------------------------------------------
// ------------------ Timer2 output compare interrupt service routine ----------------------
interrupt [TIM2_COMP] void timer2_comp_isr(void){
PORTC&=0b00000000;
// PORTD=0b11111111;
}
// ------------------ случайная скорость эффекта ------------------------------------------
void view_speed(void) {
yarkost=255;
speed=rand()%4+1; // случайное число от 1 до 6
delit= rand()%100+80; // случайное число от 50 до 100
speed=speed*delit;
}
//-----------------------------------------------------------------------------------------
void yarkost_umenshit(void) {
while(yarkost>2)
{
yarkost--;
delay_ms(10);
}
}
// view_speed(); delay_ms(speed);
//-----------------------------------------------------------------------------------------
void view_flasher_0(void) {
int j;
for (j =0; j<h;++j){
yarkost=2;
digit_out[0] = 15;
digit_out[1] = 15;
digit_out[2] = 15;
digit_out[3] = 15;
digit_out[4] = 15;
while(yarkost<255)
{
yarkost++;
delay_ms(10);
}
delay_ms(400);
while(yarkost>2)
{ yarkost--;
delay_ms(10);
}
}
}
//-----------------------------------------------------------------------------------------
void view_flasher_1(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = {15,15,15,15,15};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A;
digit_out[1] = B;
digit_out[2] = C;
digit_out[3] = D;
digit_out[4] = E;
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
void view_flasher_2(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = {15,15,15,15,15};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A;
digit_out[1] = B;
digit_out[2] = C;
digit_out[3] = D;
digit_out[4] = E[i];
delay_ms(speed);
}
}
void view_flasher_3(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = {15,15,15,15,15};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
//----------------------------------------------------------------------------------------
void view_flasher_4(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = {15,15,15,15,15};
unsigned int E[] = { 0,0,0,0,0};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
void view_flasher_5(void) {
int i,j;
view_speed();
for (i =0; i<5;++i){
unsigned int A[] = { 0,0,0,0,0};
unsigned int B[] = { 0,0,0,0,0};
unsigned int C[] = { 0,0,0,0,0};
unsigned int D[] = { 0,0,0,0,0};
unsigned int E[] = {15,15,15,15,15};
digit_out[0] = A[i];
digit_out[1] = B[i];
digit_out[2] = C[i];
digit_out[3] = D[i];
digit_out[4] = E[i];
delay_ms(speed);
}
}
// ----------------------------------------------------------------------------------------
//=================== main ==========
//основаня функция
void main(void){
int seed;
digit_out[0]=0; // очистить экран
digit_out[1]=0;
digit_out[2]=0;
digit_out[3]=0;
digit_out[4]=0;
*p_mem = (unsigned char*) 0;
for(ii=0; ii<1024; ii++) crc += p_mem[ii];
//настройка портов
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000000; //порт С 4 первые по умолчанию 1
DDRC=0b00011111; //порт С 4 первые ноги на вывод
PORTD=0b00000000; //порт D по умолчанию все ноги на 0
DDRD=0b00001111; //порт D все ноги на вывод
TCCR2=0x04;
TIMSK=0b11000000;
// 0b11000001
// || | |
// || | Timer0
// || Timer1
// |Timer2
//
#asm("sei") // Глобальные прерывания включения
// -------------------------------- рабочая часть ------------------------------------------
while (1) {
int ef,t,g,j,k,n;
int effect[] = {0,1,2,3,4,5};
n = sizeof(effect) / sizeof(effect[0]);
for (k = 0; k < n - 1; k++)
{
j = rand()% (n - k);
t = effect[k];
effect[k] = effect[j];
effect[j] = t;
}
for(g = 0; g < n; g++) {
ef = effect[g];
//----------
switch(ef)
{
case 0:
view_flasher_5();
break;
case 1:
view_flasher_1();
break;
case 2:
view_flasher_2();
break;
case 3:
view_flasher_3();
break;
case 4:
view_flasher_4();
break;
}
}
view_flasher_0();
}; // ----------------------------- рабочая часть (end) ------------------------------------
} // ================= end main ======
//
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The End -=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//
Re: CodeVision AVR в вопросах и ответах
[uquote="Serzh2000",url="/forum/viewtopic.php?p=3989155#p3989155"]
да для профессионала наверно все просто ... для меня вообще не ясно что посчитать?[/uquote]
Ну вы ведь заявляете о проблеме! На основании чего? Выкладывайте. Или просто бла-бла-бла?
???Serzh2000 писал(а):
да да eeprom пробывал получается... смущает одно атмега 8 китайская и сколько перезаписей она выдержит вопрос ...
Офигеть! Тяжело, чтоль, посчитать?
да для профессионала наверно все просто ... для меня вообще не ясно что посчитать?[/uquote]
Ну вы ведь заявляете о проблеме! На основании чего? Выкладывайте. Или просто бла-бла-бла?
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: CodeVision AVR в вопросах и ответах
???Serzh2000 писал(а):
Цитата:
Serzh2000 писал(а):
да да eeprom пробывал получается... смущает одно атмега 8 китайская и сколько перезаписей она выдержит вопрос ...
Офигеть! Тяжело, чтоль, посчитать?
???
да для профессионала наверно все просто ... для меня вообще не ясно что посчитать?
Ну вы ведь заявляете о проблеме! На основании чего? Выкладывайте. Или просто бла-бла-бла?
спрошу еще раз
при каждом запуске программы rand() числа остаются одинаковыми. Генератор Псевдо Случайных Чисел использует единственное начальное значение.
мне нужно чтобы при запуске программы случайное число было случайным!!!
как это реализовать CVAVR? помогите.
- Вложения
-
- ZveZda.zip
- (979.1 КБ) 230 скачиваний
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
1. перед выключением сохранять случайное число, сгенерированное rand(), в EEPROM.
2. при включении вызывать srand(N), где N - то самое число (seed).
Помимо eeprom, число N в пункте 2 можно добыть и другими способами, про которые тут уже много рассказали:
- способ с вычитыванием всей памяти EEPROM и получением некоторой "контрольной" суммы).
- если есть RTC, можно из него брать текущее время в секундах в качестве seed.
2. при включении вызывать srand(N), где N - то самое число (seed).
Помимо eeprom, число N в пункте 2 можно добыть и другими способами, про которые тут уже много рассказали:
- способ с вычитыванием всей памяти EEPROM и получением некоторой "контрольной" суммы).
- если есть RTC, можно из него брать текущее время в секундах в качестве seed.



