uart noice

algemene C code
Berichten: 1
Geregistreerd: 20 Jun 2018, 00:55

uart noice

Berichtdoor kroepoek85 » 20 Jun 2018, 01:08

Ik ben een dobbelsteen aan het maken in combinatie met 6x SN74HC595N shift registers.
De dobbelsteen zelf doet het prima, de ledjes branden zoals het moet.

De volgende code zit in de arduino die voor elke shiftregister een aparte array aan maakt.

Code: Alles selecteren
 
//Initialize array
  registerState = new byte[numOfRegisters];
  for (size_t i = 0; i < numOfRegisters; i++) {
    registerState[i] = 0;
  }


Om de functie dobbelsteen aan te roepen maak ik gebruik van UART.
Ik wil hebben dat een andere microcontroller PIC16F628A een signaal verstuurd over serieel om door te geven de dobbelsteen te gooien.

Vanuit mij PIC16F628A stuur ik een string door "rollDice" // pas ik later nog wel aan.

Als ik de bovenstaande code laat staan krijg ik allemaal ruis over met UART // in een loop, gecontrolleerd via seriele monitor.
Wanneer de bovenstaande code weghaal krijg ik prima de string ""rollDice" door.

Zou iemand me kunnen uitleggen waarom dat stukje code me UART verbinding onbruikbaar maakt.

Hieronder vinden jullie de volledige code. // Er zijn genoeg opmerkingen te maken over de code, het gaat tot nu toe puur om trial and error.

Code: Alles selecteren

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

int numOfRegisters = 6;
byte* registerState;

long led = 0;
long led2 = 0;
long led3 = 0;
int index = 0;
int demoRandom = 0;
int triggerDice = 0;

void setup() {
  Serial.begin(9600);
 
  //Initialize array
  registerState = new byte[numOfRegisters];
  for (size_t i = 0; i < numOfRegisters; i++) {
    registerState[i] = 0;
  }

  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

//Init clear all leds
  clearLeds();

 randomSeed(analogRead(A0));

}

void loop() {

    while(Serial.available() > 0) {
         Serial.write(Serial.read());
        }
}

//Random output led.
void dobbelSteen()
{
  while(demoRandom < 4)
  {
      while(index < 48)
      {
          long RGB = random (0,3);

          switch(RGB){

          case 0:
          led = random(3,48);
          break;

          case 1:
          led2 = random(3,48);
          led2 = led + 15;

          case 3:
          led = random(3,48);
          led2 = led + 15;
          led3 = led + led2 + 15;
   
          }

          regWrite(led,HIGH);
          regWrite(led2,HIGH);
          regWrite(led3,HIGH);
          delay(5);
          index++;
      }
  demoRandom++;
  clearLeds();
  index = 0;
 
  }
  demoRandom = 0;
 
}

void clearLeds()
{
  for(int i = 0; i < 48; i++)
  {
    regWrite(i, LOW);
  }
}

void rollDice()
{
  long dice = random(4);

  switch(dice)
  {
    case 0:
    dice0();
    break;

    case 1:
    dice1();
    break;

    case 2:
    dice2();
    break;

    case 3:
    dice3();
    break;
  }
}

void dice0(){
  regWrite(3, HIGH);
  regWrite(4, HIGH);
  regWrite(5, HIGH);
  regWrite(6, HIGH);
  regWrite(7, HIGH);
  regWrite(8, HIGH);
  regWrite(12, HIGH);
  regWrite(13, HIGH);
  regWrite(14, HIGH);
  regWrite(15, HIGH);
  regWrite(16, HIGH);
  regWrite(17, HIGH);

  regWrite(18, HIGH);
  regWrite(19, HIGH);
  regWrite(20, HIGH);
  regWrite(21, HIGH);
  regWrite(22, HIGH);
  regWrite(23, HIGH);
  regWrite(27, HIGH);
  regWrite(28, HIGH);
  regWrite(29, HIGH);
  regWrite(30, HIGH);
  regWrite(31, HIGH);
  regWrite(32, HIGH);

  regWrite(33, HIGH);
  regWrite(34, HIGH);
  regWrite(35, HIGH);
  regWrite(36, HIGH);
  regWrite(37, HIGH);
  regWrite(38, HIGH);
  regWrite(42, HIGH);
  regWrite(43, HIGH);
  regWrite(44, HIGH);
  regWrite(45, HIGH);
  regWrite(46, HIGH);
  regWrite(47, HIGH);

}

void dice1(){
  regWrite(13, HIGH);
  regWrite(14, HIGH);
  regWrite(15, HIGH);
  regWrite(16, HIGH);
  regWrite(17, HIGH);

  regWrite(28, HIGH);
  regWrite(29, HIGH);
  regWrite(30, HIGH);
  regWrite(31, HIGH);
  regWrite(32, HIGH);

  regWrite(43, HIGH);
  regWrite(44, HIGH);
  regWrite(45, HIGH);
  regWrite(46, HIGH);
  regWrite(47, HIGH);

  regWrite(9, HIGH);
  regWrite(24, HIGH);
  regWrite(39, HIGH);
}

