THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => Ηλεκτρολογικές... απορίες => Topic started by: greekoo on July 24, 2016, 18:51:21 pm



Title: 4digit 7-Segment LED Display με ARDUINO
Post by: greekoo on July 24, 2016, 18:51:21 pm
Καλησπέρα.

Έχω το εξής 4 digit display: http://thomas.bibby.ie/wp-content/uploads/2015/10/KYX-5461AS.jpg (μοντέλο 5461as)

Έχει 12 pins. ουσιαστικά 8 pins είναι για τα 8 ledακια του κάθε ψηφίου (μαζί κ η τέλεια) και τα υπόλοιπα 4 είναι για την επιλογή του ψηφιου  ( 1,2,3,4 από τα αριστερά στα δεξιά )

Η σύνδεσμολογια μ είναι απλή. Τα 8 pins των leds συνδέονται σε σειρά με αντίσταση και σ σειρά με τα pins του arduino
ενώ τα υπόλοιπα 4 pins συνδέονται κατευθείαν στο arduino (χωρίς αντίσταση δλδ).

Αυτή ακριβώς είναι η σύνδεσμολογια: http://images0.cnblogs.com/blog2015/37564/201505/311609200019974.jpg

Το πρόβλημά μου είναι πώς, δεν μπορώ να ανάψω διαφορετικούς αριθμούς σε κάθε ψηφίο, ενώ μπορώ να ανάψω τους ίδιους αριθμούς.
Δηλαδή μπορώ να ανάψω το 3333 ή το 5555 αλλά όχι το 1234

Από forum του arduino και απο Manual, βρήκα ότι πρέπει να κάνω κάποιου είδους πολυπλεξία για να ανάψω τα ψηφία το ένα μετά το άλλο.

Συγκεκριμένα πρέπει:

υψηλό "1" σε όλα τα digit pins ( τα 4 pins που συνδεονται στα ψηφια)
λογικό "0" στο digit που με ενδιαφέρει
ενεργοποίηση των καταλλήλων leds
υψηλό "1" στο diigt που με ενδιαφέρει
delay(κάποια Microseconds) δεν έχω καταλάβει γιατί

και αυτή η διαδικασία επαναλαμβάνεται και για τα 4 ψηφία.

Παρόλαυτά όταν πάω να αλλάξω ένα συγκεκριμένο ψηφίο τότε αλλάζουν και όλα τα άλλα μαζί...

 Έχει κανείς καμιά ιδέα;


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Apostolof on July 24, 2016, 19:03:54 pm
Έχει 12 pins. ουσιαστικά 8 pins είναι για τα 8 ledακια του κάθε ψηφίου (μαζί κ η τέλεια) και τα υπόλοιπα 4 είναι για την επιλογή του ψηφιου  ( 1,2,3,4 από τα αριστερά στα δεξιά )

Αφού το εξάρτημά σου είναι έτσι φτιαγμένο δε μπορείς να εμφανίζεις διαφορετικά νούμερα σε κάθε ψηφίο ταυτόχρονα. Για αυτό το λόγο εμφανίζεις τα ψηφία που θες διαδοχικά, εκμεταλλευόμενος (νομίζω) αυτό (https://en.wikipedia.org/wiki/Persistence_of_vision), με πολύ μεγάλη ταχύτητα (σε σχέση με αυτή που αντιλαμβάνεται το ανθρώπινο μάτι) εναλλαγής.

Τώρα για τα υπόλοιπα πόσταρε αν θες τον κωδικά σου. :)

