Proteus CodeVision problema?

G

Gigica

Guest
Ciao, ho un problema con la simulazione di Proteus c LCD con codice compilato con CodeVision.Qui c è schematico e codice.Codice:/************************************************* ****

Questo programma è stato prodotto dalla

CodeWizardAVR V1.25.3 Professional

Programma Generatore automatico

© Copyright 1998-2007 Pavel Haiduc, HP InfoTech srl

http://www.hpinfotech.comTipo di chip: AT90S2313

Frequenza di clock: 8.000000 MHz

Memoria modello: Tiny

SRAM dimensioni esterne: 0

I dati dello stack size: 32

************************************************** *** /# include <90s2313.h>

# include <delay.h>void clearDisplay ()

(

PORTB = 0x08;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

PORTB = 0x18;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_ms (5);

)void entryModeSet (char inc_dec, char shift_normal)

(PORTB = 0x08;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

PORTB = 0x48 | (inc_dec <<5) | (shift_normal <<4);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_us (40);

)void displayOnOff (char display_on, char cursor_on, char blink_on)

(PORTB = 0x08;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

PORTB = 0x88 | (display_on <<6) | (cursor_on <<5) | (blink_on <<4);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_us (40);

)void cursorOrDisplayShift (char displayShift_cursorShift, char right_left)

(PORTB = 0x18;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

PORTB = 0x08 | (displayShift_cursorShift <<7) | (right_left <<6);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_us (40);

)void functionSet (char data_length, char one_two_rows, char dimension_char)

(PORTB = 0x28 | (data_length <<4);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

PORTB = 0x08 | (one_two_rows <<7) | (dimension_char <<6);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_us (40);

)
void setDDRAMaddress (char indirizzo)

(PORTB = (0x88 | indirizzo) &0xfd;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

PORTB = 0x08 | (indirizzo <<4);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_us (40);

)void writeData (char dati)

(PORTB = 0x0A | dati;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

PORTB = 0x0A | (dati <<4);

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = PORTB &0xf7;

delay_us (40);

)initLCD ()

(delay_ms (15);

PORTB = 0x38;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

delay_ms (5);

PORTB = 0x38;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

delay_us (160);

PORTB = 0x38;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

delay_us (160);

PORTB = 0x28;

# asm ( "cli")

delay_us (1);

# asm ( "sei")

PORTB = 0;

delay_us (160);

/ / functionSet (0,1,0);

functionSet (0,1,0);

delay_ms (1);

displayOnOff (0,0,0);

delay_us (160);

displayOnOff (1,1,0);

delay_us (160);

entryModeSet (1,0);

delay_us (160);)void printMessage (flash char * messaggio)

(while (* messaggio) writeData (* messaggio );}

/ / Variabili globali Dichiarare il tuo qui
void main (void)

(

/ / Port B inizializzazione

/ / Func0 = FUNC1 Out Out Func2 = = = Func3 Out Out Func4 Out Func5 = = = Func6 Out Out Out Func7 =

/ / State0 = 0 State1 = 0 State2 = 0 State3 = 0 State4 = 0 State5 = 0 State6 = 0 State7 = 0

DDRB = 0xff;

PORTB = 0xff;/ / Port D inizializzazione

/ / Func0 In FUNC1 = = = In Func2 In Func3 In Func4 = = In Func5 In Func6 = = = In Func7 In

/ / State0 = State1 T = T State2 = State3 T = T State4 = State5 T = T State6 = T = T State7

DDRR = 0x00;

PORTD = 0x00;/ / Timer / Counter 0 inizializzazione

/ / Orologio fonte: orologio di sistema

/ / Orologio valore: 7,813 kHz

TCCR0 = 0x00;

TCNT0 = 0x00;/ / Timer / Counter 1 inizializzazione

/ / Orologio fonte: orologio di sistema

/ / Orologio valore: 1 Timer Arrestato

/ / Modo: Normale superiore = FFFFh

/ / OC1A uscita: sospesa.

/ / OC1B uscita: sospesa.

/ / Rumore Canceler: Off

/ / Input Capture su Falling Edge

TCCR1A = 0x00;

TCCR1B = 0x00;

TCNT1H = 0x00;

TCNT1L = 0x00;

OCR1AH = 0x00;

OCR1AL = 0x00;/ / Interrupt esterne (s) di inizializzazione

/ / INT0: Off

/ / INT1: Off

GIMSK = 0x00;

MCUCR = 0x00;/ / Timer (s) / Counter (s) Interrupt (s) di inizializzazione

TIMSK = 0x00;/ / Analog Comparator inizializzazione

/ / Analog Comparator: Off

/ / Analog Comparator input Acquisizione da Timer / Counter 1: Off

/ / Analog Comparator Output: Off

ACSR = 0x80;

/ / Global consentire interrupt

initLCD ();while (1)

(

clearDisplay ();

printMessage ( "prima fila");

delay_ms (1500);

setDDRAMaddress (0x40);

printMessage ( "seconda fila");

delay_ms (1500);

)

)
 
Proteus non è affidabile al 100%.Ho problema simile con interrupt esterni (logica cambiamento mode/ATMega16).Il mio codice funziona bene, ma in realtà non ha funzionato su Proteus.

 
CodeVision ha funzioni di libreria per facilitare la gestione dei moduli LCD Hitachi ha costruito con il chip HD44780 o equivalente, perché non usarlo?

 
Forse questo è un problema di sincronizzazione con 4 bit.

A quanto mi risulta, quando inizializzazione del display LCD da 4-bit in modalità schermo LCD è in realtà in modalità a 8-bit.Questo, a sua volta, significa che non si dovrebbe sondaggio per un segnale di occupato, ma piuttosto l'attuazione di un manuale ritardo.

A seguito di tale insegnamento, il display LCD è stato costante e tutti scrive / legge dovrebbe essere morso largo.

So che la maggior parte delle volte in hardware un 'errata' attuazione del firmware questo lavoro saranno in funzione della velocità di clock.

A 'C' attuazione di 4-bit in modalità possono essere trovate nel .. /
samples / directory di installazione del Proteus.Iain.

 

Welcome to EDABoard.com

Sponsor

Back
Top