Forum: Mikrocontroller und Digitale Elektronik 8051 - Tage-Zähler (bis 30 Tage müssen gezählt werden)


von Thiemo (Gast)


Lesenswert?

Hallo

Ich habe einen Atmel 8051 (89c51RD2-CM)und ein laufendes
Assembler-Programm in das ich einen Tage bzw Wochenzähler (bis zu 30
Tage oder 4 Wochen zählen und dann wieder bei 0 starten) integrieren
muß.
Das Zählerprogramm muß/kann im Hintergrund laufen und nicht grösser
sein als 2,8 kb.

Kann mir bitte jemand ein Assembler-Programm schicken  !?!

Oder weiß jemand wo ich so ein Programm runterladen kann ?

Im voraus DANKE !!!

Mit freundlichen Grüssen
Thiemo

von Benedikt (Gast)


Lesenswert?

Ich sag nur Timer Interrupt und Zähler...

von Der Elektrische Reiter (Gast)


Lesenswert?

Wie wär's mit einem Wettbewerb: Wer schreibt das kürzeste Programm zur
Lösung diesen Problems?

cu

von Rufus, das dicke Ei (Gast)


Lesenswert?

Immer wieder amüsant, diese verzweifelten Versuche, sich die
Hausaufgaben von anderen machen zu lassen...

von Grazzy (Gast)


Lesenswert?

könnte dir nur ein c-proggi anbieten!!!!

mfg grazzy!!

von chose (Gast)


Lesenswert?

Wie genau muß das Ding sein ?

von Jochen (Gast)


Lesenswert?

also ich glaub 2,8KB des reicht niemals brauchen da mindesten 300kb
FLASH speicher und 1MB RAM

