Guten Abend,
ich bin neu im Forum und habe leider keine Lösung für mein Problem
gefunden.
Bisher habe ich nur mit einem Mikrocontroller der 8051-Familie kleine
Projekte realisiert. Nun habe ich mir ein Arduino-Board mit einem
ATmega2560 geholt. Dazu habe ich mir das AtmelStudio 7 installiert und
lade das Programm über den avrdude auf meinen ATmega.
Nun habe ich folgendes Problem: Ich bekomme manchmal die Fehlermeldung
avrdude.exe: verification error, first mismatch at byte 0x0200
0x00 != 0x01
avrdude.exe: verification error; content mismatch
Hierbei ist mir aufgefallen, dass diese Fehlermeldung nicht immer kommt.
Wenn ich z. B. die Einsprungstelle .ORG 0x0072 (habe ich gewählt um die
IVT zu überspringen) für meinen Programm-Code wähle, dann läuft das
Programm ganz normal durch (ohne Fehler). Allerdings nehme ich z. B. die
Einsprungstelle .ORG 0x0100 (IVT überspringe mit etwas Puffer – Sinn
lassen wir dahin gestellt), dann erhalte ich die oben genannte
Fehlermeldung.
Des Weiteren ist mir aufgefallen, dass sich der Code im Flash-Speicher
immer um die Einsprungstelle verschiebt (also wenn ich über Debuggen
alles kontrolliere). Wenn ich also z. B. .ORG 0x0072 eingebe, dann
beginnt mein Code bei 0x00E4, bei .ORG 0x0100 beginnt der Code bei
0x0200.
Kann mir vielleicht jemand erklären, wo hier mein Fehler ist?
Hier ist noch mein Programm-Code (wie man daran erkennen kann –
NEULING).
1 | ;--------------------------------------------------------------------------
|
2 | ; Titel : Blinkende LED
|
3 | ;--------------------------------------------------------------------------
|
4 | ; Prozessor : ATmega2560 (8-bit)
|
5 | ; Takt : 16 MHz
|
6 | ; Sprache : Assembler
|
7 | ; Datum : 14.11.2016
|
8 | ; Autor : Alexandra
|
9 | ;--------------------------------------------------------------------------
|
10 | ; Beschreibung : LED an Pin 0 von Port B blinkt
|
11 | ;--------------------------------------------------------------------------
|
12 |
|
13 | ; Include-Datei für Befehle / Register vom Datenblatt einbinden
|
14 | .INCLUDE "m2560def.inc"
|
15 | .def akku = r16 ; Register 16 als Arbeitsregister
|
16 | .def delay_0 = r17 ; Zeitverzögerung (1. Teil)
|
17 | .def delay_1 = r18 ; Zeitverzögerung (2. Teil)
|
18 | .def delay_2 = r19 ; Zeitverzögerung (3. Teil)
|
19 |
|
20 | ; CODE-Segment auswählen
|
21 | .CSEG
|
22 |
|
23 | ; Beginn - Interrupt Vector Tabelle initialisieren
|
24 | RJMP INIT ; (0x0000) Reset-Einsprungstelle
|
25 |
|
26 | ; Interrupt-Vector-Tabelle überspringen (geht bis einschl. 0x0071)
|
27 | .ORG 0x0100
|
28 |
|
29 | ; Initialisierungsteil
|
30 | INIT:
|
31 |
|
32 | ; Stack Pointer laden!
|
33 | LDI akku, high(RAMEND) ; HIGH-Byte der obersten RAM-Adr
|
34 | OUT SPH, akku ; SP auf obersten RAM-Adr (high)
|
35 |
|
36 | LDI akku, low(RAMEND) ; LOW-Byte der obersten RAM-Adr
|
37 | OUT SPL, akku ; SP auf obersten RAM-Adr (low)
|
38 |
|
39 | ; Alle Pins von Port B als Ausgang setzen
|
40 | SER akku ; Arbeitsregister auf 0b11111111
|
41 | OUT DDRB, akku ; Lade 0b11111111 in DDRB
|
42 |
|
43 | ; Zeitverzögerungsvariablen
|
44 | LDI delay_0, $0 ; Lade $0 in delay_0
|
45 | LDI delay_1, $0 ; Lade $0 in delay_1
|
46 | LDI delay_2, $5 ; Lade $0 in delay_2
|
47 |
|
48 | ; Hauptprogramm (Endlosschleife)
|
49 | START:
|
50 |
|
51 | SBI PORTB, 0 ; Pin 0 von Port B setzen
|
52 |
|
53 | RCALL DELAY ; Zeitverzögerung aufrufen
|
54 |
|
55 | CBI PORTB, 0 ; Pin 0 von Port B löschen
|
56 |
|
57 | RCALL DELAY ; Zeitverzögerung aufrufen
|
58 |
|
59 | RJMP START
|
60 |
|
61 | ; Zeitverzögerung (delay)
|
62 | DELAY:
|
63 | DEC delay_0 ; Zeitverzögerung (1. Teil)
|
64 | BRNE DELAY
|
65 |
|
66 | DEC delay_1 ; Zeitverzögerung (2. Teil)
|
67 | BRNE DELAY
|
68 |
|
69 | DEC delay_2 ; Zeitverzögerung (1. Teil)
|
70 | BRNE DELAY
|
71 |
|
72 | RET
|
73 |
|
74 | ; Ende des Quelltextes
|
75 | .EXIT
|
Bitte auch gerne andere Punkte ansprechen, die falsch sein könnten.