mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM lesen ATMEGA644 Assembler


Autor: Martin Teves (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe versucht ein Bascom Programm in assembler zu übersetzen, um es 
im Anschluss zu optimieren.

Funktion: Am Int0 hängt ein Rechteckgenerator. Bei jeder positiven 
Flanke wird ein Bitmuster am PortB ausgegeben und der nächste Wert aus 
dem EEPROM gelesen. Nach 240 Werten soll wieder von vorne begonnen 
werden.


Aber das Programm tut irgendwie nicht das was es soll. Wo liegt mein 
Fehler?

.include "m644def.inc"

.org 0x000
         rjmp main            ; Reset Handler
.org INT0addr
         rjmp int0_handler    ; IRQ0 Handler


main:


.cseg

;Stackpointer initialisieren
    ldi     r16, low(RAMEND)
    out     SPL, r16
    ldi     r16, high(RAMEND)
    out     SPH, r16

;Port B als Ausgang
    ldi     r16, 0xFF
    out     DDRB, r16

;Interrupt Int0 auf steigende Flanke
 lds  r16,EICRA
 sbr  r16, 1<<ISC01 | 1<<ISC00
 sts  EICRA, r16

;Interrupt Int0 einschalten
 ldi  r16, 0x01
 out  EIMSK, r16


 sei         ; Interrupts global einschalten


 ldi     ZL,0x00                     ; Z-Zeiger laden. Der Einfachheit 
direkt adressiert
    ldi     ZH,0x00
    rcall   EEPROM_read                 ; Aufruf des Unterprogramms 
Daten aus EEPROM lesen




loop:
    rjmp loop

int0_handler:


    out     PORTB, r16
    inc     ZL
 cpi  ZL,0xF1
 brne    weiter
 ldi  ZL,0x00
weiter:
    rcall   EEPROM_read                 ; Aufruf des Unterprogramms 
Daten aus EEPROM lesen


   reti


EEPROM_read:
    sbic    EECR,EEPE                   ; prüfe ob der vorherige 
EEPROMzugriff beendet ist


    rjmp    EEPROM_read                 ; nein, nochmal prüfen

    out     EEARH, ZH                   ; Adresse laden EEAR=EEPROM 
adress register
    out     EEARL, ZL
    sbi     EECR, EERE                  ; Lesevorgang aktivieren
    in      r16, EEDR                   ; Daten  aus dem EEprom Daten 
Register ins CPU Register kopieren
    ret


; Daten im EEPROM definieren
.eseg


dta1:
.db 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1
.db 0 , 1 , 0 , 1 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 3 , 3 , 3 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3 , 2 , 3
.db 2 , 3 , 2 , 3 , 2 , 3 , 2 , 1 , 1 , 1 , 1 , 1

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was funktioniert den nicht bzw. in welcher form zeigt sich der fehler? 
kommt müll raus oder reagiert der AVR gar nicht erst?

übrigens ist der erste wert der ausgegeben wird schrott, da dieser nicht 
aus dem eeprom gelesen wird sondern nach dem ablauf deiner 
initialisierung in R16 stehengeblieben ist. ich würd das dahingehend 
ändern, daß die werte zuerst aus dem eeprom gelesen und danach 
ausgegeben werden.

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehe gerade du lädst R16 noch in der initialisierung mit dem ersten 
wert. okay, aber ich würds trotzdem ändern. spätestens wenn er AVR 
irgendwann noch mehr machen soll als EEPROM->PortB gibts probleme damit.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur mal kurz ein paar Gedankengänge:

1) Erst die Interrupts enablen und dann danach den Pointer 
initialisieren? Das sollte in ungedrehter Reihenfolge geschehen!

2) Warum die Tabelle im EEProm speichern? Wird sie während das Programm 
läuft geändert? Wenn nicht, würde ich die Tabelle im Programmspeicher 
unterbringen, du sparst dir dann das Unterprogramm für's EEProm lesen 
und brauchst nur noch ein Befehl (LPM).

3) Du solltest in der Hauptschleife nichts machen und das Lesen und 
Ausgeben zusammen in den Interrupt legen, in der Initialisierung nur den 
Z-Pointer auf den ersten Eintrag und dann auf einen Interrupt warten.


Gruß,
Thomas

Autor: Martin Teves (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1) Stimmt, am besten auch erst nach dem ersten Lesevorgang

2) Ja grundsätzlich sollte das in Zukunft über RS232 nachladbar sein. Ob 
ich das so lasse, muss ich mir nochmal überlegen. Vielleicht reicht mir 
auch der Flash-Speicher für die anderen Daten und mach es nicht mehr 
nachladbar.

Autor: bastler_1651 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du die eepromdaten auch in den atmega geladen? afaik macht der das 
nicht immer automatisch

Autor: Martin Teves (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, EEPROM-Daten habe ich manuell reingeladen und EEPROM File habe ich 
auch überprüft, ist korrekt.

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.