-
        

Ergebnis 1 bis 7 von 7

Thema: ATmega8 aus dem EEPROM lesen und ins EEPROM Schreiben

  1. #1

    ATmega8 aus dem EEPROM lesen und ins EEPROM Schreiben

    Anzeige

    Hallo Leute hab da ein Problem soll bis morgen früh in Assembler ein Progrämmchen schreiben mit dem man einen Wert aus dem EEPROM liesst diesen inkrementiert und dann wieder ins eeprom schreibt beim entfernen der Stromzufuhr und wiederherstellung soll dies geschehen sprich strom weg strom drann wert im eeprom inkrementieren da ich noch totaler anfänger auf diesem gebiet bin und auch keine Interrupts verwenden möchte habe ich folgendes Programm geschrieben: Ich würde mich freuen wenn ihr es hinbekommt dass es auch wirklich funktioniert ergänzen der main usw da ich wirklich nicht weiss was ich machen muss danke im vorraus







    .include "4433def.inc"

    eep_print:


    ldi r16, 0

    ;;;;out EEAR, r16;; Bei Controllern mit mehr als 256 Byte EEPROM, z.B. dem ATmega8,
    ;;;;;passt die EEPROM-Adresse nicht mehr in ein Byte alleine. Statt einem Adressregister (EEAR)
    ;;;;;gibt es bei diesen Controllern deshalb 2 Register, eines für das Low-Byte (EEARL) und eines für das High-Byte
    out EEARH, r16 ; Hi-Byte: 0*256
    out EEARL, r16 ; Lo-Byte: +0 = Adresse 0
    sbi EECR,EERE ;Lesevorgang starten
    in r17,EEDR ;gelesenes Byte nach r17
    inc r17 ;inkrementiere r17
    out EEDR, r17 ;EEPROM data register
    sbi EECR, EEMWE ;Prepare EEPROM to write to
    sbi EECR, EEWE ;Write to EEPROM
    sbic EECR, EEWE ;EEWE is zero when previous write cycle is finished
    rjmp Eeprom_wait ;If not completed yet, then try again
    reti

    rjmp eep_print ; ... und zum Anfang der Funktion

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    Hier hat der Gerd ein Programm für Dich geschrieben, ich glaube sowas suchst Du, oder?

    Gruß Sebastian

    und auch keine Interrupts verwenden möchte
    ....
    ....
    reti
    ....

    Dir ist die Bedeutung des reti Aufrufes aber klar oder ?
    Außerdem muß vor jedem Zugriff auf EEPROM zuerst geprüft werden, ob er nicht gerade beschäftigt ist.

  3. #3
    ehrlich gesagt nicht wirklich.
    hab mir den oberen code auch aus anderen boards zusammengeschustert bin noch sehr sehr neu auf dem gebiet und hab eigentlich kaum ahnung... die lösung ist gut nur sollen keine leds blinken oder ähnliches es soll nur der wert erhöht werden sonst gaaaar nichts wäre wirklich super toll wenn dass jemand für mich bearbeiten könnte

    Danke und Danke auch für das Programm

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    die lösung ist gut nur sollen keine leds blinken oder ähnliches es soll nur der wert erhöht werden sonst gaaaar nichts wäre wirklich super toll wenn dass jemand für mich bearbeiten könnte
    Moment mal, wo ist das Problem ?
    Das ist wohl das kleinste Problem, oder ?

    Also gut es sind zu entfernen:
    LDI mpr,$FF ; alle Bits von Port B sind Output
    OUT DDRB,mpr
    und
    COM neu ; invertieren
    OUT PORTB,neu ; an Port B
    fertig...
    Warum die Zeilen für die LEDs zuständig sind darfst Du selber rausfinden
    [-(

    Gruß Sebastian

  5. #5
    jooooo thnx a lot hab mir mit hilfe von freunden mal mein eigenes progrämmchen geschrieben könnt ihr mal draufschaun ob ihr Fehler entdeckt? Danke im vorraus Hier der Code:





    .DEVICE "ATMega8"
    ;
    ; Register definitions
    ;
    ;.DEF rmp = R16 ; Multipurpose register
    ;
    ; Constants
    ;
    ;.EQU fclock = 4000000 ; processor clock frequency
    ;
    ; Reset- and interrupt vectors
    ;
    .CSEG
    .ORG $0000
    rjmp main ;
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    ;
    ; Main program start
    ;
    main:



    ldi r16, 0
    ;;;; out EEAR, r16;; Bei Controllern mit mehr als 256 Byte EEPROM, z.B. dem ATmega8,
    ;;;;;passt die EEPROM-Adresse nicht mehr in ein Byte alleine. Statt einem Adressregister (EEAR)
    ;;;;;gibt es bei diesen Controllern deshalb 2 Register, eines für
    ;;;;;das Low-Byte (EEARL) und eines für das High-Byte
    out EEARH, r16 ; High-Byte: 0*256
    out EEARL, r16 ; Low-Byte: +0 = Adresse 0
    sbi EECR,EERE ;Lesevorgang starten
    in r17,EEDR ;gelesenes Byte nach r17
    inc r17 ;inkrementiere r17
    out EEDR, r17 ;EEPROM data register
    sbi EECR, EEMWE ;Prepare EEPROM to write to
    sbi EECR, EEWE ;Write to EEPROM
    sbic EECR, EEWE ;EEWE is zero when previous write cycle is finished
    rjmp Eeprom_wait ;If not completed yet, then try again


    ende_hier_wirklch:
    rjmp ende_hier_wirklich

    ; Hier beginnt nun das Nullsetzen des EEPROMs beim Programmieren
    ; Zuerst wird dem Assembler mitgeteilt, dass der folgende Code in
    ; das EEPROM gehört:
    .ESEG

    ; Jetzt kommt der EEPROM-Inhalt:
    .DB $00 ; Ein Byte mit Null

    ; End of source code

  6. #6
    Bitte bitte schaut es euch an da ich morgen früh abgeben muss DANKE LEUTE

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Ich hab Dir ein funktionierendes Programm gepostet, warum machst Du das wieder nach eigener Nase?
    Hast Du schon meine Tips oben gelesen?
    Hast Du schon das Dattenblatt durchgelesen ?
    Hast Du versucht das Programm von Dir zu Assemblieren?

    Ich mach an dieser Stelle Schluß,

    Gruß Sebastian

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •