Επιστροφή στο Forum : avr και lcd
εχουμε τον παρακατω κώδικα σε 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)
καμια ιδέα?
Μια πρώτη σκέψη είναι να "σπάσεις" τον αριθμό
σε δύο κομμάτια πρίν τον στείλεις στην οθόνη και
έπειτα να στείλεις στην ουσία δύο αριθμόυς τον
ένα δίπλα στον άλλο.
Προσώπικά επειδή δουλεύω assembly όταν δουλεύω
μεγάλους αριθμούς στέλνω ένα - ένα τα νούμερα. :(
Επιστήμωνα πες το με ποιο απλά λόγια...
άμα δουλεύεις assembly ξέρεις πως δουλεύει ο κώδικας και δεν έχεις τέτοια προβλήματα!
Ρε παιδιά με πόσο ποιο απλά λόγια ?
Τα πράγματα είναι "απλά" (?!?)
Αυτό που κάνω εγώ όταν θέλω να στείλω
είναι να μετατρέπω ένα ένα τα bit του αριθμού στα
δεκαδικά τους αντίστοχα επειτα να προσθέτω τους επιμέρους
δεκαδικούς και έπειτα στέλνω ένα ένα τα νούμερα . :shock: :evil: :(
Π.χ.
Έχω τον αριθμό : 10110001 = 177
Έχω τρείς καταχωρητές : εκατοντάδες , δεκάδες , μονάδες
Έλέγχω αν το πρώτο bit (MSB) είναι ένα ,Αν ναι (στο π.χ. είναι "1")
αυξάνω τις εκατοντάδες κατα 1 , τις δεκάδες κατα 2 και τις μονάδες κατα 8 (ΜSB = 128)
Μιλάω πάντα για ένα byte .
Έπειτα ελέγχω και τα υπόλοιπα bit και αντίστοιχα αυξάνω τις εκατ, δεκ , μον .
Αφού ελέγξω όλα τα bit ελέχγω αν οι μονάδες είναι πάνω απο δέκα .
Αν ναι τότε αυξάνω τον καταχωρητή δεκάδες κατα ένα και μειώνω τον καταχωρητή μονάδες κατα 10 .
Έπειτα ελέγχω αντίστοιχα τις δεκάδες .
Και τέλος τις εκατοντάδες.Βέβαια σε αυτό το παράδειγμα οι εκατοντάδες δεν μπορεί
να είναι πάνω απο δέκα . Σε ποιο μεγάλους αριθμούς όμως (16-bit)
γίνεται.
Στη συνέχεια προβάλλω στην οθόνη τους αριθμούς : εκατοντάδες , δεκάδες , μονάδες .
Αυτό έκανα και κάνω μέχρι τώρα όταν έχω να κάνω πράξεις και πρέπει να προβάλλω
μεγάλους αριθμούς (π.χ. συχνόμετρο).Όπως είπα και πάλι δουλεύω μόνο assembly.
Με μπέρδεψες....binary to bcd θες να κάνεις?
Αν ναι γίνεται... με πολύ πιο γρήγορο και απλό αλγόριθμο (προγραμματιστικά) Αν και δεν κατάφερα να τον καταλάβω :oops: :cry: (όταν έχω χρόνο θα τον ξανακοιτάξω) ακόμα και όταν κατέβασα μια εξηγηση του αλγορίθμου από το Internet... πάντως δουλεύει σίγουρα και επεκτίνεται πανεύκολα σε όσα bit θέλεις.
Θα τον βρεις σε assebly στα application note της ATMEL. Αν κοιτάξεις και για άλλους μικροελεγκτές και οι άλλοι κατασκευαστές τον ίδιο αλγόριθμο δίνουν....άρα είναι στάνταρ... γι αυτούς που ξέρουν...
Και μια συμβουλή και πάλι... καλή η C αλλά για τα απλά πράγματα η assembly είναι τέλεια.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.