closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

ADC Problem mit Mega328p



grech offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Saarland
Age: 61
Posts: 15
Registered: 10 / 2015
Private message
Subject: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 08:02   -  
Hallo zusammen,
baue eine kleine Steuerung mit einem mega328p.
dabei muss ich die position des Systems mit einem ADC ermitteln.
dafür wollte ich getadc verwenden.
dabei fällt auf, dass die Kanäle bei getadc ab 1 nummeriert werden.
heißt das dann, dass den wert für ADC0 des m328p über getadc(1) bekomme?

jedenfalls habe ich eine kleine Routine geschrieben, die mir alle 8 adcs ausliest und ins eeprom schreibt um rauszufinden wo mein ADC ist.
Aber da bekomme ich immer $03ff, also fullrange.
wenn ich option int2 wähle ist es $03fe.
auch mit dem prescaler hab ich ein wenig probiert. ändert nicht wesentlich was.
was mach ich denn falsch? gibt es eine Startsequenz oder sowas?
wenn ich's richtig verstanden habe wird das handling im Systick gemacht.
Der holt doch dann alle 10 ms einen neuen Wert, rollierend für die aktiven Kanäle ab und startet die nächste wandlung.

Code

PROGRAM Jalousie_v1; 
Device = mega328p , VCC = 5; 
{ $BOOTRST $03800}         {Reset Jump to $03800} 
DEFINE_FUSES
//  Override_Fuses; 
  NoteBook   = A; 
  COMport    = USB; 
  LockBits0  = []; 
  FuseBits0  = []; 
  FuseBits1  = []; 
  FuseBits2  = []; 

IMPORT SysTick , SerPort , PWMport1A , PWMport1B , ADCPort; 
FROM System IMPORT; 
DEFINE
  ProcClock      = 16000000;       {Hertz} 
  SysTick        = 10;             {msec} 
  StackSize      = $0064 , iData; 
  FrameSize      = $0064 , iData;   
  
  ADCchans       = 8 , iData ;
  ADCpresc       = 64;
     
IMPLEMENTATION
{$EEPROM}
STRUCTCONST
  EE_Data       : array[1..8] of word = (0,0,0,0,0,0,0,0);

BEGIN
  InitPorts; 
  InitVars; 
  EnableInts; 
  for bc := 1 to 8 do
    mdelay(100);
    ww := getadc(bc);
    ee_data[bc] := ww;
  endfor;
end.
This post has been edited 4-times. Last edit: 09.07.2019 - 11:17 by grech.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 54
Posts: 1539
Registered: 03 / 2003
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 16:29   -  
Hallo Grech,

ja bei den Megas beginnt der ADC bei 1 (bei den XMegas bei 0).
Wo in deinem Prog ist ww deklariert? Und woher weißt du, was im EEPROM drin steht?
Muß nicht am Ende einer EEPROM-Definition wieder {iData} stehen?

Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
grech offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Saarland
Age: 61
Posts: 15
Registered: 10 / 2015
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 16:36   -  
Das hab ich nur weggelassen, damits nicht so viel zu lesen ist.
Hier der ganze Code
Code

PROGRAM Jalousie_v1; 

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

Device = mega328p , VCC = 5; 
{ $BOOTRST $03800}         {Reset Jump to $03800} 

DEFINE_FUSES
//  Override_Fuses; 
  NoteBook   = A; 
  COMport    = USB; 
  LockBits0  = []; 
  FuseBits0  = []; 
  FuseBits1  = []; 
  FuseBits2  = []; 
  
IMPORT SysTick , SerPort , PWMport1A , PWMport1B , ADCPort; 

FROM System IMPORT; 


DEFINE
  ProcClock      = 16000000;       {Hertz} 
  SysTick        = 10;             {msec} 
  StackSize      = $0064 , iData; 
  FrameSize      = $0064 , iData; 
  
  SerPort        = 31250 , Stop1 , parNone;  {Baud, StopBits|Parity} 
  RxBuffer       = 8 , iData; 
  TxBuffer       = 8 , iData; 
  
  ADCchans       = 8 , iData ;
  ADCpresc       = 16;
  
  PWMres1        = 8;              {bits} 
  PWMpresc1      = 1; 
  PWMmode1       = slow , positive; 
  
  
