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

AT90S2313-10PI(пробелема с получением данных по...

хорошо прогу написал и после урезания жрет 47% of DEVICE... вот код:

 

// Programm by G14 POWER aka Mejia

// ICC-AVR application builder : 11.03.2002 20:01:52

// Target : 2313

// Crystal: 3.6864Mhz

 

//poluchaem 4 char s kompa, analiziruem pervie 1 bait, zdes lejit kod komandi

//2 bait - sotni

//3 bait - desatki

//4 bait - edinici

 

//ZADACHA: ZASTAVIT SVETODIODI MORGAT :) s kompa konechno cherez

//COM PORT

 

// 8 svetodiodov s kompa formiruut (4 baita) komandu

//naprimer vse svetodiodi zashisheni to eto 0255

//1 bait =0000

//2 bait=2

//3=2

//4=5

 

 

 

#include <io2313v.h>

#include <macros.h>

 

 

 

//////////////////////////

/// global peremennie

 

unsigned int temp; // vsegda ponadobitsa

char prinataya_stroka; // zdes xranitsa chislo SOTNI,DESATKI,EDINICI

char counter; // schetchik bitov

char komanda; //zdes xranitsa komanda

char nojkas[]={0,1,2,3,4,5,6,7}; //zdes nomera nojek

char x[4]; //ves massiv polucenii iz COM

 

//////////////////////////

/// prototipi functii

 

void port_init(void); // initializatia porta

void uart0_init(void); // init baud rate for komp

void int0_isr(void);

void init_devices(void);

 

 

void svetodiodon(char nojka); //vkluchaet svetodiod

void svetodiodoff(char nojka); //vikluchaet svetodiod

 

 

void main(void)

{

init_devices();

 

while(1);

 

 

}

char cou=0;

// getting short int from COM PORT

#pragma interrupt_handler get_result:8

void get_result()

{

x[cou]=UDR;cou++;

if (cou==4) {cou=0;}

}

 

void sort()

{

//poluchaet pachku bait nado preobrazovat etu xnu v short int

// v RXD -doljno bit podrad 4 baita poslanie s kompa

// 0-bait, kod

// 1-sotni

// 2-desatki

// 3-edinici

 

//x[0]=RXD;// 1 bait // kod

//x[1]=RXD;// 2 bait

//x[2]=RXD;// 3 bait

//x[3]=RXD;// 4 bait

 

// nujno temp= 0000xxxxyyyyzzzzpppp

// ^^^^ - kod operacii

// dopustim mi polucili 0123 nado preobr v verhnee

 

short int temprez; //zdes vremenie resultati

short int temp;

itoa(&x[0],temp,10); // v a xranitsa maska bitov

komanda=temp;

 

 

itoa(&x[1],temprez,10); // v a xranitsa maska bitov

temprez=temprez*100;

temp=temp+temprez;

itoa(&x[2],temprez,10); // v a xranitsa maska bitov

temprez=temprez*10;

temp=temp+temprez;

itoa(&x[3],temprez,10); // v a xranitsa maska bitov

temp=temp+temprez; //krainie levie 4 razrada ne smogut zateretsa :)

prinataya_stroka=temp;//zdes vixodnoya stroka

work();

}

// sama rabota

void work()

{

// komanda =x[0];

char i;

short int soderjimoe; // soderjimoe komandi

 

 

 

//prinataya_stroka = chislo, naprimer (3 baita iz soobshenia)

if (komanda==0)

{

 

char b; //vremenno xranitsa char chtob udobnee bilo

 

for (i=0;i<8;i++)

{

b=prinataya_stroka;

b<<=i;

b>>=i;

if (b==1) svetodiodon(nojkas);

if (b==0) svetodiodoff(nojkas);

}

 

}

// if (komanda==1) {dvigatel;}

// if (komanda==2) {ventilator;}

 

 

 

}

////////////////////////////////////////////////

void svetodiodon(char nojka)

{

PORTB &=~BIT (nojka);

}

void svetodiodoff(char nojka)

{

PORTB ^= BIT (nojka);

}

 

 

//////////////////////////////////////////////////////////////

 

void port_init(void)

{

DDRB =0xFF; //init port B na vixod

PORTB = 0xFF; //vkl all

PORTD = 0x00; //port vkl

DDRD = 0x00; //vse na vxod

}

 

//call this routine to initialise all peripherals

 

void init_devices(void)

{

CLI();

 

port_init();

uart0_init();

 

MCUCR = 0x00;

GIMSK = 0x00;

TIMSK = 0x00;

 

SEI();

 

}

 

//UART0 initialisation

// desired baud rate: 9600

// actual: baud rate:9600 (0,0%)

//

void uart0_init(void)

{

UCR = 0x00; //disable while setting baud rate

UBRR = 0x17; //set baud rate

UCR = 0x08; //enable

}

 

 

 

...........................

так что спасибо, осталась проблемка не касающаяся кодинга....

есть система тестирования проги VMLAB называется, наверное ее все знают, вообщем я по совету документов создал такой файл: nemesis.prj:

 

.MICRO "AT90S2313"

.POWER VDD=5 VSS=0

.CLOCK 4meg

.PROGRAM "nemesis.hex"

 

 

D1 VDD PB0

D2 VDD PB1

D3 VDD PB2

D4 VDD PB3

D5 VDD PB4

D6 VDD PB5

D7 VDD PB6

D8 VDD PB7// диоды с 1 по 7

////

 

естествеено присобачиваю файл nemesis.hex

 

нажимаю F9 пишет:

Success! All ready to run в коде макере

 

...

 

но при запуске программы (f5 или Traceinto(f7)

пишет:

 

Starting hardware-software co-simulation...

[PC = $0013, Time = 0.51 ms, {MEM}]: Attempt to write in an forbidden position

 

 

... я так понимаю прога дохнет когда програмный счетчик доходит до 13-й команды

, но че он хочет этим сказать не понимаю :smile3046:

 

можете объяснить багу?

Поделиться сообщением


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

осталась проблемка не касающаяся кодинга....

А что, это все работает? Не верю!! :w00t:

Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же:

1) что-то не могу уловить, где вызываются функции sort() и work();

2)

