|
|
  |
Изменение текста программы при смене компилятора и чипа |
|
|
|
Dec 18 2010, 14:40
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Скачал и установил всё как вы рекомендовали. Создаю новый проект-выбираю AVR GCC-пишу имя проекта-next-AVR simulator-ATtiny2113-finish набираю или вставляю текст проги кнопка старта дебуга неактивна а при компиляции ругается чё делать?????????
|
|
|
|
|
Dec 18 2010, 20:54
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Путь к проекту не должен содержать русских букв и, наверное,  пробелов.. Лично я ВСЕГДА стараюсь выполнять эти правила. Ещё где-то может вылезти ограничение на максимальную длину пути - поэтому не стоит заханыривать проект слишком далеко... Это всё так..перестраховочные правила дабы не было проблем.... Создайте проект заново без русского "проба" в пути и всё у вас будет хорошо. Это я проверил лично, создав такой-же проект как у Вас и получив в точности такую же ошибку ) Если где-то нужен пробел - используйте нижнее подчёркивание. "project_2" например. Файл, где описана функция main(), стараюсь всегда называть main.c Может быть и вам будет полезно/удобно...
--------------------
The truth is out there...
|
|
|
|
|
Dec 19 2010, 02:07
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
заработало,вот немного исправленный код и результаты компиляции CODE #include <stdint.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>
#define CD4094_PORT PORTB #define CD4094_DDR DDRB #define CD4094_PIN_DATA 3 #define CD4094_PIN_CLK 2 #define CD4094_PIN_STB 4 #define OnBit(address,bit) (address|=(1<<bit)) #define OffBit(address,bit) (address&=~(1<<bit))
volatile uint8_t TH; //определение переменных
void CD4094_CLK(void){ //дёргаем ногу clk для проталкивания битов по регистру OnBit(CD4094_PORT,CD4094_PIN_CLK); delay_ms(2); OffBit(CD4094_PORT,CD4094_PIN_CLK); }
void CD4094_STB(void){ //дёргаем ногу stb для поджига светодиодов OnBit(CD4094_PORT,CD4094_PIN_STB); delay_ms(2); OffBit(CD4094_PORT,CD4094_PIN_STB); }
void Shift_Reg(void){ //загрузка сдвигового регистра Shift_One_Byte(Led[0]);//загрузка байта в 1 регистр Shift_One_Byte(Led[1]);//загрузка байта во 2 регистр CD4094_STB(); //зажигаем светодиоды }
void Shift_One_Byte(uint8_t tmp){ //загрузка одного байта uint8_t i,dig; i=8; dig=Led[tmp]; while(i--){ if(dig&0x80){OnBit(CD4094_PORT,CD4094_PIN_DATA);} else{OffBit(CD4094_PORT,CD4094_PIN_DATA);} dig<<1; CD4094_CLK(); } }
uint16_t Analog(void){ //используем аналоговый компаратор для замера времени заряда кондёра OffBit(DDRB,0); //переводим 0 выход порта В в третье состояние OffBit(PORTB,0); TCNT0=0; //очистим счётчик-накопитель TH=0; TCCR0=2; //включаем таймер0 с пределителем CLK/8 OnBit(DDRB,7); //включить транзистор while(!(ACSR&(1<<5))); //ждём изменения состояния бита АСО на выходе компаратора TCCR0=0; //выключаем таймер OffBit(DDRB,7); //выключаем транзистор OnBit(DDRB,0); //разряжаем кондёр delay_ms(2); //время для разряда кондёра return(TH<<8 | TCNT0); //возвращаем результат замера времени }
ISR(TIMER0_OVF_vect){ //обработка прерывания таймера0 по переполнению //при переполнении 8-битного счётчика таймера увеличивать байт ТН на 1 TH++; }
void main(void){ // инициализация порта D //PD1-2 выход,уровень 0 //PD4-6 вход,подтягивающие резисторы включены PORTD=0x70; //установка битов порта D в 0 или 1 DDRD=0x06; //установка порта D на in или out DDRB=0x1C; //установка stb,data,clk на выход,уровень 0
while(1){ if (PIND6==0){ //если кнопка S0(см.схему) нажата OnBit(PORTD,2); //включить поворот (RUN) OffBit(PORTD,1); //реверс не включать } //цикл выполняется пока действительно условие if (PIND4==0){ //если кнопка S2 нажата OnBit(PORTD,2); //включить поворот OnBit(PORTD,1); //включить реверс(REV) } }
}
Цитата avr-gcc -mmcu=attiny2313 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT povorot1.o -MF dep/povorot1.o.d -c ../povorot1.c ../povorot1.c: In function 'CD4094_CLK': ../povorot1.c:19: warning: implicit declaration of function 'delay_ms' ../povorot1.c: In function 'Shift_Reg': ../povorot1.c:30: warning: implicit declaration of function 'Shift_One_Byte' ../povorot1.c:30: error: 'Led' undeclared (first use in this function) ../povorot1.c:30: error: (Each undeclared identifier is reported only once ../povorot1.c:30: error: for each function it appears in.) ../povorot1.c: At top level: ../povorot1.c:35: warning: conflicting types for 'Shift_One_Byte' ../povorot1.c:30: note: previous implicit declaration of 'Shift_One_Byte' was here ../povorot1.c: In function 'Shift_One_Byte': ../povorot1.c:38: error: 'Led' undeclared (first use in this function) ../povorot1.c:42: warning: statement with no effect ../povorot1.c: In function 'Analog': ../povorot1.c:52: error: 'TCCR0' undeclared (first use in this function) ../povorot1.c: At top level: ../povorot1.c:69: warning: return type of 'main' is not 'int' make: *** [povorot1.o] Ошибка 1 Build failed with 5 errors and 5 warnings... c:19-я не понял как мне задекларировать эту функцию?она же входит в util/delay. с:30-ну тут более или менее понятно с:35-что тут с типами не так? с:38-понятно с:42-эт почемуже? с:52-я так понимаю в начале нужно сделать типа TCCR0=0x00? с:69-так она ж вроде ничего не возвращает? И вопрос по двоичному индикатору.достаточно будет возвращаемое функцией Analog() 16 битное число протолкнуть в 2 регистра паровозиком?
|
|
|
|
|
Dec 19 2010, 03:47
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
открыть delay.h и глянуть, что там _delay_ms() - религия не позволяет? ) Цитата :30: warning: implicit declaration of function 'Shift_One_Byte' тут надо чтобы функция Shift_One_Byte была либо объявлена(прототип функции) либо уже реализована ДО вызова. Чтобы компилятор мог знать как организовать вызов(какие параметры функция принемает и что возвращает). А вот массив Led не объявлен вообще нигде  :35 исчезнет как только добавите прототип или переместите реализацию Shift_One_Byte() выше её первого использования. Цитата :42-эт почемуже? ну а результат куда? у вас в строке записано действие(сдвиг) но результат никуда не присваивается. надо dig<<=1; или dig = dig<<1; (для начинающего так более наглядно) Цитата с:52-я так понимаю в начале нужно сделать типа TCCR0=0x00? нет. это называется инициализация, а у вас рагается на undeclared - т.е. вообще не определен. Быстро пробежался по iotn2313.h и обнаружил там TCCR0A За подробностями надо в даташит лезть... но думаю, что это он и есть. Просто разные компиляторы и немного разные обозначения. Где-то они для удобства как в даташите, а где-то хрен знает как называются )) Цитата :69-так она ж вроде ничего не возвращает? Там, где есть куда возвращаться(типа "в операционку") - возврат из main таки передаёт значение "наверх", поэтому по стандарту main() должен возвращать int. В данной ситуации можно не обращать внимания на это...
--------------------
The truth is out there...
|
|
|
|
|
Dec 19 2010, 04:30
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(RW6MKA @ Dec 19 2010, 08:07)  И вопрос по двоичному индикатору.достаточно будет возвращаемое функцией Analog() 16 битное число протолкнуть в 2 регистра паровозиком? Да. Хорошо, что заработало. Увидите, сколько там граблей... По поводу delay_ms Код #define delay_ms(arg) _delay_ms(arg) Я так думаю, что раз Вы то там, то сям пишете, лучше настраиваться на стандартное название.
|
|
|
|
|
Dec 19 2010, 11:27
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Вот исправленный код CODE
#include <stdint.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>
#define CD4094_PORT PORTB #define CD4094_DDR DDRB #define CD4094_PIN_DATA 3 #define CD4094_PIN_CLK 2 #define CD4094_PIN_STB 4 #define OnBit(address,bit) (address|=(1<<bit)) #define OffBit(address,bit) (address&=~(1<<bit))
//определение переменных volatile uint8_t TH; uint8_t Led[2]; //объявление прототипов функций void CD4094_CLK(void); void CD4094_STB(void); void Shift_Reg(void); void Shift_One_Byte(uint8_t tmp); uint16_t Analog(void);
void main(void){ // инициализация порта D //PD1-2 выход,уровень 0 //PD4-6 вход,подтягивающие резисторы включены PORTD=0x70; //установка битов порта D в 0 или 1 DDRD=0x06; //установка порта D на in или out DDRB=0x1C; //установка stb,data,clk на выход,уровень 0
while(1){ if (PIND6==0){ //если кнопка S0(см.схему) нажата OnBit(PORTD,2); //включить поворот (RUN) OffBit(PORTD,1); //реверс не включать } //цикл выполняется пока действительно условие if (PIND4==0){ //если кнопка S2 нажата OnBit(PORTD,2); //включить поворот OnBit(PORTD,1); //включить реверс(REV) } }
}
void CD4094_CLK(void){ //дёргаем ногу clk для проталкивания битов по регистру OnBit(CD4094_PORT,CD4094_PIN_CLK); _delay_ms(2); OffBit(CD4094_PORT,CD4094_PIN_CLK); }
void CD4094_STB(void){ //дёргаем ногу stb для поджига светодиодов OnBit(CD4094_PORT,CD4094_PIN_STB); _delay_ms(2); OffBit(CD4094_PORT,CD4094_PIN_STB); }
void Shift_Reg(void){ //загрузка сдвигового регистра Shift_One_Byte(Led[0]);//загрузка байта в 1 регистр Shift_One_Byte(Led[1]);//загрузка байта во 2 регистр CD4094_STB(); //зажигаем светодиоды }
void Shift_One_Byte(uint8_t tmp){ //загрузка одного байта uint8_t i,dig; i=8; dig=Led[tmp]; while(i--){ if(dig&0x80){OnBit(CD4094_PORT,CD4094_PIN_DATA);} else{OffBit(CD4094_PORT,CD4094_PIN_DATA);} dig=dig<<1; CD4094_CLK(); } }
uint16_t Analog(void){ //используем аналоговый компаратор для замера времени заряда кондёра OffBit(DDRB,0); //переводим 0 выход порта В в третье состояние OffBit(PORTB,0); TCNT0=0; //очистим счётчик-накопитель TH=0; TCCR0A=2; //включаем таймер0 с пределителем CLK/8 OnBit(DDRB,7); //включить транзистор while(!(ACSR&(1<<5))); //ждём изменения состояния бита АСО на выходе компаратора TCCR0A=0; //выключаем таймер OffBit(DDRB,7); //выключаем транзистор OnBit(DDRB,0); //разряжаем кондёр _delay_ms(2); //время для разряда кондёра return(TH<<8 | TCNT0); //возвращаем результат замера времени }
ISR(TIMER0_OVF_vect){ //обработка прерывания таймера0 по переполнению //при переполнении 8-битного счётчика таймера увеличивать байт ТН на 1 TH++; }
Компил ругается только на main() Подскажите как теперь правильно реализовать чтение датчика и индикацию?Во время цикла проверки нажатия кнопок или можно после опроса кнопок?
|
|
|
|
|
Dec 19 2010, 14:11
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Вот с помощью этого кода пытался узнать тики.К выходам регистров подключены светодиоды.Чтото не фурычит.Что не так? CODE #include <stdint.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>
#define CD4094_PORT PORTB #define CD4094_DDR DDRB #define CD4094_PIN_DATA 3 #define CD4094_PIN_CLK 2 #define CD4094_PIN_STB 4 #define OnBit(address,bit) (address|=(1<<bit)) #define OffBit(address,bit) (address&=~(1<<bit))
//объявление прототипов функций void CD4094_init(void); void CD4094_CLK(void); void CD4094_STB(void); void Shift_Reg(void); void Shift_One_Byte(uint16_t dig); uint16_t Analog(void);
//определение переменных volatile uint8_t TH; uint16_t tik;
void main(void){ while(1){ sei(); tik=Analog(); CD4094_init(); Shift_Reg(); } }
void CD4094_init(void){ //инициализация регистров uint16_t i; for(i=0;i<16;i++){OffBit(CD4094_PORT,CD4094_PIN_DATA) ; CD4094_CLK(); } }
void CD4094_CLK(void){ //дёргаем ногу clk для проталкивания битов по регистру OnBit(CD4094_PORT,CD4094_PIN_CLK); OffBit(CD4094_PORT,CD4094_PIN_CLK); }
void CD4094_STB(void){ //дёргаем ногу stb для поджига светодиодов OnBit(CD4094_PORT,CD4094_PIN_STB); OffBit(CD4094_PORT,CD4094_PIN_STB); }
void Shift_Reg(void){ //загрузка сдвигового регистра Shift_One_Byte(tik);//загрузка 2 байтов в регистр CD4094_STB(); //зажигаем светодиоды }
void Shift_One_Byte(uint16_t tik){ //загрузка одного байта uint16_t i=16; uint16_t dig=tik; while(i--){ if(dig&0x8000){OnBit(CD4094_PORT,CD4094_PIN_DATA);} else{OffBit(CD4094_PORT,CD4094_PIN_DATA);} dig<<=1; CD4094_CLK(); } }
uint16_t Analog(void){ //используем аналоговый компаратор для замера времени заряда кондёра OffBit(DDRB,0); //переводим 0 выход порта В в третье состояние OffBit(PORTB,0); TCNT0=0; //очистим счётчик-накопитель TH=0; TCCR0A=2; //включаем таймер0 с пределителем CLK/8 OnBit(DDRB,7); //включить транзистор while(!(ACSR&(1<<ACO))); //ждём изменения состояния бита АСО на выходе компаратора TCCR0A=0; //выключаем таймер OffBit(DDRB,7); //выключаем транзистор OnBit(DDRB,0); //разряжаем кондёр _delay_ms(2); //время для разряда кондёра return(TH<<8 | TCNT0); //возвращаем результат замера времени }
ISR(TIMER0_OVF_vect){ //обработка прерывания таймера0 по переполнению //при переполнении 8-битного счётчика таймера увеличивать байт ТН на 1 TH++; }
|
|
|
|
|
Dec 19 2010, 14:43
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Поймите вы меня, мил человек, я вам помогаю, но я не хочу делать за вас всю работу. Тем более, что я ощущаю у вас некоторое нежелание реально разбираться и работать... ну сяду я сейчас и что я буду делать? А то-же, что и вы должны сделать, чтобы понять что не так: буду сначала думать что нужно было бы сделать(какие сигналы куда зачем и с какими задержками) и как оно реально получается тут у вас...... Цепляйте там у себя в протеусе пробники на каждую ногу - смотрите форму сигналов...думайте соответствует ли она требуемой... отлаживайте! ) всё для этого у вас есть. )
Не хотите вы своей головой думать. Вставляете чужой говнокод в проект. Копируете чужие косяки - дело Ваше ))
Я предлагаю начать с малого. Освоиться заодно и с протеусом...проверить, может он ваще мышей не ловит или тачка у вас слабая и там всё жутко тормозит... потом подумать и шаг за шагом реализовать свои функции для работы с регистрами вашими.. Так оно и помогать то будет приятней, когда человек разбирается, а не чужой говнокод правит )
--------------------
The truth is out there...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|