Problem mit Interrupt Flankeneinstellung ATmega2560

OP #2467479
Lesenswert?
• ▲
▼
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...
Gast #2467588
Lesenswert?
• ▲
▼
Hi

Du bringst Pinchange-Interrupts und Externe Interrupts durcheinander.

>EICRA |= (1 << ISC01);
>EICRA |= (1 << ISC00);

EICRA hat nichts mit den Pinchange-Interrupts zu tun. PC-Interrupts 
reagieren generell auf jede Flanke. Die auslösende Flanke must du selbst 
ermitteln.

MfG Spess

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.