Witam
Piszę swój pierwszy program na AT90S2313. Program ma za zadanie obsługiwać LCD. Problem się jednak pojawił na początku. Jeśli opóźnienie zostanie wywołane jako procedura:
zostaje ona całkowicie zignorowana:
Natomiast, jeśli się umieści w linii programu, to opóźnienie się pojawi dla dalszej części programu przestaje działać animacja kodu, koło kolejnych poleceń nie są stawiane kwadraciki, i nie widać, co jest wykonywane, a kod assemblerowy nie jest opisywany poleceniami języka C.
Czy wie ktoś, czym takie zachowanie symulatora jest spowodowane?
Zależy mi na VMLAB ze względu na oscyloskop i symulacje LCD - bardzo pomocne dla początkującego.
Z góry dziękuję za jakąkolwiek pomoc.
Powstały fragment programu wygląda tak:
Piszę swój pierwszy program na AT90S2313. Program ma za zadanie obsługiwać LCD. Problem się jednak pojawił na początku. Jeśli opóźnienie zostanie wywołane jako procedura:
void czekaj(void)
{
_delay_ms(10);
}
zostaje ona całkowicie zignorowana:
* my_idea.c, line 35: warning: statement with no effect
Natomiast, jeśli się umieści w linii programu, to opóźnienie się pojawi dla dalszej części programu przestaje działać animacja kodu, koło kolejnych poleceń nie są stawiane kwadraciki, i nie widać, co jest wykonywane, a kod assemblerowy nie jest opisywany poleceniami języka C.
Czy wie ktoś, czym takie zachowanie symulatora jest spowodowane?
Zależy mi na VMLAB ze względu na oscyloskop i symulacje LCD - bardzo pomocne dla początkującego.
Z góry dziękuję za jakąkolwiek pomoc.
Powstały fragment programu wygląda tak:
#define F_CPU 4000000
#include <c:\winavr\avr\include\util\delay.h>
#include <c:\winavr\avr\include\avr\io.h>
#include <c:\winavr\avr\include\avr\pgmspace.h>
#include <c:\winavr\avr\include\stdlib.h>
#include <c:\winavr\avr\include\avr\sfr_defs.h>
#define PRG_RDB(addr) pgm_read_byte(addr)
#define lcd_rs 2 //definicja bitu portu dla linii RS
#define lcd_e 3 //definicja bitu portu dla linii E
#define CR 0x0a //definicja znaku CR (przejście do nowej linii)
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //definicja cbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
void czekaj(void)
{
_delay_ms(10);
}
int main(void) //program główny
{
unsigned char i;
//>>>>>>>>>>>>>>>>>>>> konfigurowanie portów <<<<<<<<<<<<<<<<<<<<<<<<<<
PORTD=0xff; //port z podciąganiem
PORTB=0xff; //port z podciąganiem
DDRD=0xff; //PORTD - we
DDRB=0xff; //PORTB - wy
cbi(PORTD,lcd_rs);
sbi(PORTD,lcd_e);
czekaj; // ignorowane opóźnienie po włączeniu
// _delay_ms(5);
PORTB=0x30; // wysłanie komendy 0x30 po raz pierwszy
asm("nop"); // wydłużenie impulsu
asm("nop");
asm("nop");
cbi(PORTB,lcd_e); // impuls strobujący
_delay_ms(5); // opóźnienie po którym VMLAB nie pokazuje
cbi(PORTD,lcd_rs); //że wykonywane są na przykłąd te
sbi(PORTD,lcd_rs); //przykładowwe instrukcje
cbi(PORTD,lcd_rs);
sbi(PORTD,lcd_rs);
while(1)
{
}
}
