Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Другие темы раздела
ATmega AVR Написание простой программы https://www.cyberforum.ru/ avr/ thread2840177.html
Добрый вечер, необходимо написать программу для Attiny13 на С. К мк подключены 2 тактовые кнопки и 3 светодиода. При нажатии на 1 кнопку последовательно загораются светодиоды, при нажатии в этот...
Таймер в Atmega 328 не хочет считать до ICR1 (Toggle OC1A) ATmega AVR
Всем привет. Столкнулся с непониманием почему таймер не хочет работать в следующем режиме. Выставляю быстрый шим, далее выбираю изменение состояния пина при совпадении. А в WGM выбираю 14 режим, в...
Шум в линии питания от микроконтроллера ATmega328 ATmega AVR
Всем привет! Собираю схему, которая состоит из аналоговой и цифровой части и столкнулся с проблемой, что при подключении питания к микроконтроллеру, в схему идет сильный шум по линии питания. Так как...
ATmega AVR Загрузка прошивки через SPI и "Arduino as ISP" больше не доступна Здравствуйте. Прошивал Atmega328p через SPI и "Arduino as ISP", всё было хорошо до тех пор пока не прошил кодом в котором прошиваемый Atmega328p становился SPI мастером. С этих пор прошивамый МК... https://www.cyberforum.ru/ avr/ thread2837801.html
ATmega AVR Исследовать программную модель МК семейства (AVR) на примере реализации функции https://www.cyberforum.ru/ avr/ thread2831355.html
Приветствую всех, друзья! Помогите, пожалуйста, исследовать программную модель МК, семейства АVR на примере реализации функций y, где: x1, x2, const - двухбайтовые величины; способы адресации и...
ATmega AVR [Atmega16] Загорание светодиодов в зависимости от напряжения микроконтроллера
Здравствуйте, помогите пожалуйста написать код. Задание: Создайте схематическую диаграмму и программу с комментариями на C++ для 8-битного микроконтроллера Atmel AVR ATmega16, который реализует...
алгоритм включения двух АЦП ATmega AVR
я так понял запустить АЦП на AVR нужно по следующему алгоритму. 1) включаем АЦП 2) устанавливаем делитель 2,4,8.... 3) устанавливаем опорное напряжение питания или ареф 4) выбор ацп 0.1.2.3 и...
ATmega AVR Atmel Studio консольный проект? В Visual studio можно создать проект "Консольное приложение", которое позволяет после ввода некоторых функций сразу же выводить результат в окне консоли. Можно то же самое сделать в Atmel Studio 7? https://www.cyberforum.ru/ avr/ thread2827401.html
ATmega AVR Сложение чисел со знаком Atmega128 https://www.cyberforum.ru/ avr/ thread2825892.html
Необходимо реализовать следующее выражение: -260+1 в коде ассемблера для мк Atmega128 в программе MicroChip Studio 7. С ассемблером впервые познакомился сегодня, весь день ломал голову как это...
ATmega AVR Программа на микроконтроллере AtTiny 2313 Выводить на семисегментный индикатор текущую дату в формате ДД.ММ. а затем текущий год в формате ГГГГ. Время между сменами цифр на индикаторах -2 сек. https://www.cyberforum.ru/ avr/ thread2824612.html
ATmega AVR i2c, atmel studio undeclared порты и регистры. TWBR TWSR https://www.cyberforum.ru/ avr/ thread2822793.html
Всем привет! Развод... депресняк... на 2 года забросил проект, программирование в целом, и произошло нечто странное за это время, атмел студия не хочет узнавать регистры i2c, поооо ним, а так же по...
ATmega AVR МПСЗ на AVR Доброго времени суток, есть задача которую я сам себе и поставил, сделать микропроцессорное зажигания на ATMEGA8A для рядного 4-ех цилиндрового двигателя. В сети я нашел довольно мало проектов МПСЗ в... https://www.cyberforum.ru/ avr/ thread2820469.html
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
07.06.2021, 10:58  [ТС] 0

Компиляция программы генератора на ATMEGA8A - ATmega AVR - Ответ 15550304

07.06.2021, 10:58. Показов 2920. Ответов 89
Метки (Все метки)

Ответ

Там еще что-то с нумерацией таймеров (0 или 2 и название регистров), переход от 16-й к 8-й меге.

Добавлено через 18 минут
Плохо компилируется CopyStringtoLCD


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
...
 
//initialize Timer2 (used for button reading)
void Timer2_Init(void)
{
    TCNT2=0x00;
    sei();
}
//start timer2
void Timer2_Start(void)
{
 //     TIMSK|=(1<<CS22)|(1<<CS21);
//  TCCR2|=(1<<CS22)|(1<<CS21); //prescaller 256 ~122 interrupts/s
//  TIMSK|=(1<<TOV2);//Enable Timer0 Overflow interrupts     ?2
//  TIFR|=(1<<TOV2);//Enable Timer0 Overflow interrupts2
    
}
//stop timer 2
void Timer2_Stop(void)
{   //TCCR0?
//  TCCR2&=~((1<<CS22)|(1<<CS21)); //Stop timer0    ? 2
//  TIMSK&=~((1<<CS22)|(1<<CS21)); //Stop timer0    ?2
//  TIMSK&=~(1<<TOV2);//Disable Timer0 Overflow interrupts
   //   TIFR&=~(1<<TOV2);
}
 
 
 
...
void Menu_Update(uint8_t on)
{
    LCDclr();
//  int i=   (int)(SG.mode);
//  CopyStringtoLCD(  MENU[i], 0, 0 );
    
//  CopyStringtoLCD(  MENU[(SG.mode)], 0, 0 );
    
    LCDGotoXY(0, 1);
return; //для диагностики , так не "блуждает" по памяти, но не будет работать 
    
//  if (SG.mode==6){ CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf("    %5uHz", (uint16_t)SG.deltafreq); }
//  if (SG.mode==7){ CopyStringtoLCD(CLR, 0, 1 ); CopyStringtoLCD(RND, 0, 1 ); }
//  if (SG.mode==8){ CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uMHz", SG.HSfreq); }
//if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5))
//  { CopyStringtoLCD(CLR, 0, 1 ); LCDGotoXY(0, 1); printf(" %5uHz", (uint16_t)SG.freq); }
        
//  if (SG.mode!=6){ if(on==1) CopyStringtoLCD(MNON, 13, 1 );  else CopyStringtoLCD(MNOFF, 13, 1 ); }
}
Добавлено через 1 час 27 минут
test.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdint.h>
 
 #define RESOLUTION 0.095367431640625 //    1/10,48576
 #define NTICKS 10
 #define FCPU 16000000UL  //F4 2400
//  #define RESOLUTION  FCPU/NTICKS/2^24    16 777 216   (0x100 0000   1 0000 0000 0000 0000 0000 0000  ) (1<<24)
 
 //10=5*2
 //FCPU/10=FCPU/5/2=(FCPU>>1)/5
 
 //((FCPU>>1)/(5*  (1<<24))
 //((FCPU)/(10*  (1<<24)) 
 
 //2^n 2 << (n-1);
 //m-тую степень 2  n << m;
 
 //freq/ RESOLUTION
 //freq*10*(1<<24)/16000000
 //freq*10*(16777216)/16000000
 //freq*2*5*(16777216)/2*8000000           16000000
 //freq*5*(16777216)/8000000
//16000000/2^10 1 024=15625   10
 
// 2^10  --> (1<<10)
//(uint32_t) (((uint64_t)freq<<24)/(15625*(1<<10));
//(uint32_t) (((uint64_t)  freq<<(24-10))*10/(15625 );
//(uint32_t) (((uint64_t)  freq<<14 )*10/(15625 );  15625 =5^6
 
 
int main(void)
{
  
FILE *fp;
char name[80];
 
 
 
if((fp=fopen("data.txt", "w")) == NULL) {printf("Cannot open directory file."); exit(1);}
 for(int i=0; i<65536;i++)
{
int freq=(uint32_t)i;
 uint32_t phase=( uint32_t )freq/ RESOLUTION;
 
 //uint32_t ph1=(uint32_t) (((uint64_t)freq<<24)/1600000);
 
  uint32_t ph1= (uint32_t) ( (uint64_t) ((uint32_t) (freq<<15)) /3125) ;
  
  //uint32_t ph2= (uint32_t) ( (uint32_t) ((uint32_t) (freq<<15)) /3125) ;
  //3125=5^5 5 callings of the sub. dib by 5 
  uint32_t ph2= (uint32_t) ( (uint32_t) ((uint32_t) (freq<<15))   ) ;
  for(uint8_t i1=0; i1<5;i1++){    ph2/=5 ;      }
   
  
 
fprintf(fp,"f= %d    ph=%d    ph1(64bit)=%d   ph2(32bit)=%d \n",  (int) freq, (int) phase, (int) ph1,  (int) ph2);
 
 
 
}
fclose(fp);
return 0;
}
Добавлено через 46 минут
https://www.avrfreaks.net/foru... 16a?page=1

Добавлено через 13 минут
вариант тестовой программы с делением на 5 (медленно работает)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdint.h>
 
 #define RESOLUTION 0.095367431640625 //    1/10,48576
 #define NTICKS 10
 #define FCPU 16000000UL  //F4 2400
//  #define RESOLUTION  FCPU/NTICKS/2^24    16 777 216   (0x100 0000   1 0000 0000 0000 0000 0000 0000  ) (1<<24)
 
 //10=5*2
 //FCPU/10=FCPU/5/2=(FCPU>>1)/5
 
 //((FCPU>>1)/(5*  (1<<24))
 //((FCPU)/(10*  (1<<24)) 
 
 //2^n 2 << (n-1);
 //m-тую степень 2  n << m;
 
 //freq/ RESOLUTION
 //freq*10*(1<<24)/16000000
 //freq*10*(16777216)/16000000
 //freq*2*5*(16777216)/2*8000000           16000000
 //freq*5*(16777216)/8000000
//16000000/2^10 1 024=15625   10
 
// 2^10  --> (1<<10)
//(uint32_t) (((uint64_t)freq<<24)/(15625*(1<<10));
//(uint32_t) (((uint64_t)  freq<<(24-10))*10/(15625 );
//(uint32_t) (((uint64_t)  freq<<14 )*10/(15625 );  15625 =5^6
 
 
 
 
uint32_t  div_5( uint32_t N   )
{
int32_t Q=0;
int32_t R=(int32_t ) N; 
while(R>=0x0005){ Q++; R-=0x0005; }
//printf ("\nN=%ld R=%ld  Q=%ld  ",N,R,Q ); 
return  (uint32_t)Q;
}
 
 
 
 
 
 
 
int main(void)
{
  
FILE *fp;
char name[80];
 
 
 
if((fp=fopen("data.txt", "w")) == NULL) {printf("Cannot open directory file."); exit(1);}
 for(int i=0; i<65536;i++)
{
int freq=(uint32_t)i;
 uint32_t phase=( uint32_t )freq/ RESOLUTION;
 
 //uint32_t ph1=(uint32_t) (((uint64_t)freq<<24)/1600000);
 
  uint32_t ph1= (uint32_t) ( (uint64_t) ((uint32_t) (freq<<15)) /3125) ;
  
  //uint32_t ph2= (uint32_t) ( (uint32_t) ((uint32_t) (freq<<15)) /3125) ;
  //3125=5^5 5 callings of the sub. dib by 5 
  uint32_t ph2= (uint32_t) ( (uint32_t) ((uint32_t) (freq<<15))   ) ;
  for(uint8_t i1=0; i1<5;i1++){    ph2=div_5( ph2  ) ;      }
   
  
 
fprintf(fp,"f= %d    ph=%d    ph1(64bit)=%d   ph2(32bit)=%d \n",  (int) freq, (int) phase, (int) ph1,  (int) ph2);
 
 
 
}
fclose(fp);
return 0;
}
Добавлено через 39 минут
Еще один вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdint.h>
 
 #define RESOLUTION 0.095367431640625 //    1/10,48576
 #define NTICKS 10
 #define FCPU 16000000UL  //F4 2400
//  #define RESOLUTION  FCPU/NTICKS/2^24    16 777 216   (0x100 0000   1 0000 0000 0000 0000 0000 0000  ) (1<<24)
 
 //10=5*2
 //FCPU/10=FCPU/5/2=(FCPU>>1)/5
 
 //((FCPU>>1)/(5*  (1<<24))
 //((FCPU)/(10*  (1<<24)) 
 
 //2^n     2<<(n-1)    =    1<<n;
 //m-тую степень 2  n << m;
 
 //freq/ RESOLUTION=freq *10*(2^24)/ 16000000=freq *(2^24)/ 1600000
 //freq*10*(1<<24)/16000000
 //freq*10*(16777216)/16000000
 //freq*2*5*(16777216)/2*8000000           16000000
 //freq*5*(16777216)/8000000
