spencer wrote:
> Trotzdessen vielen Dank an Fred! tempPINA und pina_last sind übrigens
> char.
Gewöhn dir an, bei Byte-Werten immer einen unsigned char zu
nehmen.
Bei char überlässt du es dem Compiler, ob ein char ein signed char
oder ein unsigned char ist. Um auf Byte-Ebene zu arbeiten, will
man aber meistens eine unsigned Behandlung haben. Dadurch, dass du
gezielt unsigned angibst, schliesst du eine mögliche Fehlerquelle
aus.
> Und hier wird der pina_last gelesen:
> int reade1(void){ // E1 abgleichen
> pina_last = PINA;
> }
Integrier dieses Setzen des pina_last in deine Auswerteroutine!
Zwischen dem Abfragen des PINA für die Auswertung und dem erneuten
Aufruf dieser Funktion vergeht Zeit! In dieser Zeit könnte dein
Eingang seinen Pegel verändern -> mit deiner Strategie kriegst
diesen Pegelwechsel dann nicht mehr mit. Du willst ja den jetzigen
Pegel des Eingangs mit dem Pegel vergleichen, mit dem du die letzte
Auswertung gemacht hast.
1 | unsigned char tempPINA = PINA;
|
2 | unsigned char tempPINC = PINC;
|
3 |
|
4 | unsigned char i;
|
5 | unsigned char h = 0;
|
6 |
|
7 | if (tempPINA != pina_last) //wenn Änderung
|
8 | {
|
9 | e1c = 0xFF;
|
10 |
|
11 | for (i = 0x01; i != 0x00; i = i << 1)
|
12 | {
|
13 | if ((tempPINA & i) ^ (pina_last & i)) //wenn Unterschied
|
14 | {
|
15 | if(pina_last & i) //wenn H-Input
|
16 | e1hi[h] = 1; //dann H-Output
|
17 | else
|
18 | e1lo[h] = 1; //L-Output
|
19 | }
|
20 | h++;
|
21 | }
|
22 | }
|
23 |
|
24 | pina_last = tempPINA;
|
Die for-Schleife sieht etwas gewöhnungsbedürftig aus. Aber zusammen
mit dem Wissen, dass i ein unsigned char ist, solltest du rauskrigen
können, wie das läuft.