void dice2(){
  regWrite(3, HIGH);
  regWrite(5, HIGH);
  regWrite(6, HIGH);
  regWrite(7, HIGH);
  regWrite(8, HIGH);
  regWrite(10, HIGH);
  regWrite(12, HIGH);
  regWrite(13, HIGH);
  regWrite(14, HIGH);
  regWrite(15, HIGH);
  regWrite(17, HIGH);

  regWrite(18, HIGH);
  regWrite(20, HIGH);
  regWrite(21, HIGH);
  regWrite(22, HIGH);
  regWrite(23, HIGH);
  regWrite(25, HIGH);
  regWrite(27, HIGH);
  regWrite(28, HIGH);
  regWrite(29, HIGH);
  regWrite(30, HIGH);
  regWrite(32, HIGH);

  regWrite(33, HIGH);
  regWrite(35, HIGH);
  regWrite(36, HIGH);
  regWrite(37, HIGH);
  regWrite(38, HIGH);
  regWrite(40, HIGH);
  regWrite(42, HIGH);
  regWrite(43, HIGH);
  regWrite(44, HIGH);
  regWrite(45, HIGH);
  regWrite(47, HIGH);
}

void dice3()
{
  regWrite(3, HIGH);
  regWrite(5, HIGH);
  regWrite(7, HIGH);
  regWrite(8, HIGH);
  regWrite(10, HIGH);
  regWrite(12, HIGH);
  regWrite(13, HIGH);
  regWrite(14, HIGH);
  regWrite(15, HIGH);
  regWrite(16, HIGH);
  regWrite(17, HIGH);

  regWrite(18, HIGH);
  regWrite(20, HIGH);
  regWrite(22, HIGH);
  regWrite(23, HIGH);
  regWrite(25, HIGH);
  regWrite(27, HIGH);
  regWrite(28, HIGH);
  regWrite(29, HIGH);
  regWrite(30, HIGH);
  regWrite(31, HIGH);
  regWrite(32, HIGH);

  regWrite(33, HIGH);
  regWrite(35, HIGH);
  regWrite(37, HIGH);
  regWrite(38, HIGH);
  regWrite(40, HIGH);
  regWrite(42, HIGH);
  regWrite(43, HIGH);
  regWrite(44, HIGH);
  regWrite(45, HIGH);
  regWrite(46, HIGH);
  regWrite(47, HIGH);
}

void regWrite(int pin, bool state){
  //Determines register
  int reg = pin / 8;
  //Determines pin for actual register
  int actualPin = pin - (8 * reg);

  //Begin session
  digitalWrite(latchPin, LOW);

  for (int i = 0; i < numOfRegisters; i++){
    //Get actual states for register
    byte* states = &registerState[i];

    //Update state
    if (i == reg){
      bitWrite(*states, actualPin, state);
    }

    //Write
    shiftOut(dataPin, clockPin, LSBFIRST, *states);
  }

  //End session
  digitalWrite(latchPin, HIGH);
}

Advertisement

Gebruikers-avatar
Berichten: 1776
Geregistreerd: 06 Aug 2016, 01:03

Re: uart noice

Berichtdoor Koepel » 20 Jun 2018, 08:03

Lastig, ik hoop dat iemand anders het ziet.

Ik kan alleen maar op mijn gevoel af gaan, dat is de hardware en de acrobatische toeren in de code en iets met de stack.
Je kunt er niet zomaar van uit gaan dat het stukje code het probleem is. Wanneer de code anders is, dan gaat de compiler anders optimaliseren en daardoor kunnen variabelen op een andere manier gebruikt worden. Een bestaand probleem met het overschrijven van de stack kan daardoor opeens voor problemen gaan zorgen.

Welk Arduino board gebruik je ?
Heb je de GND van PIC verbonden met de GND van de Arduino ?
Draait de PIC op 3.3V en de Arduino op 5V ?

Je maakt een array van 6 byte in de heap. Waarom ? Een globale variabele is veel eenvoudiger en voorkomt problemen.

In de setup() roep je clearLeds() aan. Die roept regWrite(). Ik vraag me af of die code juist is. De code is gevaarlijk omdat bitWrite() ook maar een dubbel in elkaar gedraaide macro is. Een macro is niet fail-safe voor alle typen variabelen.
https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Arduino.h#L114

Kun je regWrite() zonder pointers doen ? en met wat meer commentaar ? Wat gebeurt er als je regWrite() weg laat ?

Gaat het verkeerd zonder de PIC met alleen de seriële monitor ? Dus het is te testen met alleen een Arduino Uno boardje ? (nog niet gedaan). Dus de PIC heeft hier verder niets mee te maken ?

Is het voor school ? en wil je indruk maken door de heap te gebruiken en met pointers te werken :? Dat lijkt me hier niet nodig. Ken je de KISS regel ? https://nl.wikipedia.org/wiki/KISS-principe.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten