Xmega und Inp_Raise_G funktioniert nicht

  • 1
  • 2
  • Seite 1 von 2
sine_wave
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 55
Beiträge: 27
Dabei seit: 10 / 2022
Betreff:

Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: 17.01.2026 - 12:48 Uhr  ·  #1
Hi,

vielleicht habe ich irgendetwas übersehen, aber aktuell komme ich hier nicht weiter:

Device = XMega256A3, VCC = 3.3;
:
import SysTick, SPI_C, LCDGraphic, ADC_B, I2Cport, SwitchPort_G;
:
define
SwitchPort_G = [RightSwitchPushKey, PinF, 3][RightSwitchCWKey, PinF, 4] [RightSwitchCCWKey, PinF, 5];
:
{ main program }
EnableInts($87); //all levels enabled
:
DDRF.3 := 0; // right switch push input
PIN3CTRLF := %00010000; // internal pull-down
DDRF.4 := 0; // right switch CW input
PIN4CTRLF := %00010000; // internal pull-down
DDRF.5 := 0; // right switch CCW input
PIN5CTRLF := %00010000; // internal pull-down

if bit(PinF, 3) then incl(PortB, 6); else excl(PortB, 6); endif; // das funktioniert
if Inp_Raise_G(RightSwitchPushKey) then incl(PortB, 6); else excl(PortB, 6); endif; // das funktioniert nicht

Die obige Abfrage "if bit(PinF, 3) ... " funktioniert, womit bewiesen ist, dass die Hardware und Pinkonfiguration korrekt sind. Aber Inp_Stable_G() liefert immer False.
Ich komme nicht weiter. Vielleicht erkennt jmd. das Problem?

Compiler Version ist die aktuelle 6.00.05.

/Alois
miparo
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 997
Dabei seit: 09 / 2007
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: 17.01.2026 - 20:59 Uhr  ·  #2
Hi Alois,
du hast keine EdgeMask und Polarity angeben ?
Code

  PolarityP1     = $xx;
  SwitchPort_G   = [RightSwitchPushKey, PinF, 3][RightSwitchCWKey, PinF, 4] [RightSwitchCCWKey, PinF, 5], EdgeMask;
  Debounce       = 5;                 {debounce every 5 SysTicks}   // nur wenn dein SysTick < 10ms ist 


Zumal SwitchPortX eleganter wäre, da deine Bits eh auf einem Port liegen, da ist SwitchPort_G Overdive und kostet nur Zeit.


miparo
sine_wave
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 55
Beiträge: 27
Dabei seit: 10 / 2022
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: 17.01.2026 - 22:50 Uhr  ·  #3
Hi,

ich habe das mal ergänzt:

SwitchPort_G = [RightSwitchPushKey, PinF, 3][RightSwitchCWKey, PinF, 4] [RightSwitchCCWKey, PinF, 5], %00000111;
Debounce = 20;

Ändert aber gar nichts; Inp_Stable_G() liefert immer False.

Bei der Edgematrix bin ich mir nicht sicher, ob die drei Bits rechtsbündig sind. Habs mal mit %11100000 probiert - keine Änderung.

Ich muss SwitchPort_G nehmen, weil ich auf dem PortF noch andere, alternative Portfunktionen habe.

/Alois
miparo
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 997
Dabei seit: 09 / 2007
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: 18.01.2026 - 15:10 Uhr  ·  #4
Hi Alois,
Switchport ändert nichts am Port, ließt nur den Port in einen Rutsch, das stört dann ja nicht auf den anderen Pins.

Nur mal zum testen, das es nicht am SwitchPort_G liegt und evtl. im AVRco 5.xx gegen testen.

miparo
sine_wave
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 55
Beiträge: 27
Dabei seit: 10 / 2022
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: 18.01.2026 - 18:27 Uhr  ·  #5
Hallo,

auch mit SwitchPort1 funktioniert es nicht.
Code

Device = XMega256A3, VCC = 3.3; 

import SysTick, SPI_C, LCDGraphic, ADC_B, I2Cport, SwitchPort1;//SwitchPort_G;

define
  // The XMegas don't provide any Oscillator fuses. 
  // So the application must setup the desired values 
  // possible OSC types: extXTAL, extClock, ext32kHz, int32Khz, int2MHz, int32MHz 
  
  //>> CPU=32MHz, PeripherX4=32MHz, PeripherX2=32MHz 
  OSCtype        = int32MHz, 
                   PLLmul = 4, 
                   prescB = 1, 
                   prescC = 1; 
  SysTick        = 10;                  // msec 
  StackSize      = $0080, iData; 
  FrameSize      = $0120, iData; 
  SPIorderC      = MSB; 
  SPImodeC       = 3; 
  SPIprescC      = 0; 
  SPI_SSC        = PORTC, 4; 
  
  LCDGraphic     = 160, 128, 8;          // x-pix, y-pix, accesswidth 
  LCDgraphMode   = XYaddress, iData;    // linear mode 
  DefCharSet     = 'Graphchars.pchr';   // FileName 
  GViewports     = 1, iData;            // logical ViewPorts, scalings 
  TGraphStr      = 40;                  // Graphic Text String Length 
  
  ADCrefB        = REFintVCC;           // internal Referenz VCC div 1.6 
  ADCprescB      = 32, 12;              // prescaler 32, 12 bits resolution 
  ADCchansB      = [7];                 // only channel 7 
  
  I2Cport        = PortC; 
  I2Cclk         = 1; 
  I2Cdat         = 0; 
  
//  SwitchPort_G   = [RightSwitchPushKey, PinF, 3][RightSwitchCWKey, PinF, 4] [RightSwitchCCWKey, PinF, 5], %00000111;
//  Debounce       = 20;
  PolarityP1       = %00000000;
  SwitchPort1      = PinF;
  Debounce         = 5;

{ main program }
  EnableInts($87); //all levels enabled 

  SwitchPort1_Clear;

  if Inp_Stable1(3) then  incl(PortB, 6); else excl(PortB, 6); endif;


Jedoch
Code

    if bit(PinF, 3) then incl(PortB, 6); else excl(PortB, 6); endif;

funktioniert nachwievor.

Ich denke, ich muss das von der Applikation isolieren, um Einflüsse von den anderen Treibern SPI_C, LCDGraphic, ADC_B, I2Cport auszuschließen.

/Alois
miparo
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 997
Dabei seit: 09 / 2007
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: 18.01.2026 - 18:35 Uhr  ·  #6
Zitat
Ich denke, ich muss das von der Applikation isolieren, um Einflüsse von den anderen Treibern SPI_C, LCDGraphic, ADC_B, I2Cport auszuschließen.


Gute Idee und den AVRco 5 mal testen ,die AVRco.exe kannst ja probehalber so wechseln zum testen.

miparo
sine_wave
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 55
Beiträge: 27
Dabei seit: 10 / 2022
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: Gestern um 19:19 Uhr  ·  #7
Habs mal isoliert - funktioniert auch nicht:

Code

program switchport_test;

{ $NOSHADOW}
{ $WG}                      {global Warnings on} 

Device = XMega256A3, VCC = 3.3; 
{ $BOOTRST $20000}         {Reset Jump to $20000} 

import SysTick, SwitchPort1;//SwitchPort_G;

define
  OSCtype        = int32MHz,
                   PLLmul = 4, 
                   prescB = 1, 
                   prescC = 1; 
  SysTick        = 10;                  // msec 
  StackSize      = $0080, iData; 
  FrameSize      = $0120, iData; 

//  SwitchPort_G   = [RightSwitchPushKey, PinF, 3][RightSwitchCWKey, PinF, 4] [RightSwitchCCWKey, PinF, 5], %00000111;
//  Debounce       = 20;
  PolarityP1       = $ff;
  SwitchPort1      = PinF;
  Debounce         = 5;

implementation

{$IDATA}

procedure InitAll;
begin
  EnableInts($87);  //all levels enabled
  
  DDRB.6 := 1;                         // LED output

  DDRF.3 := 0;                         // right switch push input
  PIN3CTRLF := %00010000;              // internal pull-down
  DDRF.4 := 0;                         // right switch CW input
  PIN4CTRLF := %00010000;              // internal pull-down
  DDRF.5 := 0;                         // right switch CCW input
  PIN5CTRLF := %00010000;              // internal pull-down

  SwitchPort1_Clear;
//  SwitchPort_G_Clear;
end;

{--------------------------------------------------------------} 
{ Main Program } 
{$IDATA}
begin
  InitAll;

  loop
//    if bit(PinF, 3) then incl(PortB, 6); else excl(PortB, 6); endif;     //funktioniert
    if Inp_Stable1(3) then incl(PortB, 6); else excl(PortB, 6); endif;     //funktioniert nicht
  endloop;    { main loop }
  
end switchport_test.



Habe ich irgendetwas vergessen?

/Alois
sine_wave
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 55
Beiträge: 27
Dabei seit: 10 / 2022
Betreff:

Re: Xmega und Inp_Raise_G funktioniert nicht

 · 
Gepostet: Gestern um 20:04 Uhr  ·  #8
Heureka - ich habs!!!

Also, da ich einen XMEGA256A3BU habe, muss ich beachten, dass der Systiick einem 16-Bit Timer zuweisen, wie in Kap. 4.18.7.2 XMega SYSTICK without RTC Timer beschrieben.

Also folgene Korrekturen:

Code

Device = XMega256A3BU, VCC = 3.3;

define
  SysTick        = 10, User;        // 10msec, user = use any regular 16bit Timer
  TickTimer      = Timer_C0;        // use Timer_C0 and no PortPin

Procedure onTickTimer; // onTickTimer(SaveAllRegs); SaveAllRegs not necessary here
begin
ASM: CALL System.$INTERRUPT_SYSTICK_USER;
end;

{ Main Program }
  EnableInts($87);  //all levels enabled 
  TickTimerTime(10000); // 10000usec = 10msec
  TickTimerStart;

loop
  if Inp_Raise1(3) then incl(PortB, 6); else excl(PortB, 6); endif ;
endloop;


Das Problem ist damit gelöst.

/Alois
  • 1
  • 2
  • Seite 1 von 2
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   141   155 · Page-Gen-Time: 0.039433s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI