Guten Tag, vielleicht kann mir jemand weiterhelfen. Ich möchte über einen interrupt int0 einen Rotary-Encoder Abfragen und eine Variable hoch oder runter zählen lassen. Dazu möchte ich den Status von PD2 und PD3 Vergleichen. Das heisst ich möchte wissen ob der jeweilige Pin High oder Low ist. ich möchte das so realisieren, wenn der Interrupt an int0 ausgelöst hat. Soll in der ISR dann PD2 mit PD3 verglichen werden. Und wenn PD2 Nicht Gleich PD3 ist soll der zaehler um 1 hochgezählt werden. Alle anderen Fälle um 1 nach unten. es funktioniert auch soweit alles nur weiß ich nicht wie ich das mit dem Vergleichen in der if abfrage richtig schreiben soll. denn so wie ich es jetzt mache zählt mir der Zähler egal in welche richtung ich drehe nur nach oben. hier meine if abfrage zum Vergleich
1 | if(A != B) |
2 | {
|
3 | zaehler++; |
4 | }
|
5 | else
|
6 | {
|
7 | zaehler--; |
8 | }
|
hier der ganze Code
1 | /*
|
2 | * Encoder_Rotary_Externer_Ueber_Interrupt.c
|
3 | *
|
4 | * Created: 01.09.2021 11:20:18
|
5 | * Author : USER
|
6 | *
|
7 | * Atmega8
|
8 | */
|
9 | |
10 | #define F_CPU 8000000
|
11 | |
12 | #include <stdlib.h> |
13 | #include <avr/io.h> |
14 | #include <avr/interrupt.h> |
15 | #include <util/delay.h> |
16 | #include "serial.h" |
17 | |
18 | volatile uint8_t zaehler = 0; |
19 | char buffer[7]; |
20 | |
21 | #define A (1<<PD2)
|
22 | #define B (1<<PD3)
|
23 | |
24 | int main(void) |
25 | {
|
26 | setup_uart(); |
27 | |
28 | DDRD &= ~(1<<PD2); // Eingang PD2 Int0 |
29 | DDRD &= ~(1<<PD3); // Eingang PD3 |
30 | DDRB |= (1<<PB5); // Ausgang PB5 LED |
31 | |
32 | MCUCR |= (1<<ISC00) ; // Int0 jede Flanke löst ein interrupt aus |
33 | //MCUCR |= (1<<ISC01) ; // Int0 fallende Flanke löst ein interrupt aus
|
34 | //MCUCR |= (1<<ISC01) | (1<<ISC00) ; // Int0 steigende Flanke löst ein interrupt aus
|
35 | GICR |= (1<<INT0); |
36 | sei(); // alle Interrupts aktivieren |
37 | |
38 | while (1) |
39 | {
|
40 | itoa( zaehler, buffer, 10); // convert interger into string (decimal format) |
41 | uart_write(buffer); |
42 | uart_write(" Volt"); |
43 | uart_write("\r\n\r\n"); // hier wird zweimal eine neue Zeile begonnen |
44 | //_delay_ms(100);
|
45 | }
|
46 | }
|
47 | |
48 | ISR (INT0_vect) |
49 | {
|
50 | PORTB ^= (1<<PB5); // Toggle LED PB5 |
51 | |
52 | if(A != B) |
53 | {
|
54 | zaehler++; |
55 | }
|
56 | else
|
57 | {
|
58 | zaehler--; |
59 | }
|
60 | |
61 | }
|