Hallo Forum,
nachdem ich vor ein paar Tagen als Neueinsteiger hier so gut unterstützt
worden bin, wollte ich Euch ein weiteres (für Euch triviales) Problem
schildern.
Ich verwende ein STK600 mit ATmega2560 und AVR Studio5.
In meinem Projekt soll später eine Drehzahlbestimmung eines rotierenden
Teils durch "Durchbrechen" einer Lichtschranke durchgeführt werden (Also
Durchbrüche pro Zeiteinheit). Dafür möchte ich 2 Interruptroutinen
laufen lassen.
Als Newbie funktioniert immerhin das Interrupt schon, jedoch scheitere
ich derzeit an der Justierung der Flankenauslösung. Derzeit wird die
Lichtschranke noch durch einen Taster am Board ersetzt.
Sowohl beim Drücken des Tasters als auch beim Loslassen wird der
Interrupt ausgelöst, zu sehen an den LED. Zwar ist weder SW- noch
HW-seitig entprellt, aber das sollte doch nicht der Auslöser sein, oder?
Ich denke, dass an meinen EICRA-Befehlen was nicht stimmt.
Kann mir jemand helfen?
Hier mein Code:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | #ifndef F_CPU
|
6 | F_CPU = 16000000UL;
|
7 | #endif
|
8 |
|
9 | uint8_t intPortB;
|
10 | uint16_t intCounter;
|
11 | volatile double intTimer;
|
12 |
|
13 | ISR(PCINT0_vect)
|
14 | {
|
15 | intCounter++;
|
16 | PORTC = intCounter;
|
17 |
|
18 | //_delay_ms(3000);
|
19 | }
|
20 |
|
21 | int main(void)
|
22 | {
|
23 | intTimer = 5;
|
24 |
|
25 | DDRC = (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5) | (1<<DDC6) | (1<<DDC7);
|
26 | DDRB &= ~(1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5) | (1<<DDB6) | (1<<DDB7);
|
27 | PORTC = 0b11111100; //Initialisierung: Alles auf High --> LED aus
|
28 | DDRD = 0x00;
|
29 |
|
30 |
|
31 | PCICR |= (1 << PCIE0); //Enable Pin Change Interrupt Pin (0 = PinD0)
|
32 | PCMSK0 |= (1 << PCINT0);//Enable Pin Change Interrupt handling
|
33 | EICRA |= (1 << ISC01); //Definiere Art der Flankenbehandlung für Pin Change Interrupt
|
34 | EICRA |= (1 << ISC00); //Definiere Art der Flankenbehandlung für Pin Change Interrupt
|
35 |
|
36 | while(1)
|
37 | {
|
38 |
|
39 | sei();
|
40 |
|
41 | }
|
42 | }
|
By the way: Weiß jemand on the fly, warum die delay-Befehle so
hundsmiserabel arbeiten? Eingestellt 1000ms --> 1200 ms; 10000 ms -->
4500 ms. Das stimmt doch hinten und vorne nicht...