Forum: Mikrocontroller und Digitale Elektronik PWM Initialisierung beeinflusst externe Interrupts


von Lukas Wiese (Gast)


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

von Uwe (de0508)


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.

von Lukas Wiese (Gast)


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

von Uwe (de0508)


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.

von Lukas Wiese (Gast)


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.

von Lukas Wiese (Gast)


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

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.