short int temp;

itoa(&x[0],temp,10); // v a xranitsa maska bitov

komanda=temp;

всегда думал, что itoa преобразует число в строку(Int TO Alpha)...

или в ICC наоборот? тогда сорри! :blink:

В нормальном С строку в число преобразует atoi (в CodeVision например есть int atoi(char *str), IСС сейчас не пользуюсь, было дело несколько лет назад, но кряка к trial-версии не нашлось, пришлось выкинуть)

думаю, было бы что-то вроде

x[4]=0; // чтоб atoi знал, где конец строки, объявлять надо char х[5]

prinataya_stroka=atoi(x+1); // раскодируем начиная с х[1]

а команда, если это тоже число в формате ASCII

komanda=x[0]&0x0F; // стирает 3 из старшей тетрады

см. также 5)

 

3)

for (i=0;i<8;i++)

{

b=prinataya_stroka;

b<<=i;

b>>=i;

if (b==1) svetodiodon(nojkas);

if (b==0) svetodiodoff(nojkas);

}

:huh: :ohmy: :mellow:

трудно даже проанализировать, когда выполняютя условия b==1, b==0...

Давайте на примере:

представим, что "принятая строка"=11100001.

і=0: после b<<=i; b>>=i; получаем b=11100001, ничего не происходит

і=1: b=01100001, ничего не происходит

i=2: b=00100001, ничего не происходит

i=3: b=00000001, зажигается светодиод №3

i=4: b=00000001, зажигается светодиод №4

i=5: b=00000001, зажигается светодиод №5