IMPLEMENTATION
CONST
  
  // Operation 
  Oeffnen : BYTE = 3; 
  Schliessen : BYTE = 2; 
  Stoppen : BYTE = 1; 
  Steht   : BYTE = 0; 
  
  // Modus 
  Inaktiv : BYTE = 0; 
  Teach   : BYTE = 3; 
  Work    : BYTE = 4; 
  Error   : BYTE = 1; 
  Heat    : BYTE = 2; 
  
  // Midi Commands 
  M_noteon : BYTE = $90; 
  M_noteoff : BYTE = $80; 
  M_press : BYTE = $A0; 
  M_cchange : BYTE = $B0; 
  M_pchange : BYTE = $C0; 
  //Tastenoffset 1. Ton = 36 (1+35) 
  M_offset : BYTE = 35; 
  
  M_warteauf_Cmd : BYTE = 0; 
  M_warteauf_CC : BYTE = 1; 
  M_warteauf_VV : BYTE = 2; 
  
  
{$EEPROM}
STRUCTCONST
  EE_accpoint   : WORD = 220; 
  EE_ACC        : WORD = 10; 
  EE_Decpoint   : WORD = 100; 
  EE_dec        : WORD = 10; 
  EE_Accdelay   : WORD = 5; 
  EE_Decdelay   : WORD = 10; 
  EE_SpeedMax   : WORD = 255; 
  EE_SpeedHigh  : WORD = 191; 
  
  EE_SpeedLow   : WORD = 127; 
  EE_SpeedTeach : WORD = 127; 
  
  EE_Maxspeed_ab : WORD = 300; 
  EE_Highspeed_ab : WORD = 150; 
  
  EE_ADCPos_zu  : WORD = 10; 
  EE_ADCPos_auf : WORD = 1000; 
  EE_Breite     : WORD = 32; 
  
  EE_Reserve1   : WORD = $FFFF; 
  
  EE_ADCPos_min : ARRAY[1..30] OF WORD = ( 0 , 0 , 32 , 64 , 96 , 128 , 160 , 192 , 
                                          224 , 256 , 288 , 320 , 352 , 384 , 416 , 448 , 
                                          480 , 512 , 544 , 576 , 608 , 640 , 672 , 704 , 
                                          736 , 768 , 800 , 832 , 864 , 896 ); 
  
  EE_Reserve2   : ARRAY[1..2] OF WORD = ( $FFFF , $FFFF ); 
  
  EE_ADCpos_max : ARRAY[1..30] OF WORD = ( 64 , 96 , 128 , 160 , 192 , 224 , 256 , 288 , 
                                          320 , 352 , 384 , 416 , 448 , 480 , 512 , 544 , 
                                          576 , 608 , 640 , 672 , 704 , 736 , 768 , 800 , 
                                          832 , 864 , 896 , 928 , 960 , 992 ); 
  
  EE_Midichan   : BYTE = 6; 
  EE_Adroffs    : BYTE = 20;   // Adroffset (20 als 1. Adresse) bei jumper 100 => Adresse 21 
  EE_Adr        : BYTE = $FF; 
  ee_Soll       : BYTE = $FF; 
  EE_Data       : array[1..8] of word = (0,0,0,0,0,0,0,0);
  
{$IDATA}
VAR
  //Port Definitionen 
  I_zu[@Pind , 3]     : BIT; 
  I_auf[@Pind , 2]    : BIT; 
  I_Taster[@Pind , 4] : BIT; 
  
  O_rot[@PORTB , 4]   : BIT; 
  O_gruen[@PORTB , 5] : BIT; 
  O_led[@PORTB , 5]   : BIT; 
  
  O_motor_on[@PORTB , 3] : BIT; 
  
VAR
  Midichan            : BYTE; 
  Adroffs             : BYTE; 
  
  Bloc                : BYTE; 
  Accval , Decval     : WORD; 
  Accpoint , Decpoint : WORD; 
  Accdelay , Decdelay : WORD; 
  
  Teachstep , 
  Speedmax , 
  
  Speed_teach , 
  Speed_high , 
  Speed_low , 
  Speed_max           : WORD; 
  
  
  
  //Array 1..30  Schwelerpositionen MIN und MAX 
  //Namenskonvention: 
  //ADC => es sind die ADCwerte gemeint also von  0 ..1023 (10 bit) 
  //SW => es ist die Schwelltrittepos gemeint also von 1 .. 30 
  Adcpos_min          : ARRAY[1..30] OF WORD; 
  Adcpos_max          : ARRAY[1..30] OF WORD; 
  
  Adcpos_auf , 
  Adcpos_zu           : WORD; 
  
  Adcpos , 
  Adcpos_old , 
  Adcpos_soll_min , 
  Adcpos_soll_max , 
  Adcpos_diff         : WORD; 
  
  R_heat , L_heat     : WORD; 
  Adc_gleich          : BYTE; 
  
  Speed               : WORD; 
  Swpos_soll          : BYTE; 
  
  Highspeed_ab , 
  Maxspeed_ab         : WORD; 
  
  
  Ready , 
  Highspeed , 
  Maxspeed , 
  Newsoll , 
  Ganz_zu , 
  Ganz_auf            : BOOLEAN; 
  
  Ww                  : WORD; 
  
  Operation           : BYTE; 
  Modus               : BYTE; 
  
  Boardadr , 
  Ccadr               : BYTE; 
  
  Rxinput             : BYTE; 
  M_stat              : BYTE; 
  Rxdat               : BYTE; 
  
  Count               : WORD; 
  bc                  : byte;    //Byte count
  
  
//=== functions ===================================================================================== 
  
PROCEDURE Compute_array( speichern : BOOLEAN ); 
VAR
  Diff , Breite , p : WORD; bloc : byte;
BEGIN
  
  EE_ADCPos_zu := Adcpos_zu; 
  EE_ADCPos_auf := Adcpos_auf; 
  
  Diff := Adcpos_auf - Adcpos_zu; 
  Breite := Diff DIV 30; 
  EE_Breite := Breite; 
  p := Adcpos_zu; 
  
  IF Adcpos_zu < Breite THEN 
    Adcpos_min[1] := 0; 
  ELSE 
    Adcpos_min[1] := Adcpos_zu - Breite; 
  ENDIF; 
  
  FOR Bloc := 1 TO 30 DO
    IF Bloc > 1 THEN
      Adcpos_min[Bloc] := p - Breite;
    ENDIF; 
    p := p + Breite; 
    Adcpos_max[Bloc] := p + Breite;
    IF speichern THEN 
      EE_ADCPos_min[Bloc] := Adcpos_min[Bloc];
      EE_ADCpos_max[Bloc] := Adcpos_max[Bloc];
    ENDIF; 
  ENDFOR; 
END; 


PROCEDURE InitVars; 
BEGIN
  Accpoint := EE_accpoint; 
  Accval := EE_ACC; 
  Decpoint := EE_Decpoint; 
  Decval := EE_dec; 
  Accdelay := EE_Accdelay; 
  Decdelay := EE_Decdelay; 
  
  Speed_max := EE_SpeedMax; 
  Speed_high := EE_SpeedHigh; 
  Speed_low := EE_SpeedLow; 
  Speed_teach := EE_SpeedTeach; 
  
  Midichan := EE_Midichan; 
  Adroffs := EE_Adroffs; 
  
  Maxspeed_ab := EE_Maxspeed_ab; 
  Highspeed_ab := EE_Highspeed_ab; 
  
  Adcpos_zu := EE_ADCPos_zu; 
  Adcpos_auf := EE_ADCPos_auf; 
  
  Compute_array( TRUE ); 
  
  Count := 0; 
  
  Adcpos_soll_min := 0; 
  Adcpos_soll_max := 0; 
  Adcpos := 0; 
  Adcpos_old := 0; 
  Swpos_soll := 0; 
  
  R_heat := 0; 
  L_heat := 0; 
  
  Boardadr := 0; 
  IF BIT( Pind , 5 ) THEN 
    Incl( Boardadr , 0 ); 
  ENDIF; 
  IF BIT( Pind , 6 ) THEN 
    Incl( Boardadr , 1 ); 
  ENDIF; 
  IF BIT( Pind , 7 ) THEN 
    Incl( Boardadr , 2 ); 
  ENDIF; 
  Ccadr := Adroffs + Boardadr; 
  EE_Adr := Ccadr; 
  
END; // InitVars 


INTERRUPT RXRDY; 
BEGIN
  Rxdat := SerInp1;               // get ascii value from serial port 
  IF BIT( Rxdat , 7 ) THEN        // bit7=1 => cmd erkannt 
    IF Rxdat = $B6 THEN           // CC auf Kanal 6 erkannt 
      M_stat := M_warteauf_CC; 
    ENDIF; 
  ELSE 
    IF M_stat = M_warteauf_CC THEN         // jetzt werden Daten erwartet 
      IF Rxdat = Ccadr THEN       // mit eigener Adresse vergleichen 
        M_stat := M_warteauf_VV; 
      ELSE 
        M_stat := M_warteauf_Cmd; 
      ENDIF; 
    ELSIF M_stat = M_warteauf_VV THEN   // vv fehlt noch 
      IF ( Rxdat > 0 ) AND ( Rxdat < 31 ) THEN 
        Swpos_soll := Rxdat; 
        Newsoll := TRUE; 
        // ee_Soll := Swpos_soll;   als Debuginfo 
      ENDIF; 
      M_stat := M_warteauf_Cmd; 
    ENDIF; 
  ENDIF; 
END;  // RXRDY 


PROCEDURE kurz_rot; 
BEGIN
  Incl( O_rot ); 
  mdelay( 50 ); 
  Excl( O_rot ); 
END; 

PROCEDURE kurz_gruen; 
BEGIN
  Incl( O_gruen ); 
  mdelay( 50 ); 
  Excl( O_gruen ); 
END; 


PROCEDURE InitPorts; 
BEGIN
  DDRB := %11111111; 
  PWMport1A := 0; 
  PWMport1B := 0; 
END;      // InitPorts; 


//==== Hauptprogramm ======================================================================================== 