//16000000/2^10    (or  1024) =15625   
 
// 2^10  --> (1<<10)
//(uint32_t) (((uint64_t)freq<<24)/(15625*(1<<10));
//(uint32_t) (((uint64_t)  freq<<(24-10))*10/(15625 );
//(uint32_t) (((uint64_t)  freq<<14 )*10/(15625 );  15625 =5^6
//(uint32_t) (((uint64_t)  freq<<14 )*2*5/(15625 /5);  15625 =5^6
 
 
 
uint32_t  div_5( uint32_t N   )
{
int32_t Q=0;
int32_t R=(int32_t ) N; 
while(R>=0x00000005){ Q++; R-=0x00000005; }
//printf ("\nN=%ld R=%ld  Q=%ld  ",N,R,Q ); 
return  (uint32_t)Q;
}
 
 
 
//uint32_t  div_10( uint32_t N   )
//{
//int32_t Q=0;
//int32_t R=(int32_t ) N; 
//while(R>=10UL){ Q++; R-=10UL; }
//printf ("\nN=%ld R=%ld  Q=%ld  ",N,R,Q ); 
//return  (uint32_t)Q;
//}
 
uint32_t  div_3125( uint32_t N   )
{
int32_t Q=0;
int32_t R=(int32_t ) N; 
while(R>=0x00000C35){ Q++; R-=0x00000C35; }
//printf ("\nN=%ld R=%ld  Q=%ld  ",N,R,Q ); 
return  (uint32_t)Q;
}
 
 
int main(void)
{
  
FILE *fp;
char name[80];
 
 
 
if((fp=fopen("data.txt", "w")) == NULL) {printf("Cannot open directory file."); exit(1);}
 for(int i=0; i<65536;i++)
{
int freq=(uint32_t)i;
 uint32_t phase=( uint32_t )freq/ RESOLUTION;
 
 //uint32_t ph1=(uint32_t) (((uint64_t)freq<<24)/1600000);
 
  uint32_t ph1= (uint32_t) ( (uint64_t) ((uint32_t) (freq<<15)) /3125) ;
  
  //uint32_t ph2= (uint32_t) ( (uint32_t) ((uint32_t) (freq<<15)) /3125) ;
  //3125=5^5 5 callings of the sub. dib by 5 
    uint32_t ph2= (uint32_t) ( (uint32_t) ((uint32_t) (freq<<15))   ) ;
    ph2=div_3125( ph2  );
 
 
 //   ph2=div_5( ph2  ) ;
 //   ph2=div_5( ph2  ) ;
 //   ph2=div_5( ph2  ) ;
 //   ph2=div_5( ph2  ) ;
 //   ph2=div_5( ph2  ) ;*/
 //  for(uint8_t i1=0; i1<5;i1++){    ph2=div_5( ph2  ) ;  }
 
 
 
fprintf(fp,"f= %d    ph=%d    ph1(64bit)=%d   ph2(32bit)=%d \n",  (int) freq, (int) phase, (int) ph1,  (int) ph2);
 
 
 
}
fclose(fp);
return 0;
}
Добавлено через 1 час 31 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void delay1s(void){ uint8_t i; for(i=0; i<100; i++){ _delay_ms(10); } }
 
//initialize Timer2 (used for button reading)
void Timer2_Init(void)
{
    TCNT2=0x00;
    sei();
} 
//start timer2
void Timer2_Start(void)
{
    TCCR2|=(1<<CS22)|(1<<CS21); //prescaller 256 ~122 interrupts/s
    //TIMSK|=(1<<TOV2);//Enable Timer2 Overflow interrupts
                  
    TIMSK |=  (1<<TOIE2);//Enable Timer2 Overflow interrupts
                  //   TIFR|=(1<<TOV2);//Enable Timer2 Overflow interrupts  
}
//stop timer 2
void Timer2_Stop(void)
{
 
 
        TIMSK &= ~(1<< TOIE2); //Disable Timer2 Overflow interrupts
    TCCR2&=~((1<<CS22)|(1<<CS21)); //Stop timer0
        
    //TIMSK&=~(1<<TOV2);//Disable Timer2 Overflow interrupts?
                         
         //TIFR|=(1<<TOV2);//Disable Timer2 Overflow interrupts
 
}
 
 
 
