uart noice
2 berichten
• Pagina 1 van 1
- kroepoek85
- Berichten: 1
- Geregistreerd: 20 Jun 2018, 00:55
uart noice
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.
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.
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 = ®isterState[i];
//Update state
if (i == reg){
bitWrite(*states, actualPin, state);
}
//Write
shiftOut(dataPin, clockPin, LSBFIRST, *states);
}
//End session
digitalWrite(latchPin, HIGH);
}
Advertisement
Re: uart noice
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.
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.
2 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Google Adsense [Bot] en 4 gasten