BEGIN
  InitPorts; 
  InitVars; 
  
  EnableInts; 
  
  //Start sequenz ausgeben 
  Incl( O_gruen ); 
  mdelay( 500 ); 
  Incl( O_rot ); 
  mdelay( 500 ); 
  Excl( O_gruen ); 
  mdelay( 500 ); 
  Excl( O_rot ); 
  mdelay( 500 ); 
  Incl( O_gruen ); 
  mdelay( 500 ); 
  Incl( O_rot ); 
  mdelay( 500 ); 
  Excl( O_gruen ); 
  mdelay( 500 ); 
  Excl( O_rot ); 
  mdelay( 500 ); 
  
  Speed := Speed_high; 
  Operation := Steht; 
  Modus := Inaktiv; 
  
  Adc_gleich := 0; 
  Ganz_auf := FALSE; 
  Ganz_zu := FALSE; 
  Newsoll := FALSE; 
  M_stat := M_warteauf_Cmd; 
  
  for bc := 1 to 8 do
    mdelay(100);
    ww := getadc(bc);
    ee_data[bc] := ww;
  endfor;

  LOOP
    
    mdelay( 5 );               // ca 50 µs
    
    //== ADC Routinen ==================================== 
    Adcpos_old := Adcpos; 
    Adcpos := Getadc( 3 );
    
    IF Adcpos = Adcpos_old THEN 
      Inc( Adc_gleich ); 
    ELSE 
      Adc_gleich := 0; 
    ENDIF; 
    
    IF Modus = Inaktiv THEN 
      Ww := Getadc( 5 );
      Ww := Ww SHR 2; 
      R_heat := Ww; 
      Ww := Getadc( 6 );
      Ww := Ww SHR 2; 
      L_heat := Ww; 
    ENDIF; 
    
    
    IF R_heat > 120 THEN 
      //'Überstrom 
    ENDIF; 
    
    IF L_heat > 120 THEN 
      //Überstrom 
    ENDIF; 
    
    
    IF BIT( I_Taster ) THEN// KalibrierTaster betatigt 
      IF Modus = Inaktiv THEN 
        Incl( O_rot ); 
        mdelay( 200 ); 
        Excl( O_rot ); 
        mdelay( 200 ); 
        Incl( O_rot ); 
        mdelay( 200 ); 
        Excl( O_rot ); 
        
        Modus := Teach; 
        Teachstep := 1; 
      {Teachmodus: 
        Step 1 oeffne bis I_AUF aktiv 
        Step 2 stehen bleiben 
        Step 3 Schliessen bis I_zu aktiv 
        step 4 stehen bleiben 
        step 5 Positon als Pos_zu speichern 
        Step 6 oeffne bis I_AUF aktiv 
        Step 7 stehen bleiben 
        Step 8 Positon als Pos_auf speichern 
        Fertig ===========================================} 
      ENDIF; 
    ENDIF; 
    
    IF Modus = Teach THEN 
      Incl( O_rot ); 
      Speed := Speed_teach; 
      
      CASE Teachstep OF 
        8 : 
            mdelay( 500 ); 
            Adcpos := Getadc( 3 );
            EE_ADCPos_auf := Adcpos; 
            Adcpos_auf := Adcpos; 
            Excl( O_rot ); 
            Modus := Inaktiv; 
            Compute_array( TRUE ); 
          |
        7 : 
            IF BIT( I_auf ) THEN 
              IF Operation = Steht THEN 
                Teachstep := 8; 
              ENDIF; 
            ENDIF; 
          |
        6 : 
            IF Operation = Steht THEN 
              Operation := Oeffnen; 
              Teachstep := 7; 
            ENDIF; 
          |
        5 : 
            mdelay( 500 ); 
            Adcpos := Getadc( 3 );
            EE_ADCPos_zu := Adcpos; 
            Adcpos_zu := Adcpos; 
            Teachstep := 6; 
          |
        4 : 
            IF BIT( I_zu ) THEN 
              IF Operation = Steht THEN 
                Teachstep := 5; 
              ENDIF; 
            ENDIF; 
          |
        3 : 
            IF Operation = Steht THEN 
              Operation := Schliessen; 
              Teachstep := 4; 
            ENDIF; 
          |
        2 : 
            IF BIT( I_auf ) THEN 
              IF Operation = Steht THEN 
                Teachstep := 3; 
                mdelay( 500 );    //warten zur beruhigung 
              ENDIF; 
            ENDIF; 
          |
        1 : 
            Operation := Oeffnen; 
            Teachstep := 2; 
          |
      ENDCASE; 
    ENDIF; 
    
    IF Newsoll THEN 
      Incl( O_rot ); 
      Incl( O_gruen ); 
      mdelay( 200 ); 
      Excl( O_rot ); 
      Excl( O_gruen ); 
      
      Adcpos_soll_min := Adcpos_min[Swpos_soll]; 
      Adcpos_soll_max := Adcpos_max[Swpos_soll]; 
      
      Ganz_auf := ( Swpos_soll = 30 ); 
      Ganz_zu := ( Swpos_soll = 1 ); 
      
      IF Adcpos > Adcpos_soll_max THEN 
        Adcpos_diff := Adcpos - Adcpos_soll_max; 
      ELSIF Adcpos < Adcpos_soll_min THEN 
        Adcpos_diff := Adcpos_soll_min - Adcpos; 
      ELSE 
        Adcpos_diff := 0; 
      ENDIF; 
      
      Newsoll := FALSE; 
      Highspeed := FALSE; 
      Maxspeed := FALSE; 
      
      IF Adcpos_diff > 0 THEN 
        IF Adcpos_diff > Maxspeed_ab THEN 
          Maxspeed := TRUE; 
        ELSIF Adcpos_diff > Highspeed_ab THEN 
          Highspeed := TRUE; 
        ENDIF; 
      ENDIF; 
      
      IF Modus = Inaktiv THEN 
        Modus := Work; 
      ENDIF; 
    ENDIF; 
    
    IF Modus = Work THEN 
      IF ( Adcpos < Adcpos_soll_min ) OR Ganz_auf THEN 
        Operation := Oeffnen; 
      ENDIF; 
      IF ( Adcpos > Adcpos_soll_max ) OR Ganz_zu THEN 
        Operation := Schliessen; 
      ENDIF; 
      
      IF ( Adcpos >= Adcpos_soll_min ) AND 
        ( Adcpos <= Adcpos_soll_max ) AND 
        ( Operation > Stoppen ) THEN 
        IF ( Operation = Schliessen ) AND NOT ( Ganz_zu ) THEN 
          Operation := Stoppen; 
        //kurz_rot; 
        ENDIF; 
        IF ( Operation = Oeffnen ) AND NOT ( Ganz_auf ) THEN 
          Operation := Stoppen; 
        //kurz_rot; 
        ENDIF; 
      ENDIF; 
    ENDIF; 
    
    
    IF Operation = Oeffnen THEN 
      Incl( O_motor_on ); 
      kurz_gruen; 
      mdelay( 200 ); 
             //Set O_rot 
      
      PWMport1A := 0; 
      IF Modus = Teach THEN 
        PWMport1B := Speed_teach; 
      ELSE 
        IF Maxspeed THEN 
          IF PWMport1B < Accpoint THEN 
            PWMport1B := PWMport1B + Accval; 
            mdelay( Accdelay ); 
          ELSE 
            PWMport1B := Speed_max; 
          ENDIF; 
        ELSE 
          IF Highspeed THEN 
            PWMport1B := Speed_high; 
          ELSE 
            PWMport1B := Speed_low; 
          ENDIF; 
        ENDIF; 
      ENDIF; 
      
      IF BIT( I_auf ) THEN 
        Operation := Stoppen; 
        Ganz_auf := FALSE; 
      ENDIF; 
    ENDIF;  // Öffnen ================================================== 
    
    IF Operation = Schliessen THEN 
      Incl( O_motor_on ); 
      kurz_gruen; 
      mdelay( 200 ); 
      //excl(O_rot); 
      
      PWMport1B := 0; 
      IF Modus = Teach THEN 
        PWMport1A := Speed_teach; 
      ELSE 
        PWMport1A := Speed_low; 
        IF Maxspeed THEN 
          IF PWMport1A < Accpoint THEN 
            PWMport1A := PWMport1A + Accval; 
            mdelay( Accdelay ); 
          ELSE 
            PWMport1A := Speed_max; 
          ENDIF; 
        ELSE 
          IF Highspeed THEN 
            PWMport1A := Speed_high; 
          ELSE 
            PWMport1A := Speed_low; 
          ENDIF; 
        ENDIF; 
      ENDIF; 
      
      IF BIT( I_zu ) THEN 
        Operation := Stoppen; 
        Ganz_zu := FALSE; 
      ENDIF; 
    ENDIF;   // Schliessen ============================================== 
    
    
    IF Operation = Stoppen THEN 
      kurz_rot; 
      IF Maxspeed THEN 
        IF PWMport1B > Decval THEN 
          IF PWMport1B > Decpoint THEN 
            PWMport1B := PWMport1B - Decval; 
            mdelay( Decdelay ); 
          ELSE 
            PWMport1B := 0; 
          ENDIF; 
          PWMport1B := 0; 
        ENDIF; 
        
        IF PWMport1A > Decval THEN 
          IF PWMport1A > Decpoint THEN 
            PWMport1A := PWMport1A - Decval; 
            mdelay( Decdelay ); 
          ELSE 
            PWMport1A := 0; 
          ENDIF; 
          PWMport1A := 0; 
        ENDIF; 
      ELSE 
        PWMport1A := 0; 
        PWMport1B := 0; 
      ENDIF; 
      
      IF Adc_gleich > 10 THEN 
        Operation := Steht; 
        Ganz_auf := FALSE; 
        Ganz_zu := FALSE; 
        IF Modus = Work THEN 
          Modus := Inaktiv; 
          Excl( O_rot ); 
          //Reset O_motor_on 
          //Reset O_rot 
        ENDIF; 
      ENDIF; 
    ENDIF;  // Stoppen ======================================================= 
    
    Inc( Count ); 
    IF Count = 10000 THEN 
      //Toggle( O_led ); 
      Count := 0; 
    ENDIF; 
    
  ENDLOOP; 
  
