Archiv verlassen und diese Seite im Standarddesign anzeigen : M32 bin ich zu blöd?
sebastian.heyn
29.03.2005, 21:51
Hallo. versucher ein programm zu basteln aber irgendwie will es nicht.
struktur des programms:
hauptschleife:
gosub daten lesen
gosub daten auf rs232 aufrufen
loop
end
timer1: (1hz)
werte verändern
return
timer0: (500hz)
ausgabe der werte auf einem 7-segment (nacheinander)
return
wenn ich timer0 aktiviere geht gar nichts mehr, ist 500 hz zu oft? der m32 läuft bei 4 mhz intern
Hi!
Hm. Wie groß sind deine Stacks?
Do
...
Loop
Du weist schon, oder?
Ganz liebe Grüße,
Tobi
*EDIT*
Hast du die Interrupts für den Counter aktiviert?
(Also, dass das funzt?)
Was willst du eigentlich machen? wa machen die Timer?
eine ISR auslösen doch hoffentlich!?
sebastian.heyn
29.03.2005, 22:37
Also timer0 ist dafür da, das die zwei 7 segment anzeigen gemultiplext dargestellt werden...
ich lese daten von einem anderen controller ein, und gebe diese auf rs232 aus (zeitgleich auf der 7 segment) -> nacheinander der dezimalpunkt zeigt den zustand zum wert an...
brauch ich um sicher zu gehen externe pullups an den eingängen?
wie berechnet man den stack?
do
loop
--> ist mir klar.
timer1 wird als timout counter benutzt.
Wenn man mal davon ausgeht, das UART bei dir sonst geht, INT eingeschaltet ist usw... (schau dir mal das Programm rnAvr an. damit kannst du die Timervorgeben und Teiler einfach berechnen lassen), fallen mir 2 Sachen auf:
1. 500Hz bedeutet jede 2mS wird die ISR aufgerufen. In der Zeit müssen die anderen Programmschritte abgelaufen sein können (ist möglich, je nach Programm).
2. Jede Sekunde sollen 2 ISR aufgerufen werden. Einmal die für 1Hz und die für 500Hz.
ausgabe der werte auf einem 7-segment (nacheinander)
Mit 500Hz??? 15Hz etwa reichen schon, um deinen Augen ein laufendes Bild vorzutäuschen, ohne das man viele Einzelbilder nacheinander sieht.
Wenn das Programm so laufen sollte und die Werte sich immer ändern, wirst du alle 7 Segmente immer dauerhaft leuchten sehen bei 500Hz!
Aber wenn es wirklich so seien soll, würde ich nur ein Timer für 500Hz nehmen und einZähler jedesmal inder ISR auf 500 hochzählen lassen.
Wenn 500 erreicht ist, GOSUB FUNKTION1HZ und du hast ein Timer gespart ;)
HI
Den Stack kannst du mit Options -> Compiler -> Chip einstellen.
Da gibts
- HW Stack
- Soft Stack
- Framesize
Verdopple alle Werte mal.
Denn wenn du mit gosub bzw. goto in die Tiefe springst, merkt sich der AVR die Addresse wo er gerade war im Stack. Dann kann er mit return wieder dorthin springen.
Wenn du sonst irgendwelche Interrupts benutzt (Timer), zählen auch noch die ISRs mit.
Ganz liebe Grüße,
Tobi
sebastian.heyn
30.03.2005, 12:20
Hallo,
danke für die antworten..
Also 500 hz war nur für den wechsel von der einen 7 segment zur anderen. werde den wert mal runter nehmen auf 20. es soll auf gar keinen fall flackern... Was angezeigt wird, wird von dem 1 sekunden timer geändert. werde das mal mit dem hochzählen bis 20 probieren und den 1 timer sparen. macht das ganze wirklich übersichtlicher...
ändere zudem noch was an der hardware. mal schauen
Versteh ich jetzt nicht. Das ganze ist doch kein RAM, das immer ein Refreshzyklus braucht?!
Die Werte, die angezeigt werden sollen, ändern sich jede Sekunde. Dann reicht es doch auch, wenn jede Sekunde die 7 Seg.-Anzeige neu gesetzt wird?
Flackern wäre in diesen Fall ja nur, wenn man das ein- und ausschalten der einzelnen Segmente sehen würde.
Und das lässt sich ja in wenigen Takzyklen machen. Kannst ja ausrechnen, wie schnell das bei 4MHz ungefähr passiert.
HI
Das ist schon richtig. Aber sebastian.heyn möchte die Segmentanzeige wohl gemultiplext ansteuern. Und dazu braucht er eine art Refreshsignal.
Vorteil dabei: verbraucht VIEL weniger IOs.
Ganz liebe Grüße,
Tobi
Das stimmt wohl ;)
Aber ein paar Zeilen mehr Code. So sind 20Hz wohl doch besser als 500Hz. Zumindest wenn der M32 mit 4MHz läuft. Sonst ist ja fast nur die ISR am laufen und der Rest hängt hinterher.
Hi
Genau. Aber lieber ein paar Zeilen mehr code als n mal so viele IOs.
Und beim M32 ist das eh egal.
Grüße!
sebastian.heyn
30.03.2005, 15:58
So viel code weil ich nicht so viele IOs habe. anzeige wie folgt:
int0
wenn bit=0 then zehner aktivieren, zahl anzeigen
wenn bit=1 then einer aktivieren, zahl anzeigen
toggle bit
also nur halb soviel ports verwendet!
umso weniger oft du int0 aufrufst umso mehr flackerts...
darum ging es ja auch nicht. alleine funktioniert die anzeige supi, und alleine der rs232 auch. habe die anzeige erstmal weggelassen. rs232 is wichtiger.
darum ging es ja auch nicht.
Nein, aber um die Zeit, die für den restlichen Programmcode bleibt, bis der 500Hz INT bei 4MHz ausgelöst wird, und das jede Sekunde 2 INT gleichzeitig anstehen.
Wie kommen die Daten über RS232 denn rein? Mit INPUT?
Welche Baudrate?
Hi
Naja; also bei 4 Mhz sollte für 0,5Khz schon noch Zeit sein!
Bei 4 Millionen Befehlen pro Sekunde!
(Ich würde allerdings auch auf 16Mhz umsteigen!!!)
Ich glaube, dass es am Stack liegt.
Ganz liebe Grüße,
Tobi
Kommt auf das Programm drauf an. Ich habe ja auch schon gesagt, das nur diese 2 Funktionen möglich sein sollten. (mit 4MHz und etwa 4MIPS).
Und was bitte hat DO ... LOOP mit Stack zu tun :?: :?: :?:
Hi!
100%ig weiß ich auch nicht was Do ... Loop mit dem Stack zu tun hat, aber ich glaube Bascom sichert die Rücksprungadresse auf dem Stack. Wenn das Programm zu der "Loop-stelle" kommt, dann wird die Rücksprungadresse aus dem Stack ausgelesen und dahin wird dann zurückgesprungen.
Also, wie gesagt, garantieren kann ich es nicht, ich bin mir aber relativ sicher.
Grüße,
Jonas
ACHTUNG: Fehlinformation
Also, wie gesagt, garantieren kann ich es nicht, ich bin mir aber relativ sicher.
Wie kommst du da drauf ? Getestet ? Disassembler ?
Ich bin mir relativ sicher das es so nicht ist.
Die Sprungadresse für LOOP steht fest im Programm und zeigt auch den Befehl nach DO.
Rücksprungadressen werden nur bei GOSUB und Interrupts gebraucht.
Und der Stack, der in BASCOM eingestellt ist, solle eigentlich für das Programm reichen (obwohl es ja immer noch Geheim ist, ob das Programm noch mehr macht) sofern die nicht um einiges geringer eingestellt wurden.
Hi
hauptschleife:
gosub daten lesen
gosub daten auf rs232 aufrufen
loop
end
timer1: (1hz)
werte verändern
return
timer0: (500hz)
ausgabe der werte auf einem 7-segment (nacheinander)
return
Hm. Genau. GOSUB.
Wenn er noch ein paar Funktionen mit ein paar Bytes als Übergabe hat, dann kann er den STACK locker überlasten.
Ich hatte das Problem auch schon!
Wie gesagt: EINFACH VERDOPPELN!!
*EDIT* Habs geändert, nachdem ich gemerkt habe dass ich Schrott geschrieben habe...
Ganz liebe Grüße,
Tobi
Hi!
Ooops, sorry, da hab ich mich wohl vertan!
Kommt davon wenn man, das was man liest nicht richtig verarbeitet. ;)
Ist natürlich richtig, dass wenn man eine Do ... Loop bastelt den Stack nicht braucht.
Grüße,
Jonas
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.