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
volatileuint8_tzaehler=0;
19
charbuffer[7];
20
21
#define A (1<<PD2)
22
#define B (1<<PD3)
23
24
intmain(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
Michael H. schrieb:> #define A (1<<PD2)> #define B (1<<PD3)Michael H. schrieb:> if(A != B)
Ist die Definition für A/B vielleicht falsch? Was soll das darstellen?
A. S. schrieb:> Ist die Definition für A/B vielleicht falsch?
Falsch ist sie nicht, aber ungeeignet für den Vergleich,
da keine Port-Information gelesen wird.
Michael H. schrieb:> aber troztdem will ich es machen
Dann werde glücklich mit den prellenden Kontakten.
Jeder ist seines eigenen Glückes Schmied.
Kinder müssen auch erst auf die heisse Herdplatte greifen
bevor sie wissen dass das nicht gut ist.
huberdetektor schrieb:> A. S. schrieb:>> Ist die Definition für A/B vielleicht falsch?>> Falsch ist sie nicht, aber ungeeignet für den Vergleich,> da keine Port-Information gelesen wird.
Naja, deshalb habe ich die if-Abfrage mit gepostet. Keine Ahnung, was
der TO hinter PD2 und PD3 konkret versteckt. Wenn es 2 bzw. 3 ist, dann
ist das natürlich falsch.
A. S. schrieb:> was der TO hinter PD2 und PD3 konkret versteckt.
Der TO versteckt da konkret gar nichts, das ist eine Portbit-
Definition aus den Header-Dateien von Atmel.
Wenn du keine Ahnung hast, einfach mal die ....... halten.
Michael H. schrieb:> da steht auch drin warum sparvarianten nicht gut sind,> aber troztdem will ICH es machen.
Ähem, und warum tust DU es nicht?
Hört sich flapsig an, ist aber so: wenn du es nicht selber machst und
kapierst, dann lernst du nur, dass du immer Andere fragen musst.
Lothar M. schrieb:> dann lernst du nur, dass du immer Andere fragen musst.
Ja, und dieses Fragen statt Lernen macht er hier seit fünf
Jahren. Fragen deswegen weil er seit den ersten Posts hier
scheinbar nichts dazugelernt hat. Nach fünf Jahren!
Lothar M. schrieb:> Michael H. schrieb:>> da steht auch drin warum sparvarianten nicht gut sind,>> aber troztdem will ICH es machen.> Ähem, und warum tust DU es nicht?> Hört sich flapsig an, ist aber so: wenn du es nicht selber machst und> kapierst, dann lernst du nur, dass du immer Andere fragen musst.> Ähem, und warum tust DU es nicht?
weil ich es gerade Versuche.
> Hört sich flapsig an, ist aber so: wenn du es nicht selber machst und> kapierst, dann lernst du nur, dass du immer Andere fragen musst.
ich versuche es doch gerade selber zu machen. und die Sparvariante mache
ich damit ich es gemacht habe und nicht nur gelesen habe das es nicht
gut ist.
huberdetektor schrieb:> Wenn du keine Ahnung hast, einfach mal die ....... halten.
Ja, sorry dass Du den Fehler nicht gefunden hast. Ich habe die 3
falschen Zeilen identifiziert, Dein Beitrag ist auch wichtig.
Verpacke die Abfragen der Port Pins am Besten in Funktionen, dann
bekommst du keinen Knoten im Kopf.
Bei der Gelegenheit geben wir PD2 und PD3 ordentliche Namen. Da mit der
Zweck unbekannt ist, nenne ich sie mal Adam und Eva.
Stefan ⛄ F. schrieb:> Verpacke die Abfragen der Port Pins am Besten in Funktionen, dann> bekommst du keinen Knoten im Kopf.
Es gibt ja viele Unterschiede zwischen Makros und Funktionen. Und
entsprechend viele Argumente pro und contro.
Aber für den Knoten dürften die Makros des TO
Michael H. schrieb:> #define Spur_A !(PIND &(1<<PD2))> #define Spur_B !(PIND &(1<<PD3))
nach adam/eva übersetzt, genauso klar sein