PWM Initialisierung beeinflusst externe Interrupts

Gast #4122721
Lesenswert?

Hallo!

Ich versuche ein 2-rädriges Fahrzeug mit Rad-Encodern zu bauen.
Diese werden über Lichtschranken realisiert und alles funktioniert 
soweit super.

Also ich kann die Flanken des Encoders über einen Interrupt einlesen und 
daher die Anzahl der durchlaufenden "Löcher" über UART ausgeben.


Sobald ich jedoch einen beliebigen Timer für ein PWM Signal 
initialisiere funktioniert das nicht mehr ganz so.
Dann werden manchmal mehrere Flanken erkannt (oft 2 auf einmal oder ganz 
viele hintereinander) und der Encoder wird unbrauchbar.

Ich nutze ein Arduino Mega (ATMega 2560), und programmiere diesen mit 
dem AVR-GCC Compiler.
PWM funktioniert einzeln und auch die Interrupts funktionieren einzeln, 
zusammen jedoch leider nicht

hier der Code:
1
#include <avr/io.h>    #include <util/delay.h>
2
#include <stdlib.h>
3
#include <avr/interrupt.h>
4
#include "uart.h"
5

6

7

8

9
uint16_t counter_l=0,counter_r=0;
10
char s[10];
11

12

13

14

15
void PWM_Init(void){
16
    TCCR3A = (1<<WGM30)|(1<<COM3A1)|(1<<COM3B1);
17
    TCCR3B = (1<<WGM32)|(1<<CS31);
18
}
19

20

21
ISR(INT2_vect)
22
{
23
    counter_l++;
24
    uart_puts("Left: ");
25
    uart_puts(itoa( counter_l, s, 10 ) );
26
    uart_puts("Right: ");
27
    uart_puts(itoa( counter_r, s, 10 ) );
28
    uart_putc('\n');
29
}
30

31

32
ISR(INT3_vect)
33
{
34
    counter_r++;
35
    uart_puts("Left: ");
36
    uart_puts(itoa( counter_l, s, 10 ) );
37
    uart_puts("Right: ");
38
    uart_puts(itoa( counter_r, s, 10 ) );
39
    uart_putc('\n');
40
}
41

42

43
void interrupt_init(void){
44
    DDRD &= ~(1<<2);
45
    DDRD &= ~(1<<3);
46
    
47
    EICRA = (1<<ISC21)|(1<<ISC31);            //falling edge detection for ext.int2,ext.int3
48
    EIMSK = (1<<INT2)|(1<<INT3);            //turn on ext.int2,ext.int3
49
    sei();
50
}
51

52

53
int main(void){
54
    //OUTPUTS
55
    DDRE |= (1<<3);    //Motor ? PWM
56

57

58
    DDRE |= (1<<4);    //Motor ? PWM
59
    
60
    //Pre Settings
61
    //PWM_Init();
62

63

64
    uart_init();
65
    interrupt_init();
66
    
67
    //OCR3A=0;
68
    //OCR3B=0;
69
    
70
    while(1){
71
        
72
    }
73
    return 0;
74
}

habt ihr eine Idee, was das Problem sein könnte?
Danke schon mal im voraus!

Gruß Lukas
#4122737
Lesenswert?

Hi Lukas,

also allgemein: Interrupts sollen so schnell als möglich abgearbeitet 
werden.
1
ISR(INT2_vect)
2
{
3
    counter_l++;
4
    uart_puts("Left: ");
5
    uart_puts(itoa( counter_l, s, 10 ) );
6
    uart_puts("Right: ");
7
    uart_puts(itoa( counter_r, s, 10 ) );
8
    uart_putc('\n');
9
}

Dies ist kontraproduktiv und blockiert deine Programmausführung.

Können deine Rad-Encodern prellen ? Dann sollte man diese beiden 
Eingänge durch ein festes Zeitintervall pollen.

Ich würde auch noch bei den Eingänge einen Pullup einschalten.
Gast #4122743
Lesenswert?

Danke für die schelle Antwort!

Die UART Ausgabe ist nur zu Debuggingzwecken und wird so schnell wie 
möglich wieder rausfliegen.
Ist dies trotzdem ein Problem?

Ja das kann sein, aber ich kann es leider nicht messen, da ich kein 
Oszilloskop zur Hand habe.
Jedoch funktionierte es ja vor der PWM Initialisierung.. das macht mich 
ja so stutzig.

Ich habe bis jetzt nur sehr komplizierte Methoden zur 
Softwareentprellung gefunden. Lohnt es sich diese mal genauer zu 
verstehen oder geht es auch einfacher?

Gruß Lukas
#4122755
Lesenswert?

Lukas Wiese schrieb:
> Ich habe bis jetzt nur sehr komplizierte Methoden zur
> Softwareentprellung gefunden. Lohnt es sich diese mal genauer zu
> verstehen oder geht es auch einfacher?

Was meinst Du genau? Ich kenne deine Bibliothek ohne Namen nicht.

Ich verwende die Algorithmen von Peter Dannegger (PeDa), er hat dies für 
Taster und für Drehencoder programmiert.
Damit kann man seine Programme sehr einfacht eventorientiert aufbauen.
Gast #4122780
Lesenswert?

Ich kann leider nicht die Variante des Drehgebers nutzen, da ich keinen 
Gray-Code erzeuge sondern nur das an/aus von einer Lichtschranke 
bekomme.

Aber mal gucken ob sich die Tasterentprellung auf mein Beispiel anwenden 
lässt.
Gast #4123067
Lesenswert?

Ich hab die Lösung!

Also warum das mit der Initialisierung Störung verursacht weiß ich 
nicht..
Nun schick ich das Signal durch einen Schmitt-Trigger, sodass ein klares 
Signal herauskommt und alles funktioniert..
Ich wusste leider bis eben grad noch nicht dass es ein solches Bauteil 
gibt..

Trotzdem danke für die Antworten!

Gruß Lukas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren