Råd sökes: Atmega2560/Arduino mega

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Repaterion
Inlägg: 539
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Råd sökes: Atmega2560/Arduino mega

Inlägg av Repaterion »

Har ett beskymmer som jag nte blir riktigt klok på. ;)

Sitter med mitt examensarbete igen som legat och vilat ett tag, skall bara... "bara" implementera tempgivaren... :roll:
Inser då att ett av korten inte gör det det ska längre vilket naturligtvis har gjort tidigare...
Det är ett reläkort vilket styrs från ARD GPIO via en ULN2308? tror jag det var. Detta analogkort skall slå om relän när mätning skall göras, annars står dessa i NC motjord via ett 10k för att hålla ingången på noll så att säga.

Men nu till problemet, alla andra utgångar kan styras likt de alltid gjorts via sifferkoder men inte dessa, har bytt port, bytt pinnar, skrivit "DDRX = 0b00100101" ingen skillnad alls.
Tänkte att om jag dödat en port eller ingång på den av misstag? Nepp gjorde ett skitenkelt program för att testa:
Alla utgångar gör det de ska.


Kod: Markera allt

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  DDRE = 0xFF;
  DDRH = 0xFF;
  DDRB = 0xFF;
  DDRG = 0xFF;
  DDRL = 0xFF;
  DDRD = 0xFF;
  DDRC = 0xFF;
  DDRJ = 0xFF;
  DDRA = 0xFF;
  DDRK = 0xFF;
  DDRF = 0xFF;
}

void loop() {
  // put your main code here, to run repeatedly:
  PORTE |= 0XFF;
  PORTH |= 0XFF;
  PORTB |= 0XFF;
  PORTG |= 0XFF;
  PORTL |= 0XFF;
  PORTD |= 0XFF;
  PORTC |= 0XFF;
  PORTJ |= 0XFF;
  PORTA |= 0XFF;
  PORTK |= 0XFF;
  PORTF |= 0XFF;
}
Jag sätter alla pinnar till utgångar på samma sätt till UT på GPIO, kör samma typ av kod.
Det är bara axplock av koden nedan. så return, {} etc finns allt med.

Kod: Markera allt

void setPinMode()
{
  /****  ANALOGARELÄN  ****/
  for (uint8_t PM = 0; PM < sizeof(analog_relay); PM++)
  {
    pinMode(analog_relay[PM], OUTPUT);
    delay(5);
    //Serial.println("Step1");
  }
  /****  SIGNALRELÄN  ****/
  for (uint8_t PM = 0; PM < sizeof(digital_relay); PM++)
  {
    pinMode(digital_relay[PM], OUTPUT);
    delay(5);
    //Serial.println("Step2");
  }
  /****  KRAFTRELÄN  ****/
  for (uint8_t PM = 0; PM < sizeof(power_relay); PM++)
  {
    pinMode(power_relay[PM], OUTPUT);
    delay(5);
    //Serial.println("Step3");
  }
return;
}

