Forum: Mikrocontroller und Digitale Elektronik Zeitschaltuhr ASM Atmega8


von Axel H. (mf-futzi)


Lesenswert?

Hallo an alle,

seit einigen Monaten beschäftige ich mich jetzt mit dem Atmega8 und dem 
Assembler-Tutorial. Ich habe jetzt als erstes Projekt eine Uhr mit 
LCD-Anzeige fertiggestellt, an der ich über 4 Tasten auch Uhrzeit und 
Datum einstellen kann.
Jetzt würde ich meine Uhr gerne als Zeitschaltuhr erweitern. Ich habe 
hier schon im Forum gesucht, aber nichts Passendes gefunden.
Das Meisste ist in C ;-)

Also nach meiner Überlegung brauche ich dazu den Wochentag, die Uhrzeit 
und die Einschaltdauer. Diese Daten muss ich dann im Eeprom ablegen:
Tag, Std, Min, Dauer
1,16,5,10  (für Montag, 16:05 Uhr, Einschaltdauer 10 Min.)
2,6,20,5   (für Dienstag, 6:20 Uhr, Einschaltdauer 5 Min.)

Ist das so richtig? Muss ich dann jede Minute die aktuelle Uhrzeit (und 
Wochentag) mit allen Einträgen im Eeprom vergleichen? Wieviele Einträge 
passen dann in den Eeprom? (Atmega8, Eeprom 512 byte)

Also ich will natürlich keine Anleitung von Euch, sondern nur wissen, ob 
meine Überlegungen in die richtige Richtung gehen.


Danke im Voraus

von fubu1000 (Gast)


Lesenswert?

Ich verstehe kein Wort, was willst du???

von Axel H. (mf-futzi)


Lesenswert?

> Ich verstehe kein Wort, was willst du???

eine Zeitschaltuhr in Assembler programieren.

von Spess53 (Gast)


Lesenswert?

Hi

Wochentag,Stunde und Minute brauchen je ein Byte. Wenn die 
Einschaltdauer 255 min nicht überschreitet dann auch nur ein Byte, also 
zusammen 4. Ansonsten bei maximal 65535 min 5 Bytes. Den Rest kannst du 
dir ausrechnen.
An deiner Stelle wurde ich die Zeiten beim Programmstart aus dem EEPROM 
in den RAM laden und nur bei Änderungen auf den EEPROM zugreifen.

MfG Spess

von Axel H. (mf-futzi)


Lesenswert?

Hallo Spess,

danke für deine Antwort. Das mit dem RAM ist eine gute Idee. Also dann 
werd ich mich mal am Eeprom versuchen. Hab bis jetzt noch nichts damit 
gemacht. Mal sehen, ob ich mit dem Tutorial klarkomme.
(Für die Einschaltdauer werde ich auf jeden Fall 2 Bytes verwenden, 
damit ich auch z.B. mal 8 Std schalten kann).

VG Axel

von Spess53 (Gast)


Lesenswert?

Hi

Du kannst auch die Routinen aus dem Datenblatt verwenden.
Übrigens würde ich beim Übertragen der EEPROM-Daten in den RAM, diese 
gleich zu sortieren. Das erleichtert die spätere Abarbeitung.

MfG Spess

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

ich brauche nochmal Eure Hilfe. Ich habe nach Vorlage der AVR 
Application Note(AVR 100 Accessing the EEPROM) folgenden Code in meinen 
Atmega8 geladen (Auszug):

...
main:

;-------------- Einzelnen Tastendruckauswerten -----------------
        cli
        mov     temp1, key_press
        clr     key_press
        sei


        cpi     temp1, 1<<Taste1       ; wenn Taste 1 gedrückt wurde
        breq    EEPROM_read

        cpi     temp1, 1<<Taste2       ; wenn Taste 2 gedrückt wurde
        breq    EEPROM_write

        rjmp     main