uint32_t  div_5( uint32_t N   )
{
int32_t Q=0;
int32_t R=(int32_t ) N; 
while(R>=0x00000005){ Q++; R-=0x00000005; }
return  (uint32_t)Q;
}
/*
uint32_t  div_3125( uint32_t N   )
{
int32_t Q=0;
int32_t R=(int32_t ) N; 
while(R>=0x00000C35){ Q++; R-=0x00000C35; }
return  (uint32_t)Q;
}
*/
 
void UpdateACC(void)
{
 
   //SG.acc=   SG.freq /RESOLUTION; 
SG.acc=  (uint32_t) ( (uint32_t) ((uint32_t) (SG.freq <<15))   ) ; 
//SG.acc=div_3125( SG.acc );
uint8_t i1;
for( i1=0; i1<5; i1++ ){    SG.acc=div_5( SG.acc  ) ;  }
 
 
 return;    
}
Добавлено через 1 минуту
VMLAB ,WinAVR плохо справляются с отладкой при PROGMEM .

Добавлено через 1 час 44 минуты
В Windows 10 плохо билдится с секциями
C++
1
2
3
4
5
6
const uint8_t squarewave[]  PROGMEM= 
//const uint8_t squarewave[] __attribute__ ((section ("MySection2")))/* PROGMEM*/= 
//const uint8_t squarewave[] __attribute__ ((section (".MySection2")))/* PROGMEM*/= 
{
...
}
если задать с адресов 0x01A0,0x01B0, 0x01C0, 0x01E0,0x01F0 по 256 байт (и с точкой1 и без ).

Добавлено через 1 минуту
С PROGMEM что-то получается, но в последнее время (после сервис-паков и обновлений винды ) стало глючить.

Добавлено через 1 минуту
Код
rm -rf main.o  proj1.elf dep/* proj1.hex proj1.eep proj1.lss proj1.map
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99                 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
avr-gcc -mmcu=atmega8 -Wl,-Map=proj1.map -Wl,-section-start=MySection1=0x3400 -Wl,-section-start=MySection2=0x3600 -Wl,-section-start=.MySection3=0x3800 -Wl,-section-start=.MySection4=0x3a00 -Wl,-section-start=.MySection5=0x3c00 -Wl,-section-start=.MySec
tion6=0x3e00 main.o     -o proj1.elf

avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  proj1.elf proj1.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex proj1.elf proj1.eep || exit 0
avr-objdump -h -S proj1.elf > proj1.lss
выдает но не размещает правильно в файле прошивки.

Добавлено через 1 минуту
Код
rm -rf main.o  proj1.elf dep/* proj1.hex proj1.eep proj1.lss proj1.map
Build succeeded with 0 Warnings...
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
avr-gcc -mmcu=atmega8 -Wl,-Map=main.map main.o     -o main.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  main.elf main.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex main.elf main.eep || exit 0
avr-objdump -h -S main.elf > main.lss

AVR Memory Usage
----------------
Device: atmega8

Program:    6748 bytes (82.4% Full)
(.text + .data + .bootloader)

Data:         99 bytes (9.7% Full)
(.data + .bss + .noinit)
для PROGMEM, но ,кажется, сбоит по выборке из на массивов

Вернуться к обсуждению:
Компиляция программы генератора на ATMEGA8A ATmega AVR
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2021, 10:58
Готовые ответы и решения:

Динамическая компиляция (компиляция программы в программе)
Привет форумчане, встретился с такой проблемой,мне в курсовой работе сказали сделать чтобы с...

Не могу понять почему выскакивает ошибка при компиляции программы для МК atmega8a
Уважаемые господа программисты. Помогите мне пожалуйста . С паяльником я дружу с 12 лет и восновном...

Разработка программы Генератора Псевдослучайной Последовательности
Всем привет! Есть задача: написать программу Генератора Псевдослучайной Последовательности (ГПСП)...

Генератор карты высот (часть программы-генератора G кода)
Наверное прийдётся сделать длинное вступление (все-же пишут чего и зачем, у кого сессия, у кого...

89
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.