PORTAKTIVERING:
  if  ( relay_identifier_return == 10 )
    {
      digitalWrite(analog_relay[0], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;
    }
  else if (relay_identifier_return == 11)
    {
      digitalWrite(analog_relay[0], LOW);
      //relay_identifier_return = 0;
    }
    //Analog 2
  if  ( relay_identifier_return == 12 )
    {
      digitalWrite(analog_relay[1], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
    
    DIGITALA:
    {
  /*    SIGNALRELÄN   */
    //Digital 1
      if  ( relay_identifier_return == 20 )
    {
      digitalWrite(digital_relay[0], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 21)
    {
      digitalWrite(digital_relay[0], LOW);
      //relay_identifier_return = 0;
    }

    //Digital 2
      if  ( relay_identifier_return == 22 )
    {
      digitalWrite(digital_relay[1], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 23)
    {
      digitalWrite(digital_relay[1], LOW);
      //relay_identifier_return = 0;
    }


Någon som har en tanke? Idé?
Har inte prövat att köra
PORTX |= 0bXXXXXXXXX;
I själva programmet utom i testprogrammet för att se om porten fungerar.
Kortet är inte felkopplat då jag kan skicka 5v på reläkortets ingång och allt fungerar som tänkt...
Användarvisningsbild
Klas-Kenny
Inlägg: 11344
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av Klas-Kenny »

Det låter ju som ett problem i ditt program helt enkelt.
Och då räcker nog inte med ett litet axplock av koden för att kunna se något vettigt.

Åtminstone info om hur analog_relay etc. är deklarerade, hur "PORTAKTIVERING" anropas mm. behövs.

På tex. StackOverflow krävs vid såna här frågor alltid ett minimum reproducible example, vilket är fullt rimligt för att kunna svara.



Ett steg i felsökningen kan vara att hänga på ett pull-up motstånd på en pinne för att se om den är initierad som utgång men aldrig blir hög, eller om pinnen aldrig ens initieras som utgång.
Användarvisningsbild
Repaterion
Inlägg: 539
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av Repaterion »

Japp.
Hmm PORTAKTIVERING... den skall inte va där, det har blivit en fnurra när jag klippåklistrade...
Men här kommer en av portaktiverande delarna.

Kod: Markera allt


static void analogRelayToggler()
{

  // ANALOGA RELÄINGÅNGAR     A1:  10, 12, 14, 16
  // ANALOGA DIGITALAINGÅNGAR B1:  20, 22, 24, 26
  // ANALOGA DIGITALAINGÅNGAR B2:  28, 30, 32, 34
  // ANALOGA KRAFTINGÅNGAR    K1:  40, 42, 44, 46
  // Analog 1
  if  ( relay_identifier_return == 10 )
    {
      digitalWrite(analog_relay[0], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;
    }
  else if (relay_identifier_return == 11)
    {
      digitalWrite(analog_relay[0], LOW);
      //relay_identifier_return = 0;
    }
    //Analog 2
  if  ( relay_identifier_return == 12 )
    {
      digitalWrite(analog_relay[1], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 13)
    {
      digitalWrite(analog_relay[1], LOW);
      //relay_identifier_return = 0;
    }
    //Analog 3
  if  ( relay_identifier_return == 14 )
    {
      digitalWrite(analog_relay[2], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 15)
    {
      digitalWrite(analog_relay[2], LOW);
      //relay_identifier_return = 0;
    }

    //Analog 4
      if  ( relay_identifier_return == 16 )
    {
      digitalWrite(analog_relay[3], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 17)
    {
      digitalWrite(analog_relay[3], LOW);
      //relay_identifier_return = 0;
    }
return;
}


Här kommer motsvarnde för digitala delen.

Kod: Markera allt


static void digitalRelayToggler()
{
  /*    SIGNALRELÄN   */
    //Digital 1
      if  ( relay_identifier_return == 20 )
    {
      digitalWrite(digital_relay[0], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 21)
    {
      digitalWrite(digital_relay[0], LOW);
      //relay_identifier_return = 0;
    }

    //Digital 2
      if  ( relay_identifier_return == 22 )
    {
      digitalWrite(digital_relay[1], HIGH);
      Serial.println(relay_identifier_return);
      //relay_identifier_return = 0;

    }
  else if (relay_identifier_return == 23)
    {
      digitalWrite(digital_relay[1], LOW);
      //relay_identifier_return = 0;
    }


Här kommer arrayerna för vilka nummer som skall aktivera vad så att säga.

Kod: Markera allt


const uint8_t analog_relay[4] = {22,24,26,28};// var 22,24,26,28 - 40,42,44,46 - 50, 52, 54, 56
const uint8_t tempSensorPin = A5;

const uint8_t digital_relay[8] = {23,25,27,29, 31,33,35,37};  // PORT-1 == 23-29 // PORT-2 == 31-37
const uint8_t power_relay[4] = {39,41,43,45};



Här är biten som läser in siffrorna till relä/portaktivering.

Kod: Markera allt


void serial_return()
{
  relay_identifier_return = Serial.parseInt(SKIP_ALL);  //SKIP_ALL -- Serial.parseInt(SKIP_ALL)
  Serial.println(relay_identifier_return, DEC);    //Enbart för avlusning.

/*******************************************************************
* Denna funktion skall kontroller om relay_identifier_return
*  är 100 eller 105, om inte skit i allt, OM
*  Skriv detta värde till variabeln tempSensorIdentifier
* Denna funktion aktiverar tempavläsningen alternativt avaktiverar.

* Detta görs via variabel1 och variabel2 med en OR (||)-funktion
*  OR/eller är dubbla streck || eller pipe på eng.
*******************************************************************/
  if (relay_identifier_return == 100) //  || relay_identifier_return == 105
    {// Kan man göra om denna till en växlande funktion i stället... För vilken utnyttar booleaner.
      //tempSensorIdentifier = relay_identifier_return;
      tempSensorIdentifier = !tempSensorIdentifier;
      Serial.print("Tempsensor active: ");
      Serial.println(tempSensorIdentifier);

    }
  return;
}
main.ino i stårt sätt.

Kod: Markera allt


#include "A1_header.h"

void loop()
{
  /*
  int x = 25;
x = Serial.parseInt(SKIP_ALL);
*/
  while (True) // Skall tas bort på sikt gissningsvis.x == 25
  {
  serial_return();
  relay_test_toggler();
  read_Analog_Inputs();
  temperatureMeasurement(); //INTE FULLT IMPLEMENTERAD

  delay(500);

  }
}

Kastar med setPinMode med.

Kod: Markera allt


void setPinMode()
{
  /****  ANALOGARELÄN  ****/
  for (uint8_t PM = 0; PM < sizeof(analog_relay); PM++)
  {
    pinMode(analog_relay[PM], OUTPUT);
    delay(5);
    //Serial.println("Step1");
  }
  /****  SIGNALRELÄN  ****/
  for (uint8_t PM = 0; PM < sizeof(digital_relay); PM++)
  {
    pinMode(digital_relay[PM], OUTPUT);
    delay(5);
    //Serial.println("Step2");
  }
  /****  KRAFTRELÄN  ****/
  for (uint8_t PM = 0; PM < sizeof(power_relay); PM++)
  {
    pinMode(power_relay[PM], OUTPUT);
    delay(5);
    //Serial.println("Step3");
  }
return;
}
Använder inte några special-bibliotek eller nåt alls: stdint.h, Arduino.h och math.h, varav math kommer troligen att försvinna.
stdio.h är väll bara till för att skriva ut på "prompten" ? Ovh den används inte på porttest-programmet.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av sodjan »

Så, det är väl bara att felsöka? Du har ett exempel som fungerar och ett som inte fungerar. Bara att göra något mitt emellan osv. Skala ner det som fungerar så att det blir överskådligt.

Antingen är det ett skitfel eller så har du tänkt fel.

I 99 fal av 100 så hittar man felet då man håller på att fixa en "reproducer" för att demonstrera det.
Användarvisningsbild
Repaterion
Inlägg: 539
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av Repaterion »

Har ett annan liten funktion vilken enbart växlar alla relän "av/på", då får jag en utspänning om ca 0,5V på OSC när dessa växlas.
Detta kan ju hända när man inte satt pinnarna till utgång att dessa ger lite vad de känner för, lite flytande.
När alla är vilande så är det 0V på alla pinnar vilka är satta till utgångar, alla andra flyter lite kring 0,7Vdc.


Testade att skriva programmet till en UNO vilket gav samma resultat, jag ändrade pin-nummer så att det matchar UNO så gått det gick innan skrivning.
Det är klart det är ett skitfel, men det kan vara nog så frustrerande innan man hittar dem :doubt: :x .

Kankse långsökt nu, men kan dubbla matningsspänningar ställa till det?
Den matas både från USB och via VIN från en Meanwell PSU á 5.1Vdc cirkus, PSU är i huvudsak till för att mata alla relän och LED.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av sodjan »

I/O pinnar som inte är anslutna till något ska inte lämnas som ingångar.
De "flyter" och kan ge olika mystiska fel i processorn.

Så, se till att initiera *alla* I/O pinnar till lämpliga värden, oavsett om de används eller inte.

Är 5-volten från USB och den separata PSU'n hoppkopplade?
Om det inte ska vara någon fail-over funktion, så borde det räcka med gemensam jord.
Användarvisningsbild
hawkan
Inlägg: 2636
Blev medlem: 14 augusti 2011, 10:27:40

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av hawkan »

Det är inte att rekommendera att blanda direkt port-access med Arduinos rutiner for pin-åtkomst som digitalWrite. Håll dej till det ena eller det andra.
Användarvisningsbild
Repaterion
Inlägg: 539
Blev medlem: 4 februari 2011, 00:57:32
Ort: Gustavsfors (Lite till vänster om världens utkant)

Re: Råd sökes: Atmega2560/Arduino mega

Inlägg av Repaterion »

sodjan skrev: 19 oktober 2023, 14:27:46 I/O pinnar som inte är anslutna till något ska inte lämnas som ingångar.
De "flyter" och kan ge olika mystiska fel i processorn.

Så, se till att initiera *alla* I/O pinnar till lämpliga värden, oavsett om de används eller inte.

Är 5-volten från USB och den separata PSU'n hoppkopplade?
Om det inte ska vara någon fail-over funktion, så borde det räcka med gemensam jord.
De är satta som utgångar och 0(noll/låg)

Det är gemensam minus på hela kedjan, dock är jord(PE) skild från allt, så minus på PSU, minus på ARDU och USB-skärm är samma om sedan jorden går ihop med dessa någonstans vet jag ej.
[quote=hawkan skrev: 19 oktober 2023, 14:31:32 Det är inte att rekommendera att blanda direkt port-access med Arduinos rutiner for pin-åtkomst som digitalWrite. Håll dej till det ena eller det andra.
Jag kör enbart med Ardus egna, att jag på med direkt-port var för att testa om det gjorde någon skillnad.
]

Det jag upptäckte förut var att om jag flyttade ena porten till den digitala aktiveringen så vaknade porten, lämnade 1V och vid från kopplande från analogkortet så gav den 5V...
Mätte strömmen som krävdes för att "driva" ULN ingången, ca 1,5mA vilket inte skall vara några problem för Atmega2560 att driva ensamt.
Även ändrat från "20" till "10" för att aktivera en annan port, då fungerar det. :x

Det är precis som att den funktionen inte ens läses in och används, men då jag lagt in Serial.print i analog-funktionen så går den in och genom den.

Känns precis som att den inte tar emot "pinMode" på rätt sätt, detta är ju ändå en "äkta" Arduino Mega 2650 från Elfa, alltså ingen Kina variant för 20 tallkottar.
Prövade att köra som Mega ADK men samma resultat, ADK är tydligen en modell med gränssnitt för Android telefoner via USB, var värt ett försök om det skulle vara skillnad vid kompilering.
Skriv svar