ne wie benedikt bereits gesagt hat timer baustein nehmen der alle 1ms
oder größer einen interrupt auslöst dann brauchst du 4 bytes um die
30*24*60*60*1000 ms zu speichern ja
wie man denn 4bytes hochzählt:
schauen wir mal wie ein C-compiler das macht

    23: void main (void) {
    24:         unsigned long int ttt=2592000000;
    25:
C:0x0C0A    750B00   MOV      0x0B,#0x00      niedrigstes byte
C:0x0C0D    750AC8   MOV      0x0A,#0xC8
C:0x0C10    75097E   MOV      0x09,#0x7E
C:0x0C13    75089A   MOV      0x08,#0x9A      höchstes byte

    26:         ttt++;
C:0x0C16    E50B     MOV      A,0x0B
C:0x0C18    2401     ADD      A,#0x01
C:0x0C1A    F50B     MOV      0x0B,A
C:0x0C1C    E4       CLR      A
C:0x0C1D    350A     ADDC     A,0x0A
C:0x0C1F    F50A     MOV      0x0A,A
C:0x0C21    E4       CLR      A
C:0x0C22    3509     ADDC     A,0x09
C:0x0C24    F509     MOV      0x09,A
C:0x0C26    E4       CLR      A
C:0x0C27    3508     ADDC     A,0x08
C:0x0C29    F508     MOV      0x08,A

naja und ich bezeifle ja ob ich dir jetzt weitergeholfen hab
ich frag mich warum einer wie du der nicht besonders viel ahnung hat
(2,8kb für diese aufgabe) so etwas macht
außerdem noch als tip:
in diesem forum kommt es überhaupt nicht gut den eindruck zu vermitteln
ich möchte was aber nichts dafür tun. desweiteren hast dafür dass du ein
fertiges programm willst sehr wenig über deine hardware preis
gegeben!!!!!

von Thiemo (Gast)


Lesenswert?

Hallo Chose

Das Programm muß nicht sehr genau sein. Das mit dem Zähler bekomm ich
schon geregelt, aber mein Problem sind die Zeitschleifen oder
Interrupts.
Das Programm, daß ich geschrieben habe hat 3,2 kb und wenn ich es in
mein laufendes Programm einbaue komm ich über 4 kb. mein Controller hat
nur 4 kb und ich möchte den Speicher nicht vergrößern.

Gruß
Thiemo

von Peter D. (peda)


Lesenswert?

"Wie wär's mit einem Wettbewerb: Wer schreibt das kürzeste Programm
zur Lösung diesen Problems?"


LOC  OBJ            LINE     SOURCE

                       1     $include(reg8252.inc)
                =1    99     $list
                     100
                     101
  EF3C               102     reloadval       equ     -4292   ;194Hz at
10MHz
                     103
  0030               104     count_1_3s      equ     30h
  0031               105     count_337s      equ     31h
  0032               106     count_1d        equ     32h
  0033               107     day             equ     33h
                     108
0000                 109             org     00000h
0000 014F            110             ajmp    init
                     111
002B                 112             org     0002Bh
002B 012D            113             ajmp    IT2
                     114
002D C2CF            115     IT2:    clr     TF2
002F D53011          116             djnz    count_1_3s, IT2RET
0032 D5310E          117             djnz    count_337s, IT2RET
0035 D5320B          118             djnz    count_1d, IT2RET
0038 C533            119             xch     a, day
003A 04              120             inc     a
003B 641E            121             xrl     a, #30
003D 6002            122             jz      IT21
003F 641E            123             xrl     a, #30
0041 C533            124     IT21:   xch     a, day  ;day = 0, 1, 2 ..
29, 0
0043 22              125     IT2RET: ret
                     126
0044                 127     init_t2:
0044 75CBEF          128             mov     RCAP2H, #high(reloadval)
0047 75CA3C          129             mov     RCAP2L, #low(reloadval)
004A D2AD            130             setb    ET2
004C D2AF            131             setb    EA
004E 22              132             ret
                     133
004F 1144            134     init:   call    init_t2
0051 80FE            135     main:   jmp     $
                     136
                     137     end


Peter

von Thiemo (Gast)


Lesenswert?

Hallo Jochen

Danke für den Tip. Ich will ja nicht als "ABZOCKER" dastehen.
Und es ist auch keine Hausaufgabe wie einige meinen. Ich hab mir da was
in den Kopf gesetzt und dachte eigentlich, daß es nicht so schwer werden
würde. Das Hauptprogramm hab ich schon selbstständig geschrieben (mit
kleinen Hilfestellungen, für die ich auch recht dankbar bin) und jetzt
hab ich ein Problem, zudem ich keine Lösung finde. Ich beschäftige mich
noch nicht zu lang mit Compilern und der Assembler-Sprache. Leider hab
ich jetzt nicht mehr genug Zeit mich intensiever mit dem Thema zu
beschäfigen (ich hab mit dem Hausumbau begonnen).
Ich glaub dann werd ich dieses Thema auf EIS legen, bis ich wieder
genug Zeit habe.
Leider kann ich mit den C-Code hier nicht zuviel anfangen.

Aber ich DANKE allen die mir geholfen haben.

Was möchtest Du über mein Projekt oder Hartware wissen ?

Gruß
Thiemo

von Peter D. (peda)


Lesenswert?

"Das Programm, daß ich geschrieben habe hat 3,2 kb"


Du lügst uns doch die Hucke voll !

Du hast auf keinen Fall dafür 1600 Assembler Zeilen geschrieben !


Peter

von Jochen (Gast)


Lesenswert?

du verwendest 4 bytes 32bit um die millisekunden zu zählen
1. byte bit 0 - 7   = byte1
2. byte bit 8 - 15  = byte2
3. byte bit 16 - 23 = byte3
4. byte bit 24 - 31 = byte4

wie du ein interrupt vektor setzt weißt du?

isr_timer:               wird z.b. alle 1ms aufgerufen
    MOV      A,byte1
    ADD      A,#0x01
    MOV      byte1,A
    CLR      A
    ADDC     A,byte2
    MOV      byte2,A
    CLR      A
    ADDC     A,byte3
    MOV      byte3,A
    CLR      A
    ADDC     A,byte4
    MOV      byte4,A
reti

schon ist in den byte1 - byte4 der zählerstand in ms

von Thiemo (Gast)


Lesenswert?

Hallo Peter

Danke für das Programm. Ich hab es mir schon ausgedruckt und werd es
mir anschauen. Ich versteh noch ein paar Befehle und Sprünge noch
nicht, aber ich werd es hoffendlich hin bekommen.
Wenn ich meine Fragen micht lösen kann, werd ich mich sich bald
melden.
Wenn man fragen darf, sind Controller Dein Hobby oder hast Du beruflich
damit zu tun ?

Gruß
Thiemo

von Jochen (Gast)


Lesenswert?

ja beschreib mal genau was das für ein projekt ist??

von Jochen (Gast)


Lesenswert?

@peter dannegger
naja ich hab den source code noch nicht gesehen vielleicht sind's ja
nur 500bytes code und der rest sind daten

von Thiemo (Gast)


Lesenswert?

Hallo Jochen

Ich hab ein Aquarium und möchte den PH-Wert mittels Controller messen
und regeln.
Der Ist-PH-Wert wird mit einer PH-Wertsonde (Das Sondensignal wir durch
eine kleine Schaltung angepasst) gemessen, gesichert und
ausgegeben(LCD). Diesen Wert vergleich ich mit dem eingestellten
Sollwert (Sollwert wirt mittels eines Potis - Spannungsteiler
eingestellt). Den Sollwert geb ich auch an dem Display aus.
Wenn der PH-Wert zuhoch ist gebe ich CO2 (Ventil) zu und der PH-Wert
sinkt.
Und ich messe auch noch die Temperatur (auch mit einer Zusatzschaltung
angepasst), welche durch Tastendruck angezeigt wird.

Ich hoffe ich hab es Dir gut genug beschrieben. Wenn ich es fertig habe
kann ich Dir ja mal ein paar Bilder und weitere Daten schicken.

Gruß
Thiemo

von Thiemo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Peter

Zu Deinen Anschuldigungen :

Ich hab als Grund-Programm ein Digital-Uhr-Programm genommen und dieses
(versucht) so um zu schreiben, daß es in mein Programm passt.
Dieses Programm hat 3 kb. Leider läuft das Programm nicht wie ich will
und es ist auch noch zu groß. Ich weiß nicht was ich falsch gemacht
habe, werde es aber noch herausfinden.
Aller Anfang ist schwer !!! Und ich habe noch nicht genug Erfahrung mit
der Assembler-Programmierung.
Aber ich werd am Ball bleiben und auch dieses Problem irgentwie lösen.
Ich hab Dir die Hex-Datei angehängt, fallst Du mir nicht glauben
solltest.
Und wenn Du willst kann ich Dir auch das Komplette Programm schicken.

Gruß
Thiemo

von Peter Dannegger (Gast)


Lesenswert?

@Thiemo,

ich hatte Dich so verstanden, daß allein die Tageszählung zusätzliche
3,2kB verschlingt.

Aber wie Du ja sehen kannst, benötigt man nur etwa 40 Bytes.

Daher ist es mir völlig unverständlich, wie man da auf 3,2kB kommen
kann.

Meine Antwort war auch in keiner Weise böse gemeint, sondern nur ein
Ausdruck meiner Verblüffung über diese drastische Diskrepanz.



Mit einem HEX-File kann man aber nichts anfangen.

Wenn Du hier was schickst, dann sollte es schon der Quelltext sein,
damit man es auch lesen kann.


Peter

von Thiemo (Gast)


Lesenswert?

Hallo Peter

Könnte ich Dich vielleicht mal anrufen ? Ich hab da ein paar Fragen und
ich glaube, daß man dei Frage besser am Telefon klären kann.
Es geht um ein paar Befehle, mit denen ich nicht so richtig klar komme
(obwohl ich meine Bücher schon durchgewälzt habe).
Wieso nimmst Du den AJMP-Befehl ? Nur weil er weniger Bytes benötigt ?
Was passiert bei dem Setb ET2_Befehl ?

Du kannst mir Deine Nummer auf meine E-Mail schicken, fall es Dir
nichts ausmacht ein paar Fragen von einem "dummen" Anfangen zu
beantworten. ;-)

Im voraus DANKE !!!

Gruß
Thiemo
Suzi79@gmx.de

von Jochen (Gast)


Lesenswert?

naja der µC is schon von atmel hab da nähmlich mal nachgekuckt wies bei
dem den mit timern aussieht naja und ...
http://www.keil.com/dd/docs/datashts/atmel/at89c51xd2_ds.pdf
http://www.atmel.com/dyn/products/product_card.asp?part_id=3044

64kb flash
3x 16bit timer und bis zu 40Mhz net schlecht

mit wieviel Mhz läuft dein µC ist wichtig für den reload wert,
desweiteren was willst du mit der zeit machen

warst ja schon richtig im internet unterwegs nach der suche einer
Lösung :)
http://www.mrunix.de/forums/showthread.php?s=f36807394afe7328ac8ea0754126495b&p=179662#post179662
http://www.wintotal-forum.de/index.php/topic,77553.0.html
http://www.elektronik-kompendium.de/forum/posting.php?id=13774&page=0&category=all&order=time

von Jochen (Gast)


Lesenswert?

ach ja setb ET2 startet den Timer2

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.