Επιστροφή στο Forum : Πρόβλημα στην εκτέλεση κώδικα στους AVR
eebabs2000
21-05-07, 11:11
Δε ξέρω αν έχει τύχει σε σας που ασχολείστε με προγραμματισμό μικροελεγκτών... Μόλις γράφω κάποιο πρόγραμμα και πάω να το τρέξω μπερδεύεται κατά κάποιο τρόπο και βγάζει το τσιπ αλανταλον. Μόλις πειράξω καμια 20αρια φορές τα ποδαράκια του κρυστάλλου ή τους πυκνωτές τότε το πρόγραμμα τρέχει κανονικά. Όλα αυτά στο ΑΤ90s2313. Όμως σε ένα πρόγραμμα που έχω κάνει που εμφανίζει στην TV πρότυπη εικόνα, η εκτέλεση γίνεται κανονικότατα και μάλιστα χωρίς πυκνωτάκια στον κρύσταλλο... Μάλλον απ' ότι κατάλαβα πρέπει να κολλάει όταν είναι να εκτελέσει τα Rjmp ή rcall... χωρίς να είμαι σίγουρος.
Να πω επίσης ότι αυτά τα δοκιμαζω σε breadboard γιατί κάποιοι μου είπανε ότι μπορεί να φταίει αυτό.
Στον 8515 πάλι είτε βάζω κρύσταλλο είτε όχι είναι ένα και το αυτό! Το πρόγραμμα τρέχει με βάση των εσωτερικό ταλαντωτή του συστήματος... Πρεπει μήπως να ρυθμιστεί κάτι;
Τα προγράμματα τα γράφω στο AVRstudio4 και τα φορτώνω μέσω του pony prog (http://www.lancos.com/prog.html).
Ευχαριστώ για κάθε βοήθεια...
Το οτι κολλάει και κάνει άλανταλον μπορεί να οφείλεται στον WDT. Τον απενεργοποίησες ή τον χρησιμοποιείς στο πρόγραμμά σου; Όσο για τον 8515 αν θες να χρησιμοποιήσεις εξωτερικό κρύσταλλο πρέπει να προγραμματίσεις τα κατάλληλα fuses. Λογικά στο help του Ponyprog θα βρεις την απάντηση, δεν το χρησιμοποιώ και δεν ξέρω πως τα έχει.
eebabs2000
21-05-07, 12:14
Δεν τον χρησιμοποιώ καθόλου στο πρόγραμμα, αλλά όμως γιατί όταν ακουμπήσω τα ποδαράκια του κρυστάλλου ή τους πυκνωτές μερικές φορές συνεχίζει να τρέχει κανονικά; thanks :)
1. Το 2313 και τα 8515, 8535 της σειράς ΑΤ90S έχουν καταργηθεί από καιρό. Μην ασχολείσαι με αυτά γιατί πολλές φορές έχουν bugs και σε κάνουν να τραλλαθείς. Καλύτερα πεταξέ τα και ασχολήσου με τους νέους αντικαταστάτες τους που είναι πολύ πιο σταθεροί και προβλέψιμοι.
2. Αν παρόλα αυτά θέλεις να ασχοληθείς με τους παλιούς η παρατηρησή του για το rcall με κάνει να σκεφθώ μήπως έχεις λησμονήσει να αρχικοποιήσεις το stack. Είναι το κλασσικό λάθος που κάναμε όλοι περνώντας από τον 1200 σε κάποιον μεγαλύτερο.
eebabs2000
21-05-07, 16:16
Δηλαδή να αγοράσω ΑΤtiny2313; Ο 8515 λέει πάνω ΑΤmega8515. Όσο για το stack για δώσε ένα παράδειγμα... που και πως το γράφω;
Εχεις βαλει πυκνωτη 100nF παραλληλα στην τροφοδοσια του μικροελεγκτη και κοντα σε αυτον?
Το πρόβλημα των 2313 και 8515 δε νομίζω οτι έιναι τα bug.... Αν το breadboard δεν έχει κάποιο πρόβλημα πρέπει να δουλεύουν όλα καλά.. εκτός και το κύκλωμα είναι τεράστιο και δημιουργέι θόρυβο στην τροφοδοσία....(βάλε και κανένα ηλεκτρολυτικό...) Σε breadboard τους έχω δουλέψει και υπερχρονισμένους σε 2πλή και 3πλή ταχύτητα χωρίς πρόβλημα....ουστιατικά φαίνεται οτι μπορούν να πλησιάσουν η να φτάσουν τα 20Μ με την προυπόθεση οτι δεν θα χρησιμιποιηθεί η EEPROM.
Το watchdog timer μετά το reset είναι απενεργοποιημένο... και οι περισσότεροι δεν το αγγίζουν.
Και μένα το μυαλό μου πάει στο οτι δεν όρισε τον stack pointer και τρελένεται όταν εκτελεί εντολή rcall ή interupt.
Για τον 2313:
ldi r16, low(RAMEND)
out SPL, r16
Για τον 8515 που έχει δύο καταχωρητές για SP ρίξε μια ματιά στα application note γιατι δεν έχω κάποιο πρόγραμμα πρόχειρο αυτή τη στιγμή και δεν θυμάμε σίγουρα... ίσως είναι
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
eebabs2000
22-05-07, 14:40
Μου κάνει και μένα μεγάλη εντύπωση. Γιατί τον 2313 τον έχω δουλέψει στα 17.74ΜΗz μια χαρά για να παράγει ένα σήμα video... οπότε δε πιστεύω ότι φταίει κάτι στο κύκλωμα ή στο breadboard. Πυκνωτάκια εχω ένα σωρό. Για να σας δώσω να καταλάβετε τι συμβαίνει. Δείτε τις παρακάτω φώτο όπου προσπαθώ να φτιάξω το ρολόι του "επιστήμων". Μόνο για ρολόι δε κάνει...
Αρχικά δεν εμφανίζεται τίποτα. Κάθε φορά που πειράζω τους ακροδέκτες του κρυστάλλου και τα πυκνωτάκια του έπαιρνα διαδοχικά τα παρακάτω....
eebabs2000
22-05-07, 14:44
Και τελικά μετά από μεγάλη προσπάθεια, βγήκε αυτό... Δε μπορώ τελικά να καταλάβω που οφείλεται το μπέρδεμα... Δε μπορεί να έχει λάθος τον κώδικα ο επιστήμων (http://www.hlektronika.gr/phpBB2/viewtopic.php?t=2283).
Λιγη αισιοδοξία παιδιά. Controller είναι όχι αστρολογία!!
Θα το βρούμε το πρόβλημα.
Κατ΄αρχήν πες μου αν το chip που έχεις είναι 2313 ή Tiny2313.
Σε κάθε περίπτωση η αρχικοποίηση του stack είναι απαραίτητη.
Δες και αυτό που έγραψε ο chip.
Το πρόγραμμα του επιστήμονα είναι για τον 1200 κει δεν έχει
αρχικοποίηση του stack. Κάντο το και πές μας το αποτέλεσμα.
Επίσης έλεγξε οτι έχει τις διεθύνσεις από τα Interupt στις ίδιες θέσεις (νομίζω οτι είναι σε διαφορετικές θέσεις)
Το γεγονός οτι σου εμφανίζει κείμενο αλλά όχι σωστό πιθανότατα σημαίνει κάτι άλλο...
Ο επιστήμονας έχει άλλο τύπο οθόνης LCD (συμβατό) ο οποίος φαίνεται οτι μπορεί να δουλέψει σε πιο υψηλή συχνότητα από το δικό σου.... Ο δικός σου μάλλον δουλεύει οριακά.. Αν το φτιάξεις σε κανονική πλακέτα ίσως να μην έχει πλέον πρόβλημα αν και το πιο σωστό ειναι να αλλάξεις τις καθυστερήσεις στον κώδικα στα σημεία που στέλνει τα data στην οθόνη ώστε να τα καταλαβαίνει.
main :
rcall delay1
ldi helper,$38 ; thetei 8-bit transfer , 2 line mode , 5x7 format
rcall entoli
ldi helper,$38
rcall entoli
ldi helper,$38
rcall entoli
ldi helper,$0C ; thetei Display(On) , Cursor Underline(Off) , Cursor Blink(Off)
rcall entoli
Πρέπει πρώτα να στείλεις τρεις φορές την εντολή 0X38 ή 0x30 μετά την 0x0C και μετά συνεχίζεις το πρόγραμμα!
LCD Initialization procedure: http://www.josepino.com/pic_projects/index?hitachi_displays.jpc
Αν και το πρόβλημα δεν φαίνεται να είναι στις ρουτίνες της LCD αλλά στον σωρό (γίνεται Overflow και εμφανίζει αλαντάλον στην οθόνη).
Αν το πρόγραμμα έχει rcall (δεν το έχω δει) θα πρέπει ΟΠΩΣΔΗΠΩΤΕ να προστεθεί η αρχικοποίηση του stack pointer.
eebabs2000
23-05-07, 09:59
Το τσιπ που δουλεύω είναι ΑΤ90S2313 και όχι tiny2313. Θα το δοκιμάσω και με 1200 μόλις το αγοράσω. Όσο αφορά το LCD είναι το κλασικό που δουλεύεται για τέτοιες εφαρμογές 2χ16. Με τι τύπο LCD να δοκιμάσω; Αν προσθέσω κάτι απ' αυτά στο κώδικα μήπως επηρεαστεί η μέτρηση της ώρας; Σας βάζω ένα κομμάτι από το κώδικα του ρολογιού από την αρχή να μου πείτε αν όντως περιέχει αυτά που μου λέτε ή όχι γιατί δεν είμαι και πολύ σχετικός με μC...
.def helper=r16
.def fores=r17
.def level=r18
.def flag=r19
.def day=r20
.def second=r21
.def min=r22
.def hour=r23
.def time_H=r24
.def time_L=r25
.def time=r26
.def time1=r27
.def dek=r28
.def mon=r29
.org $000
rjmp RESET
.org $002
rjmp Time_Ovr
.include "c:\AVR studio\Appnotes\1200def.inc"
RESET : ldi helper,$FF ; thetei oli ti thyra B exodo
out DDRB,helper
ldi helper,0 ; kai midenizei tis exodoys
out PORTB,helper
ldi helper,$03 ; thetei PIND(0)=RS(exodo) , PIND(1)=E(exodo)
out DDRD,helper ; PIND(2)=SET(eisodo) , PIND(4)=allagi leptwn , PIND(5)=allagi wras
ldi helper,$7C ; energopoiei tis eswterikes antistaseis sta PIN(2,3,4,5,6) giati tha
out PORTD,helper ; xrhsimopoiithoun ws eisodoi me puss mpoyton kai diakoptakia
ldi helper,$02 ; energopoiei to interrupt toy TIM_OVRF0
out TIMSK,helper
ldi helper,$01 ; thetei to clock tou TIMER0 iso me ti sixnotita toy krystallou (4 MHz)
out TCCR0,helper
ldi helper,0
out TCNT0,helper
;ldi year,5
;ldi month,11
;ldi date,5
;ldi day,6
ldi second,0
ldi min,0
ldi hour,0
ldi day,1
ldi time_H,0
ldi time_L,0
ldi level,0
ldi flag,0
sei
;************************************************* *************
main : rcall delay1
ldi helper,$0C ; thetei Display(On) , Cursor Underline(Off) , Cursor Blink(Off)
rcall entoli
ldi helper,$38 ; thetei 8-bit transfer , 2 line mode , 5x7 format
rcall entoli
;************************************************* *****************************
; i parakatw sinartisi kathorizei ta grammata kai grafei "Επιστήμων"
ldi helper,$01 ; katharizei tin othoni
rcall entoli
rcall delay1
ldi helper,$80 ; thetei ton cursor sti thesi $00 tis CGRAM
rcall entoli
rcall delay1
ldi helper,$00 ; emfanizei ta dedomena pou yparxoun se ekeines tis theseis
rcall write
ldi helper,$01
rcall write
ldi helper,$02
rcall write
ldi helper,$03
rcall write
ldi helper,$04
rcall write
ldi helper,$05
rcall write
ldi helper,$06
rcall write
ldi helper,$07
rcall write
; rcall delay1
; rcall delay1
; rcall delay1
; rcall delay
; rcall delay1
ldi helper,$40 ; grafei to gramma 'Π' sti thesi $00 tis CGRAM
rcall entoli
ldi helper,$1F
rcall write
ldi helper,$11
rcall write
ldi helper,$11
rcall write
ldi helper,$11
rcall write
ldi helper,$11
rcall write
ldi helper,$11
rcall write
ldi helper,$11
rcall write
ldi helper,0
rcall write
; rcall delay1
; rcall delay1
; rcall delay1
; rcall delay1
; rcall delay1
.
.
.
.
.
Δεν ασχολουμε με AVR αλλα αυτο δεν μου φαινεται σωστο.Εχει τον 1200 ενω εσυ εχεις τον 2313
.include "c:\AVR studio\Appnotes\1200def.inc"
Σωστή παρατήρηση!!!
αυτό: .include "c:\AVR studio\Appnotes\1200def.inc" να γίνει
.include "c:\AVR studio\Appnotes\2313def.inc"
μέτα το RESET:
να προστεθού οι δύο γραμμές που έγραψα σε προηγούμενο Post για την αρχικοποίηση του SP register.
Τα δύο παραπάνω λάθη δικαιολογούν το λόγο που δεν λειτουργεί...προς το παρόν...
Τελικά μάλλον δεν φτέει η οθόνη.... Ό τύπος οθόνης που πήρες είναι σωστός... απλά από εταιρεία σε εταιρεία υπάρχουν μικρές διαφορές στην ταχυτητα επικοινωνίας της LCD. Αν λοιπόν κάποιος πάει στα όρια μίας γρήγορης οθονούλας και κάποιος άλλος βάλει μια πιο αργή τότε δεν θα μπορέσει να δουλέψει. Αυτό εννοούσα σε προηγούμενο post αλλα φαίνεται οτι δεν υπάρχει τέτοιο πρόβλημα.
Αν δεν δουλέψει με αυτές τι δύο αλλαγές πρέπει να ελέγξουμε άλλο ένα σημείο...
Ο 1200 με τον 2313 έχει απ΄οτι θυμάμαι διαφορετικό πίνακα διακοπών....και ίσως πρέπει να αλλάξουμε εκείνο το .org$002. (ίσως σε 4 ή 6) Αν δεν σου δουλέψει με αυτές τις αλλαγές θα κοιτάξω τα datasheet να δω αν όντως πρέπει να γίνει τέτοια αλλαγή...
eebabs2000
23-05-07, 13:37
Λοιπόν τα πω τα νέα που έχω μέχρι αυτήν την ώρα. Σε ένα πρόγραμμα που έγραψα που παράγει μία μελωδία (όπου υπάρχουν αρκετά rcall) πρόσθεσα στην αρχή τα εξής χωρίς τη φραση που είπατε παραπάνω:
ldi r16, 255
out $3Ε, r16 ;SPH
οut $3D, r16 ;SPL
Το πρόγραμμα έτρεξε κανονικότατα χωρίς να κολλήσει. Κόλλούσε σε μια συγκεκριμένη νότα και έπρεπε να πειράζω τον κρύσταλλο για να ξεκολλήσει... Τώρα μόλις βάζω τροφοδοσία παίζει αμέσως τέλεια. Με κανέναν άλλο συνδυασμό αυτών των εντολών δεν κατάφερα να το ξεκολλήσω, μόνο έτσι.
Στα άλλα προγράμματα όμως, για παράδειγμα να αναβοσβήνει ένα LED στη πόρτα B με κάποιο delay, που είναι το πιο απλό, δεν έκανε τίποτα, είτε έβαζα τις παραπάνω εντολές είτε όχι.
Αύριο θα δοκιμάσω και τον 1200 και θα σας πω νέα. Έχω και μαθήματα και δε προλαβαίνω πολλά. Θα δοκιμάσω και το παραπάνω
Ευχαριστώ πολύ...
Το καλύτερο είναι να το γράφεις :
ldi r16,
out SPL, r16
Πραγματικό το 255 που γράφεις δεν ξέρω αν είναι η απόλυτη η σχετική διεύθυνση... στον χάρτη μνήμης... ενω το
low(RAMEND) αναφέρεται πραγματικά στην τελευταία θέση μνήμης...
Επίσης ο 2313 δεν έχει SPH. SPH έχει ο 8515
Ακόμα το .org$002 να γίνει .org$006 γιατί έχει διαφορετικό πίνακα διακοπών ο 1200 από τον 2313
Και φυσικά να αλλάξεις και include... Κάποιο άλλο λάθος δεν βλέπω προς το παρόν.
Αυτό ήθελα να γράψω πιο πάνω...
ldi r16, low(RAMEND)
out SPL, r16
eebabs2000
24-05-07, 14:00
Ναι δηλώνωντας και το include.... 2313 το δέχτηκε και ως
ldi r16, low(RAMEND)
out SPL, r16
Και έτσι τα προβλήματα για τον 2313 ξεπεράστηκαν. Μένει να δοκιμάσω τον 1200 με το ρολόι του επιστήμων και τον 8515 ώστε να δουλεύει με εξωτερικό ταλαντωτή.
Γεια σας και απο εμένα .
Χαίρομαι που κάποιος ασχολείται με το ρολόι έστω και για εξάσκηση .
Απο την άλλη βέβαια στεναχωριέμαι που ο eebabs2000 ταλαιπωρείται
χωρίς λόγο μιας και οι μικροελεγκτές 1200 και 2313 έχουν κάποιες
διαφορές τέτοιες ώστε να μη δουλεύει καλά η κατασκευή.
Ομολογώ ότι και εγώ πρώτη φορά βλέπω να εμφανίζονται
τέτοια πράγματα στην οθόνη .
Απο ότι ακούω έχει καταργηθεί ο 1200 συνεπώς
θα πρέπει να γίνουν κάποιες αλλαγές έτσι ώστε να γίνει συμβατό
το πρόγραμμα, με τον 2313.
Είναι μια καλή ευκαιρία για εξάσκηση να γίνει μετατροπή του
κώδικα απο 1200 σε 2313 .
Καλή συνέχεια .
eebabs2000
30-05-07, 11:30
Όντως πήγα να πάρω τον 1200 και δεν υπήρχε και έτσι πήρα τον ATtiny2313. Τι θα μπορούσα να αλλάξω για να το τρέξει; Θέλει ψάξιμο η δουλειά ε; Ευχαριστώ όλους για το ενδιαφέρον και τη βοήθεια...
Να σου πω την αμαρτία μου δεν έχω ασχοληθεί ακόμα με το 2313.
Είχα πάρει προ καιρό αρκετούς 1200 και ακόμα με αυτούς παιδεύομαι.
Πάντως αν έχεις μια μικρή εμπειρία θα τα καταφέρεις σχετικά εύκολα.
Θα πρέπει να πάρεις ένα datasheet με τον 1200 και ένα με τον 2313
και να δεις που έχουν διαφορές τα ποδαράκια , οι καταχωρητές , τα
interrupts και στη συνέχεια να τα αλλάξεις.
Καλή επιτυχία !
Αντικατέστησες το
.org $002
rjmp Time_Ovr
με
.org $006
rjmp Time_Ovr
???
Αν δεν το αλλάξεις δεν θα δουλέψει!! και βάλε και το κατάλληλο Include για τον μικροελεγκτή σου.
Αν και πάλι δεν δουλέψει (που πιστέυω θα δουλέψει) δες το ανάλογο application note στην ΑTMEL που λέει τι αλλαγές που πρέπει να κάνεις από 2313 σε ATtiny2313. Επίσης πιθανότατα υπάρχει και application note για μετατροπή εφαρμογής από τον 1200 στον ATtiny2313.
eebabs2000
02-06-07, 23:30
1000 ευχαριστώ για τη βοήθειά σας... Θα το δοκιμάσω στις επόμενες ημέρες και θα σας πω αποτελέσματα. Το άλλο το πρόβλημα μου είναι ο mega8515. Γιατί δεν χρησιμοποιεί τη συχνότητα του κρυστάλλου που του βάζω και παίζει με τον εσωτερικό ταλαντωτή. Το ίδιο κάνει και ο tiny2313. O 90s2313 όμως χρησιμοποιεί τον κρύσταλλο που του βάζω χωρίς να κάνω κάτι, αλλά και στον προγραμματισμό θέλει οπωσδήποτε κρύσταλλο. Οι υπόλοιποι προγραμματίζονται ακόμα και χωρις κρύσταλλο αλλά και τα προγράμματα τα τρέχουν με τον εσωτερικό ταλαντωτή. Μήπως κάτι πρέπει να θέσω στο Pony prog;
Πως το ξέρεις οτι δεν λειτουργεί με τον εξωτερικό κρύσταλο?
eebabs2000
03-06-07, 00:22
Του βγάζω τον κρύσταλλο και συνεχίζει να λειτουργεί και μάλιστα πιο αργά απ΄ότι τρέχει το πρόγραμμα σε μικροελεγκτή με κρυσταλλο 4ΜΗz λογικά γύρω στο 1ΜΗz πρέπει να είναι ο εσωτερικός...
Του βγάζω τον κρύσταλλο και συνεχίζει να λειτουργεί και μάλιστα πιο αργά απ΄ότι τρέχει το πρόγραμμα σε μικροελεγκτή με κρυσταλλο 4ΜΗz λογικά γύρω στο 1ΜΗz πρέπει να είναι ο εσωτερικός...
Έχεις βάλει τα σωστά fuses ?
eebabs2000
04-06-07, 17:08
Του βγάζω τον κρύσταλλο και συνεχίζει να λειτουργεί και μάλιστα πιο αργά απ΄ότι τρέχει το πρόγραμμα σε μικροελεγκτή με κρυσταλλο 4ΜΗz λογικά γύρω στο 1ΜΗz πρέπει να είναι ο εσωτερικός...
Έχεις βάλει τα σωστά fuses ?
Δηλαδή τι θα πρέπει να ρυθμίσω (δε γνωρίζω και πολλά πράγματα). Στο 90s2313 δε χρειάζεται τίποτα να κάνω, τρέχει απευθείας με τον κρύσταλλο. Στον mega8515 και tiny2313 τι γίνεται;
Ποιό πρόγραμμα χρησιμοποιείς για να τους προγραμματίζεις ?
Θα λέει μέσα κάτι για fuses...Κοίτα εδώ (http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PREV=&P=ATtiny2313) ένα υπολογιστήρι.
edit: Η σειρά ATmega και ATtiny έχουν όλοι και εσωτερικό RC ταλαντωτή και από default δεν χρείαζονται κρύσταλο για να παίξουν. Για να διαλέξεις αν θες κρύσταλο, RC, εσωτερικό ταλαντωτή, εξωτερική πηγή χρονισμού κλπ. πρέπει να παίξεις με τα fuses... Ο 90S2313 έχω μια εντύπωση ότι δεν έχει τέτοιες επιλογές οπότε και γι' αυτό παίζει μόνο με κρύσταλο. Αν είπα κάτι λάθος να με διορθώσει κάποιος πιο έμπειρος..
Αν και δεν έχω παίξει με ATtiny και ATmega καλά τα λες.....
Πρέπει να πάει στο καρτελάκι fuses (υποθέτω οτι προγραμματίζει με STK500 εργαλείο ή AVRISP) και να κάνεις κλικ στην επιλογή κρυστάλλου. (external crystal/resonator)
eebabs2000
05-06-07, 14:14
Τα προγραμματίζω με το Pony prog. Τι κατα τη γνώμη σας πρέπει να πειράξω;
Στο link που σου έδωσα πιο πάνω σου υπολογίζει για τον uC που θες ποια fuses να βάλεις (νομίζω στο ponyprog είναι το παράθυρο "Configuration and Security bits").
ΠΡΟΣΟΧΗ! Αν γίνει κάποια βλακεία με τα fuses, έχω μια εντύπωση ότι μπορεί να μην μπορείς να προγραμματίσεις τον uC με spi και θες high voltage programmer.... (πχ. εδώ (http://www.larsen-b.com/Article/260.html))
edit: Πάντως για AVR χρησιμοποιώ αυτό (http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_en.html) που έχει μέσα τις ρυθμίσεις για fuses κλπ. μαζί με τον avrdude (και τα 2 τρέχουν και σε Windows/Linux/Unix κλπ....)
eebabs2000
06-06-07, 11:56
Ευχαριστώ πολύ!
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.