END Jalousie_v1.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 54
Posts: 1539
Registered: 03 / 2003
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 16:42   -  
Hast du die Möglichkeit über ein Display oder eine serielle Daten auszugeben? Häufiges schreiben ins EEPROM ist keine gute Idee und unter bestimmten Bedingungen kann man sehr leicht den Inhalt zerschiessen.
Also erstmal den ADC betrachten. Wie ist der beschaltet? Wo kommen die zu messenden Spannungen her und welchen Bereich haben diese?
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
grech offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Saarland
Age: 61
Posts: 15
Registered: 10 / 2015
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 16:46   -  
Ich habe zuvar mit bascom gearbeitet.
Da läuft's. (Schaltung und Software)
Ich will aber alle Projekte auf Pascal umstellen,
weil ich damit groß geworden bin und Pascal kann und mich da zuhause fühle.
Ein Display habe ich nicht dran. Deshalb die Notlösung mit dem EEprom.
Hab ich auch erst reingemacht nachdem ich nicht mehr weiter wusste.
You must be logged in or your permissions are to low to see this Attachment(s).
This post has been edited 3-times. Last edit: 09.07.2019 - 17:02 by grech.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 54
Posts: 1539
Registered: 03 / 2003
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 17:06   -  
Ohne beschalteten Aref und Avcc wird das nix.

