Nog heel veel meer ontwerptips en domme fouten

Sine

Moderator

Op 29 januari 2019 22:10:20 schreef maartenbakker:
En de directeur heet Luke? :P

Nah, dit is meer dark side vrees ik.

[Bericht gewijzigd door Sine op 29 januari 2019 22:22:20 (56%)]

Angaben sind wie immer ohne Gewähr.

Meer een weetje. Ik ben mijn fiets-licht-accu aan het opladen, met de hand op de labvoeding. Het was dit of m'n Imax B3 voor het eerst uitproberen.

Mijn "zippy 3000 40C" gedraagt zich bij 11.5V als een 5000F condensator. Bij 12V wordt dat 7kF. Ik had eerder andersom verwacht: hij is 3S en dus het vlakke stuk verwacht ik eerder in de buurt van de 3.7-3.8V dan bij de 4V/cel.

I = C dV/dt -> C = I dt/dV = 1.0A . 50s / 0.01V = 5kF.

Update: Als ik het goed uitgerekend heb: end-of-charge RC tijd is 10 minuten, 600 seconden. Als we even 6kF aannemen, dan zou de R dus 0.1 zijn. Het grootste deel daarvan zal wel in kabels van de labvoeding zitten. Ik ken deze accus van dat ze een ZEER lage Ri hebben, ook bij laden en dus als je ze met een kleine stroom laad (da's altijd als je niet heel heftige apparatuur hebt) ze behoorlijk snel van "hard aan het laden" naar "klaar" gaan. Weinig tijd in het "CV" deel van de laadcurve.

[Bericht gewijzigd door rew op 2 februari 2019 14:16:51 (36%)]

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Op dit protobordje zit 3x 10K, toch?

Mijn thuis is waar mijn Weller staat

Edit: ik zal iedereen het lezen van deze brainfart besparen.

[Bericht gewijzigd door SparkyGSX op 1 februari 2019 19:26:41 (83%)]

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Ah do'h! |:-( Hij is gewoon wat versprongen gelabeld, gewoon oranje-zwart-bruin natuurlijk, 300 ohm dus.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
maartenbakker

Golden Member

En daarom hebben we dus de R-reeksen :P

Maar inderdaad, ik kom ze ook wel es in 200 ohm tegen, een echte instinker.

"The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."

Prachtig! Ik dacht "nee, die is 100K, maar dat zie je toch?" en dingen als "goed werklicht is wel belangrijk" of "zou het dan 1k zijn en is het stiekem rood ipv oranje"?

Maar dit is nog veel geniepiger...

Kunnen die niet-reeks weerstanden niet gewoon een ongewone achtergrondkleur krijgen?

Op 29 januari 2019 22:10:20 schreef maartenbakker:
En de directeur heet Luke? :P

Als ik directeur was van een weerstandjesfabriek, zou ik de achtergrondkleur van mijn weerstandjes af laten hangen van in welke reeks ze zitten en van welke samenstelling. De bekende kleuren voor kool/metaal, maar b.v. fluorkleuren voor dergelijke buiten-de-reeks gevallen. Dan vallen ze tenminste op. Speciale kleuren voor speciale gevallen :) en uiteraard netjes gedocumenteerd.

Blog // Backwards Lightspeed Bus: i*i=-1, so iic=-c.
maartenbakker

Golden Member

Dan moeten ze jou maar directeur maken ;) Niet bij Luke Datawalker maar bij Luke Skyresistor B.V.

En grappig: het eerste dat ik dacht was ook: Nee, die is 100k.

[Bericht gewijzigd door maartenbakker op 1 februari 2019 21:32:22 (25%)]

"The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."

De beige achtergrondkleur werkte prima bij weerstanden totdat een of andere fabrikant het in zijn hoofd kreeg om de achtergrondkleur (donker)blauw te maken. Wat een drama om af te lezen...

High met Henk

Special Member

Ook een leuke hier gehad:

Doorverbind kammetjes voor zekering automaten.
En de isolerende kapjes vallen er wel eens af.

En dan zet iemand ze er weer op.
Leg je dat aan iemand uit als ze er nog op zitten, dat je daarvoor uit moet kijken.

Voel je aan de achterkant ineens koper...

Hebben ze het ding verkeerd gestoken, normaal heb je 2, 3 of 4 sleuven waar de koperstrips met kammen in zitten. Deze had er 2, maar was verkeerd terug gestoken, waardoor voorste sleuf leeg was en eerste strip in 2e gleuf zat, waardoor 2e strip bloot achter het kapje zat..

Had of geluk dat bootje massavrij was of dat de achterste de nul was.

to all newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet).
Shiptronic

Golden Member

Eerst Afschakelen , Meten, Voelen >:)

2x 1 0 K bruin zwart orange
1x 1 0 0K bruin zwart geel
1x 3 0 0 orange zwart bruin
2x 4 7 00 geel paars rood (in serie)

of zie ik iets over het hoofd?

[Bericht gewijzigd door Shiptronic op 25 februari 2019 21:08:26 (13%)]

Wie de vraag stelt, zal met het antwoord moeten leren leven.
High met Henk

Special Member

Ik voelde geen gezonde spanning toen..

to all newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet).

ontwerptip: als je losse .c/.h files wilt toepassen in Arduino om een sketch overzichtelijker te maken...

maak er dan .cpp/.h files van. Anders krijg je "undefined reference" voor dingen die toch ècht in de .c staan.

(of zet wat toverspreuken in je .h, https://forum.arduino.cc/index.php?topic=40585.msg296966#msg296966 dan wel rond de include van je .h https://arduino.stackexchange.com/a/949)

[code=C]
// tofu.h file:
#ifndef tofu
#define tofu
void tofu();
#endif

//tofu.c
const int bar = 42;
void tofu(){
return bar;
}

// in sketch:
#include "tofu.h"

int cafe = tofu();

[/code]

zal een fout geven.

[code=C]
// tofu.h file:
#ifndef tofu
#define tofu
void tofu();
#endif

//tofu.cpp
const int bar = 42;
void tofu(){
return bar;
}

// in sketch:
#include "tofu.h"

int cafe = tofu();

[/code]

zou moeten werken, en

[code=C]
// tofu.h file:
#ifndef tofu
#define tofu
void tofu();
#endif

//tofu.c
const int bar = 42;
void tofu(){
return bar;
}

// in sketch:
extern "C" {
#include "tofu.h"
}
int cafe = tofu();

[/code]
zou ook moeten werken...

Subtiel en kost wat zoekwerk als je er nooit eerder tegenaangelopen bent... " alles staat toch in de .c? heb ik een typevouwtje in de namen soms?"

Blog // Backwards Lightspeed Bus: i*i=-1, so iic=-c.

Of je mikt die Arduino editor waar hij hoort (in de digitale prullenbak) en gebruikt AVR studio, dan heb je een redelijke IDE die hypermoderne dingen kan, zoals debuggen.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Jochem

Golden Member

Waar je "undefined reference" vandaan komt is waarschijnlijk dat de main "Arduino Sketch" als C++ wordt gecompileerd (staat ook in 1 van je links) waardoor je symbol names verschillen en je linker het niet meer snapt.

De suggestie van SparkyGSX is wel een goede; zodra je wat serieuzer aan het coden bent kun je beter de Arduino IDE overboord gooien. Ik zou dan vervolgens zelf ook niet kiezen voor AVR studio, maar voor iets dat meer 'algemeen bruikbaar is'.

Ik ben zelf de laatste tijd wat aan het experimenteren met Atom en PlatformIO.

Heb geduld: alle dingen zijn moeilijk voordat ze gemakkelijk worden.

Op 13 april 2019 11:43:49 schreef SparkyGSX:
Of je mikt die Arduino editor waar hij hoort (in de digitale prullenbak) en gebruikt AVR studio, dan heb je een redelijke IDE die hypermoderne dingen kan, zoals debuggen.

Yes, graag. Maar AVR studio draait niet onder Debian. Of OSX. Want ik heb wel vaker software daar gemikt waar het thuishoort... Alleen gooi je daarmee soms je eigen ramen in. (no kun intended >:) En onder OSX moet een goeie IDE te vinden zijn... MPLAB gaat vast ook AVR ondersteunen binnenkort.)

