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

работа с VM LAB

есть система тестирования проги 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-й команды

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

 

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

 

код скомпилирован (=> ошибок нет :rolleyes: )

 

 

// 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

}

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


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

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

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

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

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

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

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

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

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

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