www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 EEPROM Adressierungsproblem


Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe die Sufu des Forums benutzt aber nichts gefunden was 
mein Problem betrifft. Ich habe ein Testprogramm in AVR Studio 4 
geschrieben für einen digitalen Funktionsgenerator und benutze einen 
Atmega32. Die 4 verschiedenen Wellenformen habe ich in den internen 
EEPROM des Atmega gebrannt und alle Werte benötigen den gesamten 
Speicher, also 1024 Byte. Nun habe ich aber ein Problem mit der 
Adressierung des EEPROM, ich komme höchstens auf die Adresse 01 1111 
1111 (512 Byte).

Hier die Wellenformen mit highbyte-Adresse:

Sinus:    00
Rechteck: 01
Dreieck:  10
Sägezahn: 11

Wie gesagt, ich kann maximal die Rechteckspannung einstellen. Als Device 
habe ich auch Atmega32 angegeben. Vorher hatte ich Atmega16 angegeben da 
ich mich mit der Speichergrösse verrechnet hatte, hab aber ein neues 
Projekt angelegt und copy-paste in das Neue, aber das dürfte doch kein 
Problem sein oder?

Wenn ich das Programm simuliere läuft auch alles gut bis auf das 
Adressproblem. Bitte um eure Hilfe!

mfg Max

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code?

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja sorry, hier der code:

;*********************************************************************** 
**
;* Titel: DDS-Funktionsgenerator - Testprogramm
;* Autor: Stephany Max
;*
;* Prozessor: ATmega32
;* Quarzfrequenz: 16MHz
;*
;*********************************************************************** 
**

; Vereinbarungsteil

      .INCLUDE  "m32def.inc"  ; AVR-Definitionsdatei einbinden
      .DEF    temp = r16    ; Zwischenspeicher
      .DEF    char = r17    ; Register für Ausgabewerte
      .DEF    WL = r24    ; Doppelregister low-byte
      .DEF    WH = r25    ;     "     high-byte

;Programm-Flash

      .CSEG             ; was ab hier folgt kommt in den
                    ; FlashSpeicher
      .ORG  0x0000         ; Beginn des Programmspeichers

reset:     RJMP  init         ; springe nach 'init'

;Stapel initialisieren (für Unterprogramme bzw. Interrupts)

init:     LDI    temp, HIGH(RAMEND)  ; RAMEND (SRAM) ist in der 
Definitions-
                    ; datei festgelegt (nur High-Byte)
      OUT    SPH, Temp       ; Information in den Stackpointer laden
      LDI    temp, LOW(RAMEND)   ; jetzt Low-Byte
      OUT    SPL, Temp       ;

;Ports definieren

      LDI    temp,0xFF      ; Port C als Ausgang
      OUT    DDRC,temp

      LDI    temp,0x80      ; Bit 7 von Port D als Ausgang
      OUT    DDRD,temp

;Hauptprogramm

main:    LDI    YL,0x00        ; Alle Register mit 0 laden
      LDI    YH,0x00        ;
      LDI    ZL,0x00        ;
      LDI    ZH,0x00        ;

      LDI    WL,0xFF        ;
      LDI    WH,0xFF        ;
      LDI    XL,0xFF        ;
      LDI    XH,0x00        ;

      SBI    PORTD,7        ; Tiefpass einschalten

      LDI    temp,0x00      ; Sinus auswählen

      OUT    EEARH,temp      ;

loop:    ADD    YL,WL        ; 32-bit-Werte miteinander addieren
      ADC    YH,WH        ;
      ADC    ZL,XL        ; Ein Übertrag auf das nächste Reg.
      ADC    ZH,XH        ; muss erfolgen

      OUT    EEARL,ZH      ; EEPROM adressieren

      SBI    EECR,EERE      ; Read Enable aktivieren
                    ; -> EEPROM ist bereit zum Auslesen
      IN    char,EEDR      ; Daten aus EEPROM auslesen
      OUT    PORTC,char      ; Wert ausgeben

      RJMP  loop        ; Rücksprung

.EXIT

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hast du im Programm irgenwo die maximale Speicheradresse für den 
ATMega16 begrenzt -> 'and rxy, $1F' oder so?

MfG Spess

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 wrote:
> Hi
>
> Hast du im Programm irgenwo die maximale Speicheradresse für den
> ATMega16 begrenzt -> 'and rxy, $1F' oder so?
>
> MfG Spess

Wo kann man das denn einstellen?

mfg Max

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

bei 16 Bit-Registern (EEARL/H) muss das High-Register vor dem 
Low-Register geschrieben werden.

MfG Spess

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 wrote:
> Hi
>
> bei 16 Bit-Registern (EEARL/H) muss das High-Register vor dem
> Low-Register geschrieben werden.
>
> MfG Spess

Ist auch alles in Ordnung, also EEARH schreibe ich vor EEARL wie im code 
zu sehen ist.

mfg Max

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 wrote:
> bei 16 Bit-Registern (EEARL/H) muss das High-Register vor dem
> Low-Register geschrieben werden.
Gilt aber nur für solche Register, die einen direkten Einfluss auf die 
Hardware haben oder die durch die Hardware beeinflusst werden können 
(Timer-Zähl- und Compare-Register, ADC-Datenregister...). Trifft hier 
nicht zu. Es muss lediglich zum Zeitpunkt des Read-Strobes eine gültige 
Adresse drinstehen. In welcher Reihenfolge die da reinkommt, ist 
Wurscht.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Max:
Und was passiert, wenn Du anstelle von 0x00 eine 0x03 ins EEARH 
schreibst?

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> @Max:
> Und was passiert, wenn Du anstelle von 0x00 eine 0x03 ins EEARH
> schreibst?

Danke, klappt jetzt! Hatte die Adresse binär angegeben anstatt in hex.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max Stephany wrote:
> Danke, klappt jetzt! Hatte die Adresse binär angegeben anstatt in hex.
Was? Du hast ne 0x11 da reingeschrieben?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Welchen AVR hast du im Simulator eingestellt?

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Gut, hat sich erledigt.

MfG Spess

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Max Stephany wrote:
>> Danke, klappt jetzt! Hatte die Adresse binär angegeben anstatt in hex.
> Was? Du hast ne 0x11 da reingeschrieben?

Genau, ich arbeite oft nur mit hex-Zahlen und manchmal auch binär da bin 
ich wohl durcheinander geraten, tut mir leid.

mfg Max

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Genau, ich arbeite oft nur mit hex-Zahlen und manchmal auch binär da bin
>ich wohl durcheinander geraten, tut mir leid.

AVR-Studio akzeptiert auch  'FF$'. Da kommt man nicht so schnell 
durcheinander.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.