Ik mis het kunnen debuggen wel, en een hele hoop andere dingen...

(Dus dan werk ik met gdb in een terminal. Maar een IDE werkt toch wel fijner dan losse texteditor en terminal met make en gdb...)

Ik heb een Dragon, dus als het moet kan ik gewoon debuggen op AVR. En een STlinkv2 voor de STM32' s, en zelfs ergens een PICkit2, en een Launchpad...

Dus, om ontopic te blijven: tips voor een goeie IDE welkom :)
(ik ga naar SystemWorkbench kijken voor de stm32's, en MPLAB voor PIC)

Enige voordeel van 'duino: makkelijk na te doen voor "Makers" buiten de emsys-hoek. Voor mijn huidige projectje (Lichtwekker. Binnenkort in een Show Your Projectstopic bij u in de buurt!) was dat een overweging. En het draait op alles (Win/Lin/Mac/Web)

(En Jochem heeft gelijk: Arduino sketches zijn c++)

EDIT:

Trouwens ook een leuke rariteit, uit datzelfde project:

c code:


//if(autoreel) EVERY_N_SECONDS( 10 ) { nextPattern(); }; // change patterns periodically

// hah. the above should work but throws compiler errors unless expressed as:
if (autoreel) {
    EVERY_N_SECONDS( 10 ) {
        nextPattern();  // change patterns periodically 
        };
}

Daar staat toch 2x hetzelfde? Waarom zijn die extra { } per sé nodig? (de whitespace maakt niet uit. Althans. Niet getest, maar zou niet uit moeten maken)

(EVERY_N_SECONDS is een macro uit de Fastled library)

Blog // Backwards Lightspeed Bus: i*i=-1, so iic=-c.
Hoeben

Special Member

//if(autoreel) EVERY_N_SECONDS( 10 ) { nextPattern(); }; // change patterns periodically

De expressie voor de IF keuze is toch niet (autoreel) EVERY_N_SECONDS( 10 ) ? Of wel maar dan mis ik een AND of zo?

Bedoel je dit?:
if (autoreel) { EVERY_N_SECONDS( 10 ); nextPattern(); };

[Bericht gewijzigd door Hoeben op 14 april 2019 11:15:07 (92%)]

Ah. Nu zie ik het.
Nee, ik bedoel if (autoreel) { EVERY_N_SECONDS( 10 ) nextPattern(); };
Al is het met extra {} wel duidelijker:

if(autoreel){
EVERY_N_SECONDS( 10 ){
nextPattern();
}
}

Maar, als er maar 1 instructie volgt, hoefden die {} niet. Al mag je ze overal neerzetten of ze nu hoeven of niet.

EVERY_N_SECONDS(10) is echter niet 1 instructie. Maar een macro. Blijkbaar is dat anders?

Blog // Backwards Lightspeed Bus: i*i=-1, so iic=-c.

Een USB naar rs232 ttl gekocht bij de chinees.
Wel met de originele FTDI chip, zodat ik geen chinese CH340 driver moet installeren.
Blijkt de Tx led niet te werken, er zit een via onder de tx led naar de ground.
De voorschakelweerstand van de led staat dus op de voedingsspanning.
De chip trekt het signaal naar de ground.
Ik heb de ground aan de via op de onderkant weg gekrabed en tadaaa, de led knippert.

Altijd goed om eerst die printjes te controleren vooraleer je twijfelt of je mcu nu wel goed werkt...

EVERY_N_SECONDS(10) is echter niet 1 instructie. Maar een macro. Blijkbaar is dat anders?

Yep, eerst gaan je bestanden door een pre-processor waar de macro's worden 'ge-expandeerd', daarna gaan ze door de compiler. Als de macro meerdere instructies oplevert dan kan je dit soort problemen hebben en zal je de {} moeten gebruiken.

Groetjes,
eSe

I am an expert of electricity. My father occupied the chair of applied electricity at the state prison.

Dat is dan alsnog de fout van degene die de macro heeft geschreven. Er is een reden dat je bij macro's vaak veel haakjes ziet die op het eerste gezicht overbodig zijn, dat is om te garanderen dat het expanderen goed gaat, wat de gebruiker ook gedaan heeft. De macro EVERY_N_SECONDS expandeert vrijwel zeker naar meerdere regels code, dus de maker had daar { } omheen moeten zetten.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 14 april 2019 13:25:42 schreef Lucky Luke:
EVERY_N_SECONDS(10) is echter niet 1 instructie. Maar een macro. Blijkbaar is dat anders?

Stel je schrijft:

code:

#define RESETXY() x = 0; y = 0

en je schrijft dan:

code:

 ... //we zitten in een grote loop
 if (iets) RESETXY ();
 ... // rest grote loop

dan krijgt de echte compiler te zien (na de preprocessor):

code:

 ... //we zitten in een grote loop
 if (iets) x = 0; y = 0;
 ... // rest grote loop

en dat wordt gezien als:

code:

 ... //we zitten in een grote loop
 if (iets) x = 0; 

 y = 0;
 ... // rest grote loop

Nu wordt ALTIJD je y=0 gezet.

Hier zijn diverse oplossingen. in mijn specifieke voorbeeld is natuurlijk:

code:

#define RESETXY() x = y = 0

de makkelijkste.

Maar je zou denken dat gewoon accolades zetten ook zou helpen.

code:

#define RESETXY() {x = 0; y = 0;}

maar de vraag is of de ; achter een "if (iets) {...}" wel mag.
En ook sommige andere oplossingen schijnen op z'n minst in sommige gevallen fout te gaan. Dus de gebruikelijke constructie is:

code:

#define RESETXY() do {x = 0; y = 0;} while (0)

Die is syntactisch gelijk aan een enkele instructie en gedraagt zich (naar ik me heb laten vertellen) in alle gevallen als waar je een gewone functieaanroep zou kunnen zetten.

Dan over EVERY_N_SECONDS... Die zou ik schrijven in C als:

code:

#define EVERY_N_SECONDS(n) for (;;sleep (n))

en volgens mij voldoet dat normaliter precies aan de verwachtingen. Dus ook als dit als body van een if-zonder-haakjes staat, zou het goed moeten gaan.

Zoals sparky zegt {} eromheen werkt vaak, maar net niet altijd. De do ... while (0) truuk werkt net wat vaker.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

ha! Leuk dat zo'n klein vauwtje (van wie laat ik ff in het midden ;):+) een leerzame discussie teweeg brengt :)

@rew: Ik had begrepen dat er wat mis was met x=y=z=0; - achtige constructies...
Maar dat was in de context van DIRA=DIRB=DIRC=0x00; Als DIRB dan 5 bits implementeert en de andere altijd als "1" teruglezen gaat dat fout.
Ik denk dat het ook fout kan gaan als z of y veranderd voordat x is toegewezen... (stel, je zit in een interrupt of in een andere thread aan dezelfde variabelen. Al gaat dat ook fout als je ze elk op een eigen regel toewijst. All wordt dan niet aan x toegewezen wat de interrupt in z heeft gezet. En met do...while(0) gaat dat net zo goed fout). )

Blog // Backwards Lightspeed Bus: i*i=-1, so iic=-c.