PDA

Επιστροφή στο Forum : avr και lcd



axel
20-07-07, 13:55
εχουμε τον παρακατω κώδικα σε codevision
#include <mega8515>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm

#include <lcd>
#include <stdio>
char lcd_buffer[30]
unsigned long int x;
main()
{
lcd_init();
while(1)
{
x++;
sprintf(lcd_buffer,%u,x);
lcd_puts(lcd_buffer);
}
}
το πρόβλημα ειναι το εξής:
ενώ το x είναι 32 bit o οθόνη μετράει κανονικά μέχρι το 16 bit δηλαδη μέχρι 65536.
που μπορεί να οφείλεται αυτό?έχει να κάνει κάτι με το buffer της οθόνης?
δηλαδη και να γράψω x=100000,δεν θα μου το εμφανίσει στην οθόνη θα μου εμφανισει 34464 οσο (100000-65536)
καμια ιδέα?

Επιστήμων
20-07-07, 14:46
Μια πρώτη σκέψη είναι να "σπάσεις" τον αριθμό
σε δύο κομμάτια πρίν τον στείλεις στην οθόνη και
έπειτα να στείλεις στην ουσία δύο αριθμόυς τον
ένα δίπλα στον άλλο.

Προσώπικά επειδή δουλεύω assembly όταν δουλεύω
μεγάλους αριθμούς στέλνω ένα - ένα τα νούμερα. :(

chip
20-07-07, 18:32
Επιστήμωνα πες το με ποιο απλά λόγια...
άμα δουλεύεις assembly ξέρεις πως δουλεύει ο κώδικας και δεν έχεις τέτοια προβλήματα!

Επιστήμων
20-07-07, 21:25
Ρε παιδιά με πόσο ποιο απλά λόγια ?
Τα πράγματα είναι "απλά" (?!?)

Αυτό που κάνω εγώ όταν θέλω να στείλω
είναι να μετατρέπω ένα ένα τα bit του αριθμού στα
δεκαδικά τους αντίστοχα επειτα να προσθέτω τους επιμέρους
δεκαδικούς και έπειτα στέλνω ένα ένα τα νούμερα . :shock: :evil: :(

Π.χ.

Έχω τον αριθμό : 10110001 = 177

Έχω τρείς καταχωρητές : εκατοντάδες , δεκάδες , μονάδες

Έλέγχω αν το πρώτο bit (MSB) είναι ένα ,Αν ναι (στο π.χ. είναι "1")
αυξάνω τις εκατοντάδες κατα 1 , τις δεκάδες κατα 2 και τις μονάδες κατα 8 (ΜSB = 128)
Μιλάω πάντα για ένα byte .
Έπειτα ελέγχω και τα υπόλοιπα bit και αντίστοιχα αυξάνω τις εκατ, δεκ , μον .

Αφού ελέγξω όλα τα bit ελέχγω αν οι μονάδες είναι πάνω απο δέκα .
Αν ναι τότε αυξάνω τον καταχωρητή δεκάδες κατα ένα και μειώνω τον καταχωρητή μονάδες κατα 10 .
Έπειτα ελέγχω αντίστοιχα τις δεκάδες .
Και τέλος τις εκατοντάδες.Βέβαια σε αυτό το παράδειγμα οι εκατοντάδες δεν μπορεί
να είναι πάνω απο δέκα . Σε ποιο μεγάλους αριθμούς όμως (16-bit)
γίνεται.

Στη συνέχεια προβάλλω στην οθόνη τους αριθμούς : εκατοντάδες , δεκάδες , μονάδες .

Αυτό έκανα και κάνω μέχρι τώρα όταν έχω να κάνω πράξεις και πρέπει να προβάλλω
μεγάλους αριθμούς (π.χ. συχνόμετρο).Όπως είπα και πάλι δουλεύω μόνο assembly.

chip
21-07-07, 09:53
Με μπέρδεψες....binary to bcd θες να κάνεις?
Αν ναι γίνεται... με πολύ πιο γρήγορο και απλό αλγόριθμο (προγραμματιστικά) Αν και δεν κατάφερα να τον καταλάβω :oops: :cry: (όταν έχω χρόνο θα τον ξανακοιτάξω) ακόμα και όταν κατέβασα μια εξηγηση του αλγορίθμου από το Internet... πάντως δουλεύει σίγουρα και επεκτίνεται πανεύκολα σε όσα bit θέλεις.
Θα τον βρεις σε assebly στα application note της ATMEL. Αν κοιτάξεις και για άλλους μικροελεγκτές και οι άλλοι κατασκευαστές τον ίδιο αλγόριθμο δίνουν....άρα είναι στάνταρ... γι αυτούς που ξέρουν...
Και μια συμβουλή και πάλι... καλή η C αλλά για τα απλά πράγματα η assembly είναι τέλεια.