i=6: b=00000001, зажигается светодиод №6

i=7: b=00000001, зажигается светодиод №7

итог: хотели зажечь 11100001, зажгли 00011111 :(

 

Вопрос: почему бы не написать просто

PORTB=prinataya_stroka ???

 

4)

void svetodiodon(char nojka)

{

PORTB &=~BIT (nojka);

}

кажется, выключает, а не включает

void svetodiodoff(char nojka)

{

PORTB ^= BIT (nojka);

}

^ - операция "исключающее ИЛИ", т.е. светодиод не выключается, а меняет состояние на противоположное

 

5) Кстати, а нельзя сразу с компьютера посылать 1 байт, кодирующий, чего включить и выключить, вместо того чтобы посылать 3, а потом их разгребать?

 

6)

void get_result()

{

x[cou]=UDR;cou++;

if (cou==4) {cou=0;}

}

warning :) : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта

Поделиться сообщением


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

осталась проблемка не касающаяся кодинга....

А что, это все работает? Не верю!! :w00t:

Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же:

1) что-то не могу уловить, где вызываются функции sort() и work();

2)

short int temp;

itoa(&x[0],temp,10); // v a xranitsa maska bitov

komanda=temp;

всегда думал, что itoa преобразует число в строку(Int TO Alpha)...

или в ICC наоборот? тогда сорри! :blink:

В нормальном С строку в число преобразует atoi (в CodeVision например есть int atoi(char *str), IСС сейчас не пользуюсь, было дело несколько лет назад, но кряка к trial-версии не нашлось, пришлось выкинуть)

думаю, было бы что-то вроде

x[4]=0; // чтоб atoi знал, где конец строки, объявлять надо char х[5]

prinataya_stroka=atoi(x+1); // раскодируем начиная с х[1]

а команда, если это тоже число в формате ASCII

komanda=x[0]&0x0F; // стирает 3 из старшей тетрады

см. также 5)

 

3)

for (i=0;i<8;i++)

{

b=prinataya_stroka;

b<<=i;

b>>=i;

if (b==1) svetodiodon(nojkas);

if (b==0) svetodiodoff(nojkas);

}

:huh: :ohmy: :mellow:

трудно даже проанализировать, когда выполняютя условия b==1, b==0...

Давайте на примере:

представим, что "принятая строка"=11100001.

і=0: после b<<=i; b>>=i; получаем b=11100001, ничего не происходит

і=1: b=01100001, ничего не происходит

i=2: b=00100001, ничего не происходит

i=3: b=00000001, зажигается светодиод №3

i=4: b=00000001, зажигается светодиод №4

i=5: b=00000001, зажигается светодиод №5

i=6: b=00000001, зажигается светодиод №6

i=7: b=00000001, зажигается светодиод №7

итог: хотели зажечь 11100001, зажгли 00011111 :(

 

Вопрос: почему бы не написать просто

PORTB=prinataya_stroka ???

 

4)

void svetodiodon(char nojka)

{

PORTB &=~BIT (nojka);

}

кажется, выключает, а не включает

void svetodiodoff(char nojka)

{

PORTB ^= BIT (nojka);

}

^ - операция "исключающее ИЛИ", т.е. светодиод не выключается, а меняет состояние на противоположное

 

5) Кстати, а нельзя сразу с компьютера посылать 1 байт, кодирующий, чего включить и выключить, вместо того чтобы посылать 3, а потом их разгребать?

 

6)

void get_result()

{

x[cou]=UDR;cou++;

if (cou==4) {cou=0;}

}

warning :) : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта

 

:smile3009: убил :) полностью согласен, но для этого и хотел работать с VMLAB чтобы можно было протестировать, что когда случается..... в дебаггере...

 

в итоге я прогу сократил до

void main()

{

while (1);

}

 

всеравно бага... так что щас рыскаю по серверам чтобы найти реальное описание к VM лабу.... :maniac:

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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