Interrupt - assembler zeigt fehler an

Gast #2323695
Lesenswert?

Hallo :)
Ich habe mich als Neuling mal durch die Tutorials geschlagen und eines 
so verändert , das ich gerne immer von bottom to TCNT1x einen Interrupt 
habe bei dem mir r17 incrementiert wird ....
mit dem overflow hats ja geklapt aber jetzt bleibe ich hängen da mir der 
assembler folgenden Fehler auswirft:


-->error: Use of undefined or forward referenced symbol 'capt1addr' in 
.org
-->error: Overlap in .cseg: addr=0x0 conflicts with 0x0:0x1


1
.include "m32def.inc"
2

3

4
.org 0x0000
5
        rjmp    startup                 ; Reset Handler
6

7
.org capt1addr                   ;-->an dieser stelle stand vorher OVF0addr
8
      
9
                                 ;-->das ist die fehler quelle im assembler
10

11
  rjmp    timer0_capture
12

13
startup: 
14
 
15
   ldi     r16, HIGH(RAMEND)    ;Stackpointer
16
   out     SPH, r16
17
   ldi     r16, LOW(RAMEND)     
18
   out     SPL, r16
19

20
   ldi     r16,255            ; Port A auf Ausgang
21
   out     DDRA,r16
22
   
23
   ldi     r17,0
24
 
25
   ldi r16,0xC2
26
   out TCNT1H,r16
27

28
   ldi r16,0xF7
29
   out TCNT1L,r16
30

31
   ldi     r16, 1<<CS11 | 1<<CS10      ;Teiler 64
32
   out     TCCR1b,r16
33
 
34
   ldi     r16, (1<<TICIE1)      ; TICIE1: Interrupt bei Timer capture
35
   out     TIMSK,r16
36
 
37
   sei
38
 
39
loop:  
40

41
   rjmp loop
42
 
43
timer0_capture:                      ; Timer 0 Overflow Handler
44
        out     PORTA, r17
45
        inc     r17
46
        reti



hoffe mir kann jemand helfen ich  kann den fehler nicht finden
MFG Christian
Gast #2323724
Lesenswert?

Ich hab mir das so gedacht war für mich Logisch :)
habe bereits rausgefunden das das falsch ist
aber daran lag es nicht nur ...
im Datenblatt steht:

$016 jmp TIM0_OVF ; Timer0 Overflow Handler

also ist es möglich den befehl "
1
 .org OVF0addr
" durch "
1
 .org 0x0016
" zu erstetzen...

für timer 1 capture steht geschrieben:

$00C jmp TIM1_CAPT ; Timer1 Capture Handler

darauf hin hab ich folgendes eingesetzt :

"
1
 .org 0x000c
"

Assembler hat keine Fehler rausgeworfen jedoch passiert kein Interrupt
woran liegt denn das jetzt?
Gast #2324149
Lesenswert?

okay danke... das leuchtet ein... aber wie mache ich es den jetzt das er 
bis zu dem bestimmten Wert zählt dann einen Interrupt auslöst und dann 
wieder neu bei 0 beginnt und wieder bis zum Wert zählt usw.... Wie muss 
ich meinen code abändern damit das klapt ?
Danke im voraus :)
MFG Christian
#2324165
Lesenswert?

Christian schrieb:
> okay danke... das leuchtet ein... aber wie mache ich es den jetzt das er
> bis zu dem bestimmten Wert zählt dann einen Interrupt auslöst und dann
> wieder neu bei 0 beginnt und wieder bis zum Wert zählt usw....

Dazu willst du den CTC Modus des Timers benutzen.
Denn der macht genau das: Zählen bis zu einem bestimmten Wert und danach 
den Timer auf 0 setzehn und wieder von vorne anfangen. Wobei du bei 
Erreichen des kritischen Zählerstandes einen Output Compare Match 
bekommst.


Der entsprechende Modus heißt: CTC Modus
(Datenblatt nachsehen: Abschnitt "Register Summary" welche BIts in 
welche Konfigurationsregistern gesetzt werden müssen)

Damit der funktioniert, musst du deinen Vergleichswert in ein Compare 
Match Register laden (welches steht wieder im Datenblatt, am einfachsten 
findet man das in der Tabelle über die Modi-Übersicht des Timers heraus, 
wieder im Abschnitt "Register Summary")

Und der Interrupt der ausgelöst wird ist dann ein Compare Match 
Interrupt.
Den musst du daher freigeben und dafür brauchst du einen Handler.

Was du tun musst um den freizugeben, findest du wieder im Datenblatt. 
Rate mal in welchem Abschnitt? Genau "Register Summary" des Timers.

Und wie der Handler heißt. Gut, die Namen folgen alle einem Schema, aber 
wenn man nicht selber drauf kommt, dann kann man auch einfach im 
inc-File nachsehen, welches man ja am Anfang des Codes inkludiert hat. 
Denn da muss der Name irgendwo drinnen stehen. Der Suchbeggriff 
"Interrupt" wird einem da nützlich sein. Und dann sucht man einfach alle 
Vorkommnisse ab, bis man auf eine Aufzählung der Interrupt Handler Namen 
kommt und bei der im Kommentar der entsprechende Compare Match vorkommt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren