Wer kann Assembler?

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 27 11 2024  20:48:48      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
Wer kann Assembler?

    







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&auml;ndert von: DonComi am &nbsp;3 Sep 2006 19:13 ]

[ Diese Nachricht wurde geändert von: DonComi am  3 Sep 2006 19:15 ]


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 11 Beiträge verfasst
© x sparkkelsputz        Besucher : 182414743   Heute : 6728    Gestern : 7797    Online : 354        27.11.2024    20:48
10 Besucher in den letzten 60 Sekunden        alle 6.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.088828086853