alien75
14-07-2015, 11:26
Salve, ho realizzato una calcolatrice basata sullo Z80 di cui riporto il link qui a fianco ---> http://creative75.altervista.org/creative/?p=86 . Questo è il mio blog che spiega come ho realizzato tale
scheda.
Il mio problema ora consiste nella realizzazione del software in C.
Ora il problema non è tanto il trasferire il codice eseguibile per Z80 nella EEPROM, bensi quello di riuscire a far
visualizzare come test di prova la cifra "1252" sul display.
Dopo aver scritto, compilato e caricato il codice nella EEPROM si sente il relè dell' accensione che si accende ad intermittenza di 1sec. per poi visualizzare segmenti a caso ad ogni intermittenza.
Non capisco il perchè di questo comportamento.
Riporto di seguito il codice che dovrebbe visualizzare "1252" sul display:
firmware_calc.c:
//====================Firmware calcolatrice============================
//21-04-2014 by Roncolato Fabio ===================================
#include "display.h"
void (*function)() = (void (*)())0xc0;
int main()
{
display_7seg(12.55);
while(1){};
return 0;
}
display.h:
//file header dei drivers
void inserisci_cifra(int posizione, char x);
char converti(char cifra);
void visualizza(int posizione, char cifra);
void display_7seg(float numero);
display.c:
//drivers per gestire il display
//indirizzi dei registri dei display
//0x4000 display1
//0x4001 display2
//0x4002 display3
//0x4003 display4
//0x4004 display5
//0x4005 display6
//0x4006 display7
//0x4007 display8
#include "display.h"
#include <stdio.h>
#include <stdlib.h>
char cifre[8];
int num, n=0;
//funzione di visualizzazione cifre
void visualizza(int posizione, char cifra)
{
char numero=converti(cifra);
inserisci_cifra(posizione, numero);
}
//funzione di conversione da BCD a 7 segmenti
char converti(char cifra)
{
if(cifra==0x01) cifra=0x9f;
if(cifra==0x02) cifra=0x25;
if(cifra==0x03) cifra=0x0d;
if(cifra==0x04) cifra=0x99;
if(cifra==0x05) cifra=0x49;
if(cifra==0x06) cifra=0x41;
if(cifra==0x07) cifra=0x1f;
if(cifra==0x08) cifra=0x01;
if(cifra==0x09) cifra=0x09;
if(cifra==0x00) cifra=0x03;
if(cifra==0xff) cifra=0xff; //spegni tutti i segmenti
return cifra;
}
//funzione di inserimento cifra 7 seg. nella cella display indicata
void inserisci_cifra(int posizione, char x)
{
__asm
push ix
add ix,sp
ld h, 4(ix)
ld l, 5(ix)
push af
ld a, 6(ix)
ld (hl), a
pop af
pop ix
ret
__endasm;
}
//funzione di visuallizzazione cifre di un float nel display
void display_7seg(float numero)
{
//int num, n=0;
sprintf(cifre, "%f", numero);
for(num=0x4000;num<0x4007;num++)
{
visualizza(num, cifre[n]);
n++;
}
}
compile.bat:
@echo -------------- compilermessages -----------------
@sdasz80 -o crt0calc.o crt0calc.s
@sdcc -mz80 -c firmware_calc.c
@sdcc -mz80 -c display.c
@rem sdcc in linker mode, only tell .rel files in this line, no .c, no .asm
@sdcc -mz80 --no-std-crt0 --reserve-regs-iy --code-loc 0x00F3 --data-loc 0xe000 -o linkresult.ihx crt0calc.rel firmware_calc.rel display.rel
@echo -------------------------------------------------
@sdldz80 -nf "link.lnk"
@hex2bin 4000 linkresult.ihx
@copy linkresult.bin calc.ROM
Quest' ultimo file è lo script di compilazione che serve ad SDCC (il compilatore che ho usato) per compilare il tutto.
Nessuno mi può dare una mano a capire perchè mi escono segmenti del display a caso invecie di uscire 1252 ?
Grazie in anticipo :)
scheda.
Il mio problema ora consiste nella realizzazione del software in C.
Ora il problema non è tanto il trasferire il codice eseguibile per Z80 nella EEPROM, bensi quello di riuscire a far
visualizzare come test di prova la cifra "1252" sul display.
Dopo aver scritto, compilato e caricato il codice nella EEPROM si sente il relè dell' accensione che si accende ad intermittenza di 1sec. per poi visualizzare segmenti a caso ad ogni intermittenza.
Non capisco il perchè di questo comportamento.
Riporto di seguito il codice che dovrebbe visualizzare "1252" sul display:
firmware_calc.c:
//====================Firmware calcolatrice============================
//21-04-2014 by Roncolato Fabio ===================================
#include "display.h"
void (*function)() = (void (*)())0xc0;
int main()
{
display_7seg(12.55);
while(1){};
return 0;
}
display.h:
//file header dei drivers
void inserisci_cifra(int posizione, char x);
char converti(char cifra);
void visualizza(int posizione, char cifra);
void display_7seg(float numero);
display.c:
//drivers per gestire il display
//indirizzi dei registri dei display
//0x4000 display1
//0x4001 display2
//0x4002 display3
//0x4003 display4
//0x4004 display5
//0x4005 display6
//0x4006 display7
//0x4007 display8
#include "display.h"
#include <stdio.h>
#include <stdlib.h>
char cifre[8];
int num, n=0;
//funzione di visualizzazione cifre
void visualizza(int posizione, char cifra)
{
char numero=converti(cifra);
inserisci_cifra(posizione, numero);
}
//funzione di conversione da BCD a 7 segmenti
char converti(char cifra)
{
if(cifra==0x01) cifra=0x9f;
if(cifra==0x02) cifra=0x25;
if(cifra==0x03) cifra=0x0d;
if(cifra==0x04) cifra=0x99;
if(cifra==0x05) cifra=0x49;
if(cifra==0x06) cifra=0x41;
if(cifra==0x07) cifra=0x1f;
if(cifra==0x08) cifra=0x01;
if(cifra==0x09) cifra=0x09;
if(cifra==0x00) cifra=0x03;
if(cifra==0xff) cifra=0xff; //spegni tutti i segmenti
return cifra;
}
//funzione di inserimento cifra 7 seg. nella cella display indicata
void inserisci_cifra(int posizione, char x)
{
__asm
push ix
add ix,sp
ld h, 4(ix)
ld l, 5(ix)
push af
ld a, 6(ix)
ld (hl), a
pop af
pop ix
ret
__endasm;
}
//funzione di visuallizzazione cifre di un float nel display
void display_7seg(float numero)
{
//int num, n=0;
sprintf(cifre, "%f", numero);
for(num=0x4000;num<0x4007;num++)
{
visualizza(num, cifre[n]);
n++;
}
}
compile.bat:
@echo -------------- compilermessages -----------------
@sdasz80 -o crt0calc.o crt0calc.s
@sdcc -mz80 -c firmware_calc.c
@sdcc -mz80 -c display.c
@rem sdcc in linker mode, only tell .rel files in this line, no .c, no .asm
@sdcc -mz80 --no-std-crt0 --reserve-regs-iy --code-loc 0x00F3 --data-loc 0xe000 -o linkresult.ihx crt0calc.rel firmware_calc.rel display.rel
@echo -------------------------------------------------
@sdldz80 -nf "link.lnk"
@hex2bin 4000 linkresult.ihx
@copy linkresult.bin calc.ROM
Quest' ultimo file è lo script di compilazione che serve ad SDCC (il compilatore che ho usato) per compilare il tutto.
Nessuno mi può dare una mano a capire perchè mi escono segmenti del display a caso invecie di uscire 1252 ?
Grazie in anticipo :)