Forum: Mikrocontroller und Digitale Elektronik Interrupt - assembler zeigt fehler an


von Christian (Gast)


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

von Tom M. (tomm) Benutzerseite


Lesenswert?

Christian schrieb:
> -->error: Use of undefined or forward referenced symbol 'capt1addr' in
> .org


capt1addr ist undefiniert, wie bist du auf diesen Bezeichner gekommen? 
Siehe AVR-Tutorial: Interrupts.

von g457 (Gast)


Lesenswert?

> -->error: Use of undefined or forward referenced symbol 'capt1addr' in
> .org

..schau doch mal in den header wie das ding richtig heisst, vermutlich 
T1CAPaddr oder so ähnlich.

HTH

von g457 (Gast)


Lesenswert?

..so, habs mal eben noch nachge-dpkg-t:
1
.equ    ICP1addr        = 0x000c        ; Timer/Counter1 Capture Event

HTH

von Christian (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

>   ldi     r16, (1<<TICIE1)      ; TICIE1: Interrupt bei Timer

Du aktivierst den Input Capture Interrupt . Warum sollte dann ein Output 
Capture Interrupt ausgelöst werden?

MfG Spess

von Christian (Gast)


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

von Karl H. (kbuchegg)


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.

von Christian (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der entsprechende Modus heißt: CTC Modus

Dankesehr :)
jetzt gehts
sorry aber ich hab das nicht gelernt und muss mir das jetzt alles selbst 
beibringen :) is nicht so einfach wenn mann der Realschule mit 17 grade 
erst in der 10. lernt was Induktion ist ....

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.