Forum: Mikrocontroller und Digitale Elektronik Probleme mit Int Capt ISR ATmega48PA


von W.S. (Gast)



Lesenswert?

Hallo,

ich habe Probleme mit der Nutzung des ICP1/PB0 eines ATmega48PA und bin 
beim besten Willen nicht in der Lage das Problem zu lösen.

Prinzipiell läuft mein Programm wie gewünscht bloß wird grundlos 
wiederholt die ICP1 ISR angesprungen und es folgt dann wie gewollt der 
Aufruf weiterer Routinen im Hauptprogramm - u.a. Ausgabe an TX. Selbst 
wenn ich 0<<ICIE setze, auskommentiere oder was auch immer wird die ISR 
angesprungen.
Eine Auskommentierung in der ISR bringt TX dann zum schweigen, das 
Programm läuft also tatsächlich über die INT CAPT ISR in dieses Problem.

Grundsätzlich verstehe ich, dass man ICP1 extern triggern kann und in 
Software über PORTB0 - aber wie in drei Teufels Namen geht der Sprung 
mit 0<<ICIE? Ist die Vectoradresse im Datenblatt falsch, das übrigens 
keine DIL Gehäuse beinhaltet? Oder habe ich ein grundlegendes Problem 
bei der Konfiguration?
Timer1 ist im Mode 4 konfiguriert also CTC mit max Wert in OCR1A - evtl. 
ist hier auch das Problem. Ich brauche aber einen verstellbaren 16bit 
Timer mit OCIE1A ISR bei OCR1A match und gelegentlich eben auch einen 
Timestamp bei ICIE1 an ICP1.

Achso CKOUT fuse kein Haken.

Vielen Dank schonmal für eure Zeit und sachdienliche Hinweise.
Gruß
Wolfgang

1
.org 0x00A  
2
rjmp INT_TIMER1_CAPT    
3
....
4
ldi r16,1<<ICF1
5
out TIFR1,r16    ; Clear ICF1/clear pending interrupts
6
; TIMSK1 Timer/Counter1 Interrupt Mask Register
7
ldi  temp, (1<<ICIE1)|(1<<OCIE1A)
8
sts  TIMSK1, temp
9
; TCCR1A Timer/Counter1 Control Register A
10
clr  temp              
11
sts  TCCR1A, temp
12
; TCCR1B Timer/Counter1 Control Register B
13
ldi  temp, (1<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10)
14
sts    TCCR1B, temp
15
; TCCR1C Timer/Counter1 Control Register C
16
clr  temp
17
sts  TCCR1C, temp
18
....
19
; PORTB - Configuaration
20
ldi  temp, (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(0<<DDB0)  
21
out  DDRB, temp
22
23
ldi  temp, (1<<PORTB0)
24
out  PORTB, temp

von c-hater (Gast)


Lesenswert?

W.S. schrieb:

> aber wie in drei Teufels Namen geht der Sprung
> mit 0<<ICIE?

Nun entweder springst du irgendwie durch einen Programmfehler dorthin 
oder durch instabil laufende Hardware.

Ob es ein Programmfehler ist, kann man nicht beurteilen, denn das, was 
du gepostet hast, kann ja wohl nicht das vollständige Programm sein 
kann.

Und ob die Hardware eventuell instabil läuft, kann man ebenfalls nicht 
beurteilen, da du dazu überhaupt nix gesagt hast, ausser, dass es ein 
M48 ist.

> Timer1 ist im Mode 4 konfiguriert also CTC mit max Wert in OCR1A - evtl.
> ist hier auch das Problem.

Nein, das sorgt eigentlich nur dafür, das mit der Capture-Funktion nicht 
mehr wirklich etwas anzufangen ist. Zumindest verkompliziert es deren 
sinnvolle Nutzung erheblich. Auf die prinzipielle Funktionsweise der 
Capture-Einheit hat es aber keinen Einfluss.

von Peter D. (peda)


Lesenswert?

W.S. schrieb:
> Selbst
> wenn ich 0<<ICIE setze, auskommentiere oder was auch immer wird die ISR
> angesprungen.

Eine CPU versteht keine Prosa, Du mußt schon den Code zeigen.
Dazu gibt es extra den Dateianhang.

von m.n. (Gast)


Lesenswert?

Peter D. schrieb:
> Dazu gibt es extra den Dateianhang.

Das hat er schon verstanden; sind ja immerhin 10,6 MB eines völlig 
unbekannten µCs ;-)

W.S. schrieb:
> aber wie in drei Teufels Namen geht der Sprung
> mit 0<<ICIE?

Das springt ins Auge: 0 * x = 0

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.