Autor |
|
|
|
BID = 365904
robodriver Stammposter
Beiträge: 217
|
|
Hallo Leute,
ich habe ein dickes Problem. Ich habe mal ein Programm für einen ATMega8 mit Bascom geschrieben. Dieses auf den Controller gepackt und gut war. Jedoch ist mir nun das Bascom-Programm irgendwie abhanden gekommen. Also habe ich den Controller ausgelesen und mit viel mühe daraus wieder eine Atmel-Hex File gebastelt. Jedoch sind meine Assembler Kenntnisse nicht sehr gut. Hier erstmal die Funktionsbeschreibung:
Es handelt sich leider um ein relativ umfangreiches Programm. Am Controller ist an ADC1 (PC1) ein NTC angeschlossen. Um dann die Analogspannung in eine Temperatur umzurechnen, waren ziemlich viel if-Bedingungen und Umrechnungen notwendig. Und genau diese Umrechnungen brauche ich. (und nur dieser Teil des Programmes ist wichtig, der rest ist unwichtig).
Kann mir da jemand sagen in welchem Teil des Programmes das erfolgt? (ich weiß nicht wie der Befehl lautet den ADC auszulesen bzw. den ADMUX auf den ADC1 zu setzen, ab da müsste es ja los gehen).
Meint ihr das man das herausbekommt?
Bitte, das ist wirklich sehr wichtig.
Vielen Dank schonmal für eure Hilfe.
Das Assembler ist im Anhang
PS: Bitte kein schreck bekommen, das Ding ist ganze 2900 Zeilen lang. Aber ich denke mal, wenn man über "suchen" den Befehl der zum Einlesen des ADC1 zuständig ist sucht, dann kann man das Programm sehr schnell in die Wichtigsten Zeilen Eingrenzen. Wie gesagt, der rest ist absolut unwichtig. Vielleicht können wir dann ja auch die "kurzfassung" mit den Wichtigsten Zeilen hier Posten und dann alles auseinander klamüsern.
|
|
BID = 365908
robodriver Stammposter
Beiträge: 217
|
|
Achso, einwas wollt ich noch dazu sagen:
der ADC0 ist auch in Verwendung, aber was da passiert ist uninteressant.
Und dann ist noch ein Display angeschlossen wo alles angezeigt wird. Der Text lautet:
"Außentemperatur"
" 23,4°C "
Ist ein zweizeiliges Display.
Also müsste der Interessante Teil des Quelltextes zwischen "ADC1 einlesen" und "Außentemperatur an Display senden" liegen. |
|
BID = 365921
Jornbyte Moderator
Beiträge: 7178
|
Poste mal deine Eingangsbeschaltung. Das Bascomprogramm wird in ASM 2/3 kleiner.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 365925
alpha-ranger Schreibmaschine
Beiträge: 1517 Wohnort: Harz / Heide
|
Hallo,
ich glaub, das eigentliche Programm geht nur bis 0B10 h .
Danach kommt nur Datenmüll.
Bascom macht aber leider keinen linearen Assembler, sondern bindet auch viele standartbibliotheken mit ein, z.Bsp den Display-Treiber.
Wenn sich jemand damit eine Woche beschäftigt, wird er Dir in etwa sagen können, was da passiert.
Nehme an, weil Du viele "IF" Bedingungen eingebaut hast, das die Werte durch Vergleichen umgesetzt worden sind. Und jetzt brauchst Du die Tabelle wieder ?
mfG.
_________________
Wie der alte Meister schon wußte: Der Fehler liegt meist zwischen Plus und Minus. :-)
Und wenn ich mir nicht mehr helfen kann, schließ ich Plus an Minus an.
|
BID = 365935
robodriver Stammposter
Beiträge: 217
|
Also Die Beschaltung ist wie folgt:
-VCC, AREF, AVCC liegen auf 5V
-GND auf GND
-Taster mit internem Pull-Up an INT0 (PD2) (wenn der gedrückt wird, wird die Temperatur angezeigt)
-an ADC1 halt der NTC
-an ADC0 eine Spannung die proportional zur eigentlichen Betriebsspannung (12V) ist. Dient zum messen der 12 Volt, aber das ist uninteressant.
-Das Display ist wie folgt Konfiguriert:
16*2
Data mode: pin
Pins:
Enable = Portc.6
RS = Portd.0
DB7 = portd.1
DB6 = Portd.2
DB5 = Portd.3
DB4 = Portd.4
LCD-adresse=C000
RS-adresse=8000
Näheres zu den If-Bedingungen:
Da der NTC eine ziemlich schlecht zu berechnende Kurve besitzt, sah das Programm in etwa wie folgt aus:
Code : |
if adc > 700 then temperatur = adc/90
if adc > 500 and < 700 then temperatur = adc/80
|
|
so in etwa, war natürlich nicht nur adc/80, sondern dann noch etwas mehr, aber immer eine Einschränkung, wenn im Bereich ... dann rechne ...
und was da gerechnet wird, das brauche ich.
wie lautet denn der Befehl den Wert aus dem ADC auszulesen in Assembler, somit müsste man doch zumindest die entscheidende Stelle finden.
(Ab da könnte ich dann ja selber versuchen mich durchzukämpfen)
|
BID = 365937
Jornbyte Moderator
Beiträge: 7178
|
Nu könnte es sein, das ich es vergessen habe zu Fragen, ob es ein NTC100 oder ein NTC1000 ist?
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 365999
Ltof Inventar
Beiträge: 9334 Wohnort: Hommingberg
|
@Jornbyte
Kann es sein, dass Du da etwas verwechselst und PT100, bzw. PT1000 meinst?
@robodriver
Zur Programm-Analyse kann ich leider nichts beitragen, da ich mit PICs arbeite. Jornbytes Frage nach dem Temperaturfühler ist allerdings berechtigt. "NTC an ADC1" sagt garnix. Welcher NTC und wie beschaltet ist die Frage!
Mit dem richtigen Vorwiderstand, bzw. sonst irgendeiner Beschaltung kann man einen NTC schon etwas linearisieren. Der Rest geht z.B. mit einer Korrekturtabelle oder eben auch mit if-then-Abfragen.
Mit einer Hochsprache müsste sich sogar die komische Formel für NTCs im Programm ablegen lassen - denke ich.
Zusammengefasst meine ich, dass es weit weniger aufwändig ist, die Algorythmen der Temperaturmessung neu zu machen, als das disassemblierte Listing zu rekonstruieren. Erst recht, wenn das Programm in einer Hochsprache entstand.
Gruß,
Ltof
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
|
BID = 366009
robodriver Stammposter
Beiträge: 217
|
Hm, vielleicht habt ihr recht.
Aber ich weiß jetzt immer noch nicht was der Assemblerbefehl für das setzen des ADMUX auf den ADC1
und was der Befehl für das einlesen des ADC1 ist (ADC1-Wert in nen Register schreiben)
Wenn mir das noch jemand sagen könnte, dann würde ich selber nochmal versuchen mich durch den assemblercode zu wälzen (man kann ja nur dazu lernen).
|
BID = 366109
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Dazu wird ein Wert in ein Register geschrieben, im Programm sah das wohl mal so aus:
ADCR = &B00101101 (ist jetzt irgendein definierter Name, der die Adresse des Registers beinhaltet, und wird so in Basic verwendet)
In Assembler sieht das wohl anders aus:
out ADCR, (1<<ADMUX0) ;Die Werte spielen keine Rolle, geht ums Prinzip.
So, beim Assemblieren bzw. beim Compilieren werden diese Definitionen wie ADCR oder ADMUX0 durch ihre eigentlichen, maschinenabhängige IO-Adresse ersetzt.
Da hilft nur ein Blick ins Datenblatt, dort die richtige Adresse raussuchen und schauen, wo sie im disassemblierten Programm benutzt wird und welcher Wert reingeschrieben wird.
_________________
|
BID = 366117
robodriver Stammposter
Beiträge: 217
|
ja, soweit war ich auch schon. Die Adresse für den ADMUX lautet 0x27. Und wenn man das Assembly durchsucht, dann findet man es an folgenden Stellen:
Code : |
+0000049F: E257 LDI R21,0x27 Load immediate
+00000510: E257 LDI R21,0x27 Load immediate
+00000612: E257 LDI R21,0x27 Load immediate
+00000621: E257 LDI R21,0x27 Load immediate
+00000693: E257 LDI R21,0x27 Load immediate
+000006A2: E257 LDI R21,0x27 Load immediate
+00000714: E257 LDI R21,0x27 Load immediate
+00000723: E257 LDI R21,0x27 Load immediate
+00000795: E257 LDI R21,0x27 Load immediate
+000007A4: E257 LDI R21,0x27 Load immediate
|
|
und das war alles. also wird eigentlich nie was aus der Adresse 0x27 ausgelesen, sondern immer nur der Wert 27h in das Register 21 geschrieben. Oder sehe ich das falsch?
|
BID = 366121
Jornbyte Moderator
Beiträge: 7178
|
In den ADMUX schreibt man mit OUT und nicht mit LDI.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 366133
robodriver Stammposter
Beiträge: 217
|
ja und eben genau das meine ich.
Irgendwo in dem Quellcode muss doch was stehen, das in 0x27 was geschrieben wird.
Aber die von mir aufgeführten Zeilen sind im GESAMTEN Code die einzigen vo 0x27 vor kommt.
0x27 gibt es in KEINE EINZIGEN ANDEREN ZEILE!
Das ist es was mich so verwundert.
da müsste doch irgendwo was von out 0x27,2 oder so stehen.
Aber sowas gibt es nicht
|
BID = 366146
Ltof Inventar
Beiträge: 9334 Wohnort: Hommingberg
|
Wenn ich das richtig sehe, hat der Disassembler den Registern Namen verpasst. Du musst also eher nach etwas suchen, was "R27" heisst. "R27" hat aber ne andere Funktion als ADMUX. Ich kenne mich halt nur mit PICs aus und das Datenblatt erscheint mir etwas unübersichtlich...
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
[ Diese Nachricht wurde geändert von: Ltof am 3 Sep 2006 18:12 ]
|
BID = 366170
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Nein, Arbeitsegister werden nicht so beschrieben.
Es muss irgendwas geben, wo mit dem out-Befehl in das ADMUX geschrieben wird.
Es kann aber auch sein, dass die Bits dort mit Bitmanipulationsbefehlen gesetzt wurden!
_________________
|
BID = 366174
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Im Code sind sehr viele sbi- und cbi-Befehle vorhanden.
Ich sag doch, Basic taugt nichts...
So, der Initialwert von ADMUX ist 0x00. Wird Kanal0 benutzt, muss in ADMUX auch nichts geschrieben werden!
Edit:
Wer sagts denn:
Code : |
+000000DE: B987 OUT 0x07,R24 Out to I/O location
|
|
Wer sucht, der findet... Schau mal im Datenblatt, dort steht neben dem 0x27 auch ein 0x07 in Klammern.
[ Diese Nachricht wurde geändert von: DonComi am 3 Sep 2006 19:13 ]
[ Diese Nachricht wurde geändert von: DonComi am 3 Sep 2006 19:15 ]
|