;----------------------------------------------------------------------- 
---------
EEPROM_write:
        sbic    EECR, EEWE
        rjmp    EEPROM_write

        ldi     r18, high(daten)
        out     EEARH, r18
        ldi     r17, low(daten)
        out     EEARL, r17

        out     EEDR, r16

        cli                                     ; Interrupts ausschalten

        sbi     EECR, EEMWE
        sbi     EECR, EEWE

        sei                                     ; Interrups einschalten

        ret
; 
------------------------------------------------------------------------ 
-------

EEPROM_read:
        sbic    EECR, EEWE                      ; EEWE = 0?
        rjmp    EEPROM_read

        ldi     r16, high(daten)
        out     EEARH, r16
        ldi     r16, low(daten)
        out     EEARL, r16

        sbic    EECR, EEWE      ; set EERE

        in      r16, EEDR      ; Daten in r16 laden
        out     led_port, r16                   ; 0b01010101 in LEDs 
ausgeben


        ret
; 
------------------------------------------------------------------------ 
-------
...

Also nach meinem Plan sollte beim Drücken der Taste 2 das Muster 
0b01010101 in den EEPROM geladen werden, und beim Drücken von Taste 1 
vom EEPROM gelesen werden. D.h. ich habe am PortC Leds angeschlossen. 
Das Datenmuster sollte nun in den Leds erscheinen. Tut's aber leider 
nicht :-(
Also die Tasten habe ich zuvor mit Leds geprüft. Die reagieren auf 
Tastendruck. Weis jemand, was ich falsch gemacht habe?

Danke im Voraus

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

also mit meinem Eeprom komme ich einfach nicht weiter :-(
Ich lade mit Ponyprog die eep-Datei in das eeprom (ich kann auch im 
PonyProg-Fenster die Daten im Hex-Format sehen).

Wenn ich dann aber in PonyProg ein neues Fenster öffne und die Daten aus 
dem Eeprom wieder lade, wird nur 'FF FF...' angezeigt, d.h. der Eeprom 
ist leer???

Was mach ich nur falsch?

von Spess53 (Gast)


Lesenswert?

Hi

Der EEPROM wird beim Programmieren des Flashs gelöscht. Das kann man 
vermeiden, in dem man das EESAVE-Fusebit setzt.

MfG Spess

von Axel H. (mf-futzi)


Lesenswert?

Hallo Spess,

das EESAVE-bit hatte ich schon gesetzt. Also sofort nach dem Brennen in 
den Eeprom lese ich wieder zurück nach PonyProg (Read Data Memory 
EEPROM). Da müsste ich die Daten doch sehen, oder??? Aber alles 'FF 
FF...'

von Spess53 (Gast)


Lesenswert?

Hi

Im Prinzip ja. Aber ich kenne PonyProg nicht. Da müssten andere helfen.

MfG Spess

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

also das Schreiben des Eeproms per Tastendruck habe ich nun hinbekommen. 
Ausserdem muss man im PonyProg-Fenster mit der Laufleiste nach unten 
fahren. Dort stehen die ' blauen FF's ' und meine Datenbytes sind dort 
sichtbar.

Aber das Vorbelegen des Eeprom mit brennen der eep-Datei klappt leider 
noch nicht.

Als nächstes stellt sich für mich die Frage, wie ich die Daten vom 
Eeprom in den SRAM bekomme. Ganz zu Schweigen dabei zu Sortieren. Klar 
ist mir nur , dass ich das nur einmal beim Programm-Start durchführen 
muss. Wenn ich das richtig verstanden habe, dann müssten auch alle Daten 
des Eeprom (512Byte) in den SRAM passen (1k Byte).

Für einige Tipps wäre ich sehr dankbar.


Axel

von Axel H. (mf-futzi)


Lesenswert?

Hallo an alle,

also das Vorbelegen des Eeproms hab' ich mittlerweile auch hinbekommen. 
War mein Fehler. Im PonyProg muss die eep-Datei mit der Taste 'Open Data 
Memory File' geöffnet werden. Ich hatte zuvor die 'normale' Öffnen-Taste 
(Open Device File) verwendet.

Wenn mir jetzt noch jemand einen Tipp geben könnte, wie man die Daten 
vom Eeprom in den SRAM bekommt, wäre ich sehr dankbar.


Axel

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.