Перейти к содержанию

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

COKPOWEHEU, научи создавать проекты на avrstudio (winavr), а то тут после иара немного не понятно что оно хочет. множественное определение.

Есть файлы main.c, uart,c и uart.h

в майне заинклуден uart.h, в uart.c тоже есть инклуд этого uart.h.

при этом в uart.h создаю глобальную переменную и что ожидаемо пишет множественное определение. если в одном из файлов убрать инклуд, то эту переменную естественно перестает видеть в этом файле (либо man.c либо uart.c). как заставить работать их вместе? пробовал через extern, volatile, static, не хочет.

9999999.jpg

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

file1.c

#include "file1.h"
int x;
int incx(){return x++;}

file1.h

extern int x;

file2.c

#include "file1.h"
int main(){
x=0;
return 0;
}

Вроде так надо делать

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Покажите весь код, вдруг и правда объявили переменную в обоих файлах

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

вот то и весь код. я же не убрал случайно строчку когда делал снимок экрана.

тем более я с этим столкнулся в другом проекте, и чтобы минимизировать поиски создал пустой проект.

может компилятор выпендривается.

если что, проект приложу.

Ссылка на комментарий
Поделиться на другие сайты

Что это за странная структура USARTC1? Она нигде не объявлена.

Перенесите объявления переменных из uart.h в uart.c, а в uart.h объявите ее как extern. Примерно как в моем примере.

И еще раз прошу показать весь код, переделанный с учетом примера.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

http://files.webfile...13811fa22db87f8

UARTC это не структура, это регистры в Xmege.

да я уже вертел как угодно. что-то у меня не то с winavr.

Изменено пользователем __alexander
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Можно ли с помощью sizeof(mas)/sizeof(mas[0]) определить размер массива mas, расположенного во flash?

const PROGMEM unsigned char mas = {132, 141, 141, 139, 141};
int n = sizeof(mas)/sizeof(mas[0]);

Изменено пользователем Vezd
Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, компилирую код в Avr Studio 6


struct{
uint8_t ready_to_display:1;
uint8_t start_sensors:1;
uint8_t unusedBits:6;
} flags;

/***************/
InitALL();

