Bits schalten

Scheitern auf niedrigem niveau :)

werner mehl
Benutzer
Avatar
Geschlecht:
Alter: 69
Beiträge: 49
Dabei seit: 02 / 2012
Betreff:

Bits schalten

 · 
Gepostet: 28.02.2017 - 17:38 Uhr  ·  #1
Hallo

es wäre sehr nett, wenn mir mal jemand auf die Sprünge helfen kann.
Ich habe zwei Programmversionen die sich unterschiedlich verhalten,
und ich verstehe gerade die Welt nicht mehr :)

Das folgende Programm funktioniert einwandfrei!

--------------------------------------------
--------------------------------------------

program BLS_1;

{$NOSHADOW}
{ $WG} {global Warnings off}

Device = mega16, VCC=5;
{ $BOOTRST $01C00} {Reset Jump to $01C00}

Define_Fuses
// Override_Fuses;
NoteBook = B;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [SPIEN, JTAGEN, OCDEN];

Import SysTick;

From System Import ;


Define
ProcClock = 4915200; {Hertz}
SysTick = 50; {msec}
StackSize = $0064, iData;
FrameSize = $0064, iData;

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }

{--------------------------------------------------------------}
{ Var Declarations }
Var
{$IDATA}

LED[@PortB,5] : Bit;
Licht[@PortA,4] : Bit;
BW1[@PinB,0] : Bit;
BW2[@PinB,1] : Bit;
BW3[@PinB,2] : Bit;

LichtTimer : SysTimer;

{--------------------------------------------------------------}
{ functions }

procedure InitPorts;
begin
DDRA:= %00010000;
DDRB:= %00100000;
end InitPorts;

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
InitPorts;
EnableInts;
SetSystimer(LichtTimer,120); // Einschalten für 0,1 Minute
led := True;
Licht := True;

loop

If BW1 Then
SetSystimer(LichtTimer,240); // 2400 = ca. 120 sek.
led := True;
Licht := True;
EndIf;

If IsSysTimerZero(LichtTimer) Then
led := False;
Licht := False;
EndIf;

endloop;
end BLS_1.

--------------------------------------------
--------------------------------------------

Wenn ich jedoch diese Änderung vornehme, der Rest bleibt gleich.



If BW1 Then
SetSystimer(LichtTimer,240); // 2400 = ca. 120 sek.
led := True;
Licht := True;
EndIf;

If BW2 Then
SetSystimer(LichtTimer,240); // 2400 = ca. 120 sek.
led := True;
Licht := True;
EndIf;


(ich habe auch kürzer formuliert getestet!)

Dann wird beim Programmstart led = true und Licht = true, und bleiben dort bis in alle Ewigkeit.
Vielleicht hat jemand eine Idee, wo ich auf dem Schlauch stehe.

Danke :|
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Re: Bits schalten

 · 
Gepostet: 28.02.2017 - 17:58 Uhr  ·  #2
Hallo Werner,

hast du an B0..2 externe PullDown-Widerstände?
Hast du mal PortB:=PortB and %11111000; mit in dein InitPorts eigebaut?

Gruss
Harry
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Bits schalten

 · 
Gepostet: 28.02.2017 - 20:58 Uhr  ·  #3
Hallo Werner,

im zweiten Fall werden die LEDs offensichtlich nie auf false gesetzt....

rolf
werner mehl
Benutzer
Avatar
Geschlecht:
Alter: 69
Beiträge: 49
Dabei seit: 02 / 2012
Betreff:

Re: Bits schalten

 · 
Gepostet: 01.03.2017 - 09:29 Uhr  ·  #4
Hallo Harry, hallo Rolf,

besten Dank für die Antworten!

Harry, der Tip mit den Pulldown Widerständen war gut!
Ich hatte keine eingebaut, da an den Eingängen aktive Push Pull Stufen sitzen.
Scheinbar kann man sich auf nichts verlassen :)

Besten Dank nochmal
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Bits schalten

 · 
Gepostet: 01.03.2017 - 12:26 Uhr  ·  #5
Hallo Werner,
PullDowns gibt es nur bei den XMegas.
Und PushPull ist nur für Ausgänge relevant.

rolf
werner mehl
Benutzer
Avatar
Geschlecht:
Alter: 69
Beiträge: 49
Dabei seit: 02 / 2012
Betreff:

Re: Bits schalten

 · 
Gepostet: 01.03.2017 - 15:03 Uhr  ·  #6
Hallo Rolf,
das ist mir schon klar. Ich habe mich da vielleicht etwas undeutlich ausgedrückt.
In den externen Sensoren sind am Ausgang Push-Pull Stufen. Deshalb auch "am Eingang" des Controllers ;)

Grüße, Werner
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   110   124 · Page-Gen-Time: 0.057518s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI