Hallo,
wollte gerade ein bisschen programmieren. Bei
ldi r16, 0b00001111
out DDRB, r16
bringt er beim assemblieren folgenden Fehler:
error: Overlap in .cseg: addr=0x9 conflicts with 0x9:0xa
dabei ist im register nichts.
was mache ich dabei falsch?
Die Meldung bezieht sich auch nicht auf das Register, sondern auf den Programmspeicher. Wenn Du allerdings nur eine Codezeile zeigst, kann man nur raten, dass Du irgendwo eine .org-Direktive drin hast, deren Adresse mit dem Rest des Programms kollidiert.
Gast
#680294
Hast du irgendwelche Interrupthandler eingebunden? Welcher Controller? Versuch mal, vor die erste Anweisung deines Programmes folgendes zu setzen: .org $002a
Hallo, Danke für den tip. Hab die .org vom timer falsch geschrieben! MFG
Kleiner Tip: es macht fast immer Sinn, die komplette Interrupt-Vektortabelle einzubauen und in die nicht verwendeten Interrupt-Vektoren ein reti (oder nop reti bei AVRs mit mehr als 8 KiB Flash) reinzuschreiben oder ein (r)jmp zu einer Fehlerbehandlungsroutine. Nur wenn man überhaupt keine Interrupts verwendet, macht es viel Sinn, die Tabelle wegzulassen und direkt im Reset-Vektor mit dem Programm anzufangen.
wie baue ich die ein? Wenn ich die vom tutorial reinschreibe, bringt er nur fehler! eigentlich brauch ich nur den interrupt vom timer0 und vom timer2 beim mega8!
Welche Fehlermeldungen bekommst du denn?
Am Besten die Tabelle aus dem zum Controller gehörigen Datenblatt übernehmen. Dann knallts auch nicht wegen jmp oder rjmp...
Christoph S. wrote: > wie baue ich die ein? > Wenn ich die vom tutorial reinschreibe, bringt er nur fehler! Welche Fehler? > eigentlich brauch ich nur den interrupt vom timer0 und vom timer2 beim > mega8!
Hab nochmal im Tutorial nachgesehen:
Klar bringt der dort Fehler.
Wenn da steht
RJMP SPI_STC
und es gibt kein Label SPI_STC im Code, dann ist das ein Fehler.
Drum steht aber auch nach dem Code der Satz:
Bei unbenutzten Interrupts ist es üblich, statt des Sprungbefehls
einfach den Befehl reti reinzuschreiben.
Aber im Prinzip hast du recht. Das müsste man mal im Tutorial
überarbeiten und eine schöne Interrupttabelle mit .org
Anweisungen aufbauen.
undefined symbol: EXT_INT0 und bei allen anderen vektoren auch. Im Datenblatt hab ich auch keine Tabelle gefunden. bräucht eigentlich nur ein .org OVF0addr für den timer2!!! .org OVF2addr geht nicht, da kommt die Fehlermeldung mit den registern! MFG
Gast
#680366
Datenblatt Seite 47. ale rjmps (bis auf die benötigten) durch RETI ersetzen
So sieht eine saubere Interrupt Tabelle aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
Du möchtest einen Handler für den Overflow Interrupt vom Timer 2 installieren, also tauscht du in der betreffenden Zeile den reti gegen einen Sprung zu deiner Behandlungsroutine.
Hallo, meine persöhnliche Variante:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Generell reti bei unbenutzten Vektoren hat den Nachteil, daß sich bestimmte Programmfehler verstecken können. Ein falscher freigegeber IRQ wird sauber mit reti beendet, das eigentlich gewünschte Routine macht aber scheinbar nichts. Ganz gut wäre sicher ein Error-Handler, der bei allen ungenutzten IRQs aufgerufen wird und mault, dazu bin ich aber auch meist zu bequem... Gruß aus Berlin Michael
Karl heinz Buchegger wrote: > So sieht eine saubere Interrupt Tabelle aus: Ja, man kann es so umständlich machen mit viel Schreibarbeit. Und wenn Du nen anderen AVR nimmst, ist die ganze Tabelle vorn Arsch. Man kann es sich aber auch einfach machen mit einem Macro:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
Und wenn man dann z.B. den ATMega8535 durch nen ATmega32 ersetzen will, einfach nur das Include ändern, mehr nicht. Peter
Peter Dannegger wrote: > Karl heinz Buchegger wrote: >> So sieht eine saubere Interrupt Tabelle aus: > > Ja, man kann es so umständlich machen mit viel Schreibarbeit. > > Und wenn Du nen anderen AVR nimmst, ist die ganze Tabelle vorn Arsch. Eben nicht, die Vektoren sind doch alle einzeln mit .org adressiert. Ich habe diese Version jetzt mal ins Tutorial aufgenommen. Der MACRO-Trick ist natürlich auch nicht schlecht.
Peter Dannegger wrote: > Karl heinz Buchegger wrote: >> So sieht eine saubere Interrupt Tabelle aus: > > Ja, man kann es so umständlich machen mit viel Schreibarbeit. > > Und wenn Du nen anderen AVR nimmst, ist die ganze Tabelle vorn Arsch. > > > Man kann es sich aber auch einfach machen mit einem Macro: Und du denkst ein Neuling versteht was da abgeht :-) Ansonsten: nettes Makro. Das ist das Schöne: da lernen die alten Hasen auch noch dazu :-)
wenn man .org ..... und reti in eine Zeile schreibt, ist diese nur noch halb so lang. Und man sieht gleich, welcher Befehl zu welchem Interrupt gehört, ohne 2 Zeilen lesen zu müssen. (ist es die vorherige oder nachfolgende, könnte doch von Anfängern auch mißverstanden werden). mfg
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.