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 |