edit: τσέκαρε και εδώ (http://playground.arduino.cc/Main/SevenSegmentLibrary)


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Επίδοξος on July 24, 2016, 19:06:14 pm
Θα βάλεις στην αρχή να ανάψει το 1ο ψηφίο με τον αριθμό που θέλεις, μετά ένα delay (πες 10), μετά το 2ο ψηφίο κοκ.

digitalWrite(dig1, HIGH);
digitalWrite(dig2, LOW);
digitalWrite(dig3, LOW);
digitalWrite(dig4, LOW);
digitalWrite(pinTeleia, HIGH);
printx(x);
delay(10);

digitalWrite(dig1, LOW);
digitalWrite(dig2, HIGH);
digitalWrite(dig3, LOW);
digitalWrite(dig4, LOW);
digitalWrite(pinTeleia, HIGH);
printx(x);
delay(10);

digitalWrite(dig1, LOW);
digitalWrite(dig2, LOW);
digitalWrite(dig3, HIGH);
digitalWrite(dig4, LOW);
digitalWrite(pinTeleia, LOW);
printx(x);
delay(10);

digitalWrite(dig1, LOW);
digitalWrite(dig2, LOW);
digitalWrite(dig3, LOW);
digitalWrite(dig4, HIGH);
digitalWrite(pinTeleia, HIGH);
printx(x);
delay(10);

edit: όπου printx() ο συνδυασμός των λεντακίων που θες αναμμένα και pinTeleia για την υποδιαστολή


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Andromedas on July 24, 2016, 19:23:58 pm
Είδα και λίγο το manual του CC-56461AS και πιστεύω ότι ένιωσα γιατί έχει αυτήν την συμπερίφορα. Εάν σε ενδιαφέρει πες.


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: greekoo on July 24, 2016, 19:43:38 pm
Ευχαριστώ για τις απαντήσεις.

Προγραμματίζω με avr assembly ( μου άρεσε πολύ το μάθημα του πέτρου μάλλον :P)

Ο κώδικας που χρησιμοποιώ είναι ουσιαστικά ίδιος με αυτό που πόσταρε ο Apostolof:
        ;στο portd1,d2,d3,d4 έχω τα 4 Pins των ψηφίων
        ;Ασ προσπαθήσω να γράψω τον αριθμό 1234:
        ldi r17,1
        sbi portd,1
   cbi portd,2
   cbi portd,3
   cbi portd,4
   displayLED r17 ; είναι macro για το άναμμα των σωστών leds
   call delay ; delay 10ms

   ldi r17,2

   cbi portd,1
   sbi portd,2
   cbi portd,3
   cbi portd,4
   displayLED r17
   call delay

   ldi r17,3

   cbi portd,1
   cbi portd,2
   sbi portd,3
   cbi portd,4
   displayLED r17
   call delay
        
        ldi r17,4

   cbi portd,1
   cbi portd,2
   cbi portd,3
   sbi portd,4
   displayLED r17
   call delay

forever:
   jmp forever

Δυστυχώς δεν φαίνεται να δουλεύει καθώς το τελικό αποτέλεσμα είναι το "333" με το Digit4 να είναι σβηστό εντελώς.

Ουσιαστικά κάθε φορά που κάνω displayLED αλλάζουν και όλα τα ψηφία (?)

(μπορώ να ξεκαθαρίσω ένα τελευταίο 3αρι που ανάβει για μικρό χρονικό διάστημα στο digit4)


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Andromedas on July 24, 2016, 19:55:19 pm
Αλλαξε το forever
βάλε το πάνω απο τα out put στα leds
/ πολύ λογική η συμπεριφορά για το σφαλμα που έχω στο μυαλό μου
/ αύξησε και το delay 500ms και πρέπει να σου δείχνει συνεχόμενα 123..


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: rspappas on July 24, 2016, 20:40:12 pm
Για αρχή,  νομιζω έχεις ανάποδα την λογική για την επιλογή του ψηφιου. Θέλει λογικό 0 για να επιλεχθει το συγκεκριμένο ψηφιο,  και στα μη επιλεγμένα θέλει λογικό 1. Οπότε sbi όλα εκτος απο το επιλεγμένο που το κάνεις cbi.  Το ίδιο σφάλμα έχει κάνει και ο επιδοξος στον κώδικα C.

Και γενικά σκέψου ότι ουσιαστικά μέσω του πίν επιλογής ψηφιου κλείνεις το κύκλωμα των λεντ. Δηλαδή δίνεις λογικό 1, 5 βολτ στην επιλογή των 8 λεδ και 0 βολτ από την άλλη μεριά για να ανάψουν τα λεδ.

Το delay υποθετω το βάζει για να προλάβουν να ανάψουν τα λεδ.  Το 10 ms ακούγεται λογικο.

Επίσης το φορεβερ πρέπει να περικλειει όλη την φαση της πολυπλεξιας/διάδοχικης επιλογής των ψηφίων, όπως λέει ο ανδρομεδας. Ουσιαστικά τώρα επειδή δεν επαναλαμβανεται η φάση, μενει αναμμενη στα λεδ μόνο η εντολή για το τελευταίο ψηφιο,  που λόγω του σφάλματος της αντιστροφης λογικής ανάβουν όλα εκτός από το τελευταίο


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Andromedas on July 24, 2016, 21:12:38 pm
Έχεις δίκιο εάν το 0-9 το αντιστοιχεί σε 1-10 η display led ...
Αυτό που γίνεται είναι το εξής:
Κάθε φορά που ανοίγεις το ένα από τα τέσσερά bit επιλογή ανοίγουν τα (αν θυμάμαι καλά) lats μιας PLA ( Δεν νομίζω ότι έχει decoder) και συνδέουν τα pins του αριθμού με τα leds του κάθε ψηφίου. Τώρα εάν είναι ανάποδης λογικής δεν μπορώ να πω από αυτά που είδα, σίγουρα ανάποδη λογική έχουν τα leds. Οπότε αφού έχεις ανοικτά τα 3 (low) pins του select σου ανοίγουν τα 3 leds και σου δείχνουν 3 γιατί μάλλον ισχύει το παραπάνω


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: greekoo on July 24, 2016, 22:04:35 pm
Σας ευχαριστώ παιδιά λύθηκε το πρόβλημα.

Όντως δεν είχα καταλάβει πώς δούλευε.
Έπρεπε όλο αυτό να γίνεται μέσα σε μια λούπα. 10ms φαίνεται καλό Delay. Αν το βάλεις πιο σύντομο τότε μπορεί να πάει να ψιλοεμφανιστεί κ κάνα άκυρο ψηφίο. Επίσης όντως το ψηφίο pin είναι αντίστροφης λογικής.

Δεν ξέρω αν σπάω το κεφάλι μου τσάμπα που τα γράφω με assembly, αλλά νιώθω ότι μπορώ να κάνω περισσότερα πράματα και να ελέγξω το πρόγραμμα μου όπως θέλω. Θα δείξει σε επόμενα πιο δύσκολα projects!


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: rspappas on July 24, 2016, 22:28:32 pm
Ανδρομέδα, δεδομένου ότι δεν έχει εξτρα πιν για τροφοδοσία,  νομιζω πως η οθόνη δεν έχει ούτε latch ούτε τίποτα.  Απλά έχει λεδ.  Και κλείνει κυκλωμα μεταξύ πιν επιλογής λεδ (θετική μεριά) και πιν επιλογής ψηφιου (αρνητική μεριά).

Το 3 αντί για 4 μάλλον είναι θέμα προγραμματισμου του μακρο.



Πάντως μπράβο που το παλεύεις σε ασσεμπλι. Σιγουρα θα ήταν πιο εύκολο σε C,  αλλά έτσι είναι τέρμα εκπαιδευτικό.


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Katarameno on July 25, 2016, 00:22:32 am
...
delay(κάποια Microseconds) δεν έχω καταλάβει γιατί
...

Caveat

While it is easy to create a blinking LED with the delay() function, and many sketches use short delays for such tasks as switch debouncing, the use of delay() in a sketch has significant drawbacks. No other reading of sensors, mathematical calculations, or pin manipulation can go on during the delay function, so in effect, it brings most other activity to a halt.
https://www.arduino.cc/en/Reference/Delay

Ντεν ξέρει Arduino ντεν ξέρει Ledάκια κτλ αλλά αρέσκει delay();
Η delay(); είναι μια φαινομενικά άχρηστη αλλά μερικές φορές σωτήρια εντολή  :D

Delay waits a specified number of milliseconds. The number of specified seconds is an approximation, and may be off a lot, if system load is high. http://www.freepascal.org/docs-html/rtl/crt/delay.html

H delay(); με είχε σώσει κυριολεκτικά παλιά όταν έβλεπα παρανοϊκά και τυχαία error messages "stack overflow at address XXXXXX" (και συγκεκριμμένα στην διαδικασία σορταρίσματος του επισυναπτόμενου δείγματος κουπονιού σε Excel (έπρεπε να γίνει τετραπλή ταξινόμηση ανά στήλη α) ημερομηνίας στοιχηματικού γεγονότος β) ώρας παιγνιδιού γ) ονόματος διοργάνωσης και δ) ονόματος γηπεδούχου στο γνωστό σε πολλούς κουπόνι του Πάμε Στοίχημα) σε Excel που είχαν μέχρι και 666  :D γραμμές και περίπου 50 στήλες που ήταν εξαιρετικά μνημοβόρα για τα χιλιοστά δευτερολέπτου που ξεκινούσε και είχε ως αποτέλεσμα να "τρώει" όλη τη μνήμη από τα PC και τους Servers το οποίο τελικά οφειλόταν σε ένα bug που είχε το αντικείμενο list της Microsoft τότε πίσω στα Windows Server 2003 και Windows XP.
Mε την delay(); [ delay(100 milliseconds) ] καθυστερούσα πχ. κατά 100msec τη συνέχιση της ταξινόμησης μετά από κάθε επανάληψη στο τετραπλό loop και προλάβαιναν να αδειάσουν όσο χρειαζόταν οι μνήμες ώστε να μην "σκάνε" τα μηχανήματα. Αντί να σκάνε τα μηχανήματα σε ένα δευτερόλεπτο, απλά περίμεναν 5-6 δευτερόλεπτα παραπάνω και όλα μέλι γάλα.
Χιλιάδες εξαρτημένοι τζογαδόροι θα έπρεπε κανονικά να στήσουν ένα ναό ή έστω ένα εκκλησάκι στην εντολή delay() ή έστω μια εικόνα της Παναγίας της "Καθυστερούσας" και να της ανάβουν καθημερινά το καντήλι γιατί χωρίς αυτήν τα @@ τους θα έπαιρναν αντί για κουπόνι με τους αγώνες
 ;D

(https://s32.postimg.org/4hn5dklph/Multiple_Sorting.jpg)



Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: greekoo on July 25, 2016, 00:32:53 am



χάχα Μάλιστα φίλε μου. Να ναι καλά η delay δηλαδή ;D


Title: Re: 4digit 7-Segment LED Display με ARDUINO
Post by: Katarameno on July 25, 2016, 01:21:39 am
Aκόμα καίει το καντήλι της Παναγίας της delay();ed στον ΟΠΑΠ. Έχουν και καντηλαναύτη:

https://www.youtube.com/watch?v=MyhW8i58Udo

Εσείς είστε ακόμα μικροί και είστε ledαναύτες