Forum: Mikrocontroller und Digitale Elektronik avrdude.exe: verification error


von Alexandra H. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

Lies mal den ganzen Speicher mehrmals aus und vergleiche die Dateien 
miteinander. Sind sie dann immer gleich falsch oder unterschiedlich?

von Stefan F. (Gast)


Lesenswert?

Da fällt mir was auf:

0x0072 -> 0x00E4
0x0100 -> 0x0200

Das ist beide male exakt der doppelte Wert. Kann es sein, dass dein 
Debugger in Byte rechnet, aber die .ORG Anweisung sich auf Words 
bezieht? Das scheint mir durchaus möglich, da der Programmspeicher ja 
16bit breit ist.

von c-hater (Gast)


Lesenswert?

Stefan U. schrieb:

> Das ist beide male exakt der doppelte Wert. Kann es sein, dass dein
> Debugger in Byte rechnet, aber die .ORG Anweisung sich auf Words
> bezieht? Das scheint mir durchaus möglich, da der Programmspeicher ja
> 16bit breit ist.

Also der Atmel-Assembler rechnet im .CSEG definitiv durchgehend mit 
Word-Adressen, also auch bei der .ORG-Direktive.

Allerdings: Auch der Atmel-Debugger zeigt Adressen im Flash in Words an. 
Insofern sollte die Sache also eigentlich konsistent sein.

von Alexandra H. (Gast)


Lesenswert?

Ok. Das mit den Word macht Sinn. Soweit hatte ich nicht gedacht, dass 
nicht der Speicher nicht nur in Byte angegeben werden kann. Werde auf 
jeden Fall schauen, dass ich die Einstellung in Atmel Studio ändern 
werde, dass die Word angezeigt werden.

Aber warum bekomme ich diesen Fehler? Und warum nicht immer?

von Stefan F. (Gast)


Lesenswert?

Vielleicht sind deine Kabel zu lang, die Stromversorgung nicht gut genug 
oder dein Programmieradapter (falls du einen verwendest) taugt nichts.

von Alexandra H. (Gast)


Lesenswert?

Ich habe den Fehler jetzt gefunden. Schreibe Ihn nur hier rein, falls 
irgendwann mal jemand den gleichen Fehler hat und dafür keine Lösung 
findet (wie ich damals).

Hier die abgeänderte Version.
1
;==========================================================================
2
; Deklarationsteil
3
;==========================================================================
4
5
; Include-Datei für Befehle und Register vom Datenblatt einbinden
6
; --> Mikrocontroller = Atmega2560
7
.INCLUDE "m2560def.inc"
8
9
.def akku = r16    ; Arbeitsregister (akku) = Register 16
10
.def delay_0 = r17  ; delay_0 = Register 17
11
.def delay_1 = r18  ; delay_1 = Register 18
12
.def delay_2 = r19  ; delay_2 = Register 19
13
.def delay_3 = r20  ; delay_3 = Register 20
14
.def delay_4 = r21  ; delay_4 = Register 21
15
16
.CSEG      ; Auswahl Programmspeicher
17
.org $00    ; Organisation IVT $0000 = RESET
18
19
RJMP INIT    ; Sprung zum Initialisierungsteil
20
21
;==========================================================================
22
; Initialisierungsteil
23
;==========================================================================
24
25
.CSEG      ; Auswahl Programmspeicher
26
.ORG $72    ; Organisation nach IVT
27
28
INIT:      ; Einsprung in die Initialisierung

von Alexandra H. (Gast)


Lesenswert?

Entschludigung, ausversehen auf abgschicken gedrückt statt auf 
vorschau...


Es ist also kein Puffer zulässig, und man kann also nur direkt nach der 
IVT mit dem Code starten.

Warum, lasse ich so dahin gestellt.

Der Puffer ist auch nicht nötig.

Sollte aber jemand eine Möglichkeit finden um den Puffer doch zu 
ermöglichen, bin ich für Ratschläge nach wie vor offen.

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.