unsigned char twiMsgBuf[TWI_BUFFER_SIZE];
char str_buf[16];
uint8_t display_count=0,i,k;
while(1)
{
  if(flags.ready_to_display){
      for(i=0;i<BATT_NUM;i++){
           lcdClear();
           lcdGotoXY(0,0);
           sprintf(str_buf,"BATT %d",i+1);
           lcdPuts(str_buf);

А в ассемблере получаю

InitALL();
00000429 CALL 0x00000336 Call subroutine
0000042B LDS R24,0x0167 Load direct from data space
uint8_t display_count=0,i,k;
0000042D CLR R7 Clear Register
0000042E MOVW R16,R28 Copy register pair
0000042F SUBI R16,0xFF Subtract immediate
00000430 SBCI R17,0xFF Subtract immediate with carry
00000431 LDI R25,0x0D Load immediate
00000432 MOV R4,R25 Copy register
00000433 LDI R25,0x01 Load immediate
00000434 MOV R5,R25 Copy register
00000435 LDI R18,0x15 Load immediate
00000436 MOV R8,R18 Copy register
00000437 LDI R18,0x01 Load immediate
00000438 MOV R9,R18 Copy register
00000439 LDI R19,0x30 Load immediate
0000043A MOV R12,R19 Copy register
--- I:\AVR6_Projects\MeasuringModule\MainController\MainController\Debug/.././MainController.c
0000043B LDI R19,0x01 Load immediate
0000043C MOV R13,R19 Copy register
0000043D LDI R20,0x49 Load immediate
0000043E MOV R10,R20 Copy register
0000043F LDI R20,0x01 Load immediate
00000440 MOV R11,R20 Copy register
sprintf(str_buf,"BATT %d",i+1);
00000441 LDI R21,0x01 Load immediate
00000442 MOV R14,R21 Copy register
00000443 MOV R15,R1 Copy register
 sprintf(str_buf,"v%d=%f",k+2,volt_result[i][k+1]);
00000444 LDI R22,0x02 Load immediate
00000445 MOV R2,R22 Copy register
00000446 MOV R3,R1 Copy register
if(flags.ready_to_display){
00000447 SBRC R24,0 Skip if bit in register cleared
00000448 RJMP PC+0x0062 Relative jump
if(flags.start_sensors){
00000449 SBRS R24,1 Skip if bit in register set

это условие "if(flags.ready_to_display){" игнорируется

Изменено пользователем CTIGRA
Ссылка на комментарий
Поделиться на другие сайты

Игнорируется потому что переменная не меняется после инициализации - компилятор ее заоптимизировал. Если переменная планируется в обработчике, volatile поможет. В других случаях условие само появится, если будет нужно конечно.

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

А с чего вы взяли что условие игнорируется?

if(flags.ready_to_display){

00000447 SBRC R24,0 Skip if bit in register cleared

00000448 RJMP PC+0x0062 Relative jump

Если бит равен 1, то идет скачок на подпрограмму. Смотрите что там

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Подскажите пожалуйста, не понимаю почему в протеусе начинает мигать Wait data... на дисплее после добавления в код функции

TWI_Start_Transceiver_With_Data(twiMsgBuf,2);

несмотря на то что контроллер даже по I2C не подключен, а запись на дисплей Wait data... происходит при инициализации - один раз

proj.rar

Изменено пользователем CTIGRA
Ссылка на комментарий
Поделиться на другие сайты

Код смотреть некогда, но вероятно, потому что функция где то зависает в вечном цикле ожидая какого либо флага от twi, а мигает - скорее всего потому что ресетится контроллер, по причине сторожевого таймера либо еще какой... Учитесь пользоваться мощнейшими средствами отладки, которые предоставляет Протеус - шагайте по программе, смотрите переменные, делайте точки останова и прочее. Загружать в МК хекс файл в Протеусе при живом проекте... ну это как смотреть кино в сварочной маске...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Отключил собачий таймер - wdt_disable();

не помогло.

В отладчике у меня не получается поймать момент ресета...

Остается только гадать, мб вот так неправильно делать?

do{
 twiMsgBuf[0]=(volt_sensors_addrs[i]<<TWI_ADR_BITS)|(0<<TWI_READ_BIT);
 twiMsgBuf[1]=I2C_TX_VOLT_REQUEST;
 TWI_Start_Transceiver_With_Data(twiMsgBuf,2);

 while(TWI_Transceiver_Busy());
/***********/
}while(!TWI_statusReg.lastTransOK);

Ссылка на комментарий
Поделиться на другие сайты

При отладке и коду видно, что библиотека включает прерывания по TWI.

void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize )
{
 unsigned char temp;

 while ( TWI_Transceiver_Busy() );			 // Wait until TWI is ready for next transmission.

 TWI_msgSize = msgSize;					    // Number of data to transmit.
 TWI_buf[0]  = msg[0];						 // Store slave address with R/W setting.
 if (!( msg[0] & (TRUE<<TWI_READ_BIT) ))	   // If it is a write operation, then also copy data.
 {
   for ( temp = 1; temp < msgSize; temp++ )
  TWI_buf[ temp ] = msg[ temp ];
 }
 TWI_statusReg.all = 0;	  
 TWI_state		 = TWI_NO_STATE ;
 TWCR = (1<<TWEN)|							 // TWI Interface enabled.
	 (1<<TWIE)|(1<<TWINT)|				  // Enable TWI Interupt and clear the flag.
	 (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|	   // Initiate a START condition.
	 (0<<TWWC);							 //
}

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

00000000 <__vectors>:
 0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end>
 4: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 8: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 10: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 14: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 18: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 1c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 28: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 2c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 30: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 34: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 38: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 3c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 40: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 44: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 48: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 4c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 50: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 54: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 58: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 5c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 60: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
 64: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>

....
000000a2 <__bad_interrupt>:
 a2: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>

Возможно в какой-то момент происходит прерывание по событию spi, дальше путь такой: вектор-заглушка-начало программы. Проверить просто - нужно добавить обработчик прерывания по twi, хотя бы пустой.

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Спасибо! Странно что оно компилилось, учитывая что в коде есть

ISR(TWI_vect)
{

Я вобще недавно начал работать с Avr Studio 6, нормально что отладчик не дает мне флаг прерывания установить? Тоесть я тыкаю по флагу (прерывания включены, в SREG в том числе) TWI или ADC неважно, на следующем шаге флаг сам сбрасывается и ничего не происходит...

Ссылка на комментарий
Поделиться на другие сайты

ISR(TWI_vect) в модуле twi есть, но похоже компилятор не понимает что это обработчик и считает что это обычная функция. Почему так, если нет прототипа в хидере, х/з.. В листинге код обработчика есть, но оформлен он в виде обычной функции и на него вроде нет переходов (оптимизация выключена?). Можно попробовать в модуль TWI_Master.c добавить #include <avr/interrupt.h>, по идее должен тогда понять что это обработчик. Насчет отладчика не знаю - студийным никогда не пользовался.

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

"#include <avr/interrupt.h>"

Вот это вроде помогло, во всяком случае в протеусе видно что статусы TWI меняются - значит на вектор переходитю

Оптимизацию я разную пробовал, сейчас везде -Os поставил

А каким вы отладчиком пользуетесь?

Изменено пользователем CTIGRA
Ссылка на комментарий
Поделиться на другие сайты

Т.е. не мигает больше? Отладка - под протеусом, для авр. Для stm - отладочные железки, но честно говоря, поменял бы их на протеус, если б там были эти камни. В нем видно все...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

а как быть если у меня два контроллера и два проекта прошивок? Протеус не видит исходник если его проект лежит в разных папках с мхкодниками прошивки..?

Ссылка на комментарий
Поделиться на другие сайты

Каждому контроллеру задается индивидуальный эльф, где они лежат не важно. Правой кнопкой на кортроллер -> Program_file -> выбираете нужного эльфа. Или *.obj если на асме писали. Или *.hex если мазохист.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...