Ogott Arduino ..... gibts von dem Modul einen Schaltplan?
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 1-times. Last edit: 09.07.2019 - 17:11 by Harry.
go down go up
grech offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Saarland
Age: 61
Posts: 15
Registered: 10 / 2015
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 18:26   -  
In BASCOM konnte man da einfach "Reference = Avcc" angeben.
Damit hat er die VCC als Ref genommen und alles hat gepasst.
Gibt es keine Ähnliche Lösung im AVRco.
Leider kann ich nicht soviel Assembler um mir das selbst einzutragen,
aber Bit 6 und 7 des ADMUX Registers wäre die richtige Stelle.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 53
Posts: 682
Registered: 09 / 2007
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 19:29   -  
Hi,
die Frage gab es hier schon eimal: Klick

miparo
Kein Support per PN! | No support via PM!
go down go up
grech offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Saarland
Age: 61
Posts: 15
Registered: 10 / 2015
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 20:08   -  
Ja, danke für den Hinweis mit der Referenzspannung.
Ich habe dann herausgefunden, dass BASCOM und auch der ARDUINO-Compiler
VCC als ARef nehmen, wenn man nichts anderes einstellt.
Und in einem anderern Beitrag hab ich gefunden, dass für die Megas immer die ext.Ref.
genommen wird und man nichts einstellen kann.
Und dann der Tipp von Harald_K
Quote
ich mach dann immer admux := admux or %xx000000; vor das enableints. - xx passend nach Datenblatt setzen.

Das hat den Erfolg gebracht.
...
und mit den Schwankungen kann ich leben.
ich mach mir später eh ein 7bit oder 5bit -wert daraus.
Nochmals danke für die Hilfe.

Aber ich denke auch, dass man dieses Manko in dem ADCPort-Treiber beheben sollte,
zumal es ja für die XMega anscheinend gemacht wurde.
go down go up
golf offline
Benutzer
Avatar
Gender: male
Location: GERMANY  Donauwörth
Age: 66
Posts: 154
Registered: 11 / 2009
Private message
Subject: Re: ADC Problem mit Mega328p  -  Posted: 09.07.2019 - 20:21   -  
aber Bit 6 und 7 des ADMUX Registers wäre die richtige Stelle.

Hallo Grech,
das stimmt mit den bits. das sollte funktionieren mit sowas wie

ADMUX:= ADMUX and $3F or $40; // für AVCC with external capacitor at AREF pin
oder
ADMUX:= ADMUX and $3F or $00; // für AREF, Internal Vref turned off
oder
ADMUX:= ADMUX and $3F or $C0; // Internal 1.1V Voltage Reference with external capacitor at AREF pin

oder evtl einfach z.b. mit
excl(ADMUX,7);
incl(ADMUX,6); // für AVCC with external capacitor at AREF pin

vielleicht mal somit testen.

golf

hab gerade gesehen, daß das problem ja schon gelöst ist
This post has been edited 1-times. Last edit: 09.07.2019 - 20:24 by golf.
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 18.09.2019 - 11:46