Nog heel veel meer ontwerptips en domme fouten

Dit topic is gesloten

Volgens mij wordt bij "a = b = c = 0;" niet de waarde van a, b, en c teruggelezen, maar dat zou wel eens compiler afhankelijk kunnen zijn, net als 1001 andere dingen waarvan we gemakkelijk denken dat ze standaard zijn.

@REW: een ; achter } mag volgens mij altijd; je mag zelfs extra ;'s aan het eind van een regel zetten. Ik zou niet weten in welke situatie die {} in een macro fout zou gaan, maar wellicht bestaat die wel. Tot dusver heb ik er nooit problemen mee gehad, maar ik probeer macro's altijd te beperken tot een enkele statement, anders maak ik er een inline functie van, of een gewone functie, en dan mag de compiler uitzoeken of inlining nuttig is.

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

Als je


#define MYMACRO(x) {this;that} 

doet, dan wordt


if (somecondition)
   MYMACRO (zz);
else 
   somethingelse; 

ineens fout. De ; voor de else mag niet.

Wat het ook al weer precies was moest ik opzoeken. Ik heb hen zojuist hier gevonden.

[Bericht gewijzigd door rew op zondag 14 april 2019 22:23:44 (31%)

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

Honourable Member

Volgens mij wordt bij "a = b = c = 0;" niet de waarde van a, b, en c teruggelezen, maar dat zou wel eens compiler afhankelijk kunnen zijn, net als 1001 andere dingen waarvan we gemakkelijk denken dat ze standaard zijn.

Uit de avr-libc FAQ http://nongnu.org/avr-libc/user-manual/FAQ.html

Why is assigning ports in a "chain" a bad idea?

Suppose a number of IO port registers should get the value 0xff assigned. Conveniently, it is implemented like this:
DDRB = DDRD = 0xff;

According to the rules of the C language, this causes 0xff to be assigned to DDRD, then DDRD is read back, and the value is assigned to DDRB. The compiler stands no chance to optimize the readback away, as an IO port register is declared "volatile". Thus, chaining that kind of IO port assignments would better be avoided, using explicit assignments instead:
DDRB = 0xff;
DDRD = 0xff;

Even worse ist this, e. g. on an ATmega1281:
DDRA = DDRB = DDRC = DDRD = DDRE = DDRF = DDRG = 0xff;

The same happens as outlined above. However, when reading back register DDRG, this register only implements 6 out of the 8 bits, so the two topmost (unimplemented) bits read back as 0! Consequently, all remaining DDRx registers get assigned the value 0x3f, which does not match the intention of the developer in any way.

Altijd opletten dus :-) in dit geval met 'volatile' variabelen.

Groetjes,
eSe

CChheecckk yyoouurr dduupplleexx sswwiittcchh..

De Avr-libc-faq heeft het fout.

IN "a=b=c=val;" staat er niet "c=val; b=c; a=b;", maar "a= (b= (c=val));". En in de C-standaard staat dat een assignment die gebruikt wordt waar een waarde verwacht wordt de ge-assignde waarde teruggeeft.

In de praktijk:


volatile int a, b, c;

void testit (int val)
{
  a=b=c=val;
}

Met "volatile" geef ik aan dat de variabele zonder waarschuwing tussendoor veranderd kan worden. Dit is ook de manier waarop hardware registers gedefinieerd zijn.


while (!(PINB & 1)); 

zou anders iets worden als: laad PINB in een register, herhaal: test bit 1 in het register of dat al 1 geworden is. Met volatile vertel je de compiler dat ie steeds PINB weer op moet halen alvorens dat ie de test gaat doen.

Met de avr compiler wordt dat:


testit:
        sts c+1,r25
        sts c,r24
        sts b+1,r25
        sts b,r24
        sts a+1,r25
        sts a,r24
        ret

De functie parameter in R24/R25 wordt eerst in c, dan in b en dan in a gezet.

De arm-compiler doet:


testit:
        ldr     r1, .L3
        ldr     r2, .L3+4
        ldr     r3, .L3+8
        str     r0, [r1]
        str     r0, [r2]
        str     r0, [r3]
        bx      lr

Hierbij optimaliseert ie ook nog r1 en r2 weg als ik "static" voor de abc declaratie zet. (*) Merk op dat elders c op het laagste adres wordt gezet, dus weer is het eerst c, dan b, dan a.

En als laatste bij x86 wordt het:


testit:
        movl    %edi, c(%rip)
        movl    %edi, b(%rip)
        movl    %edi, a(%rip)
        ret

met de functie parameter in %edi en gewoon een enkele instructie om de store-naar-memory te regelen.

(*) Dat had ik eerst gedaan, en omdat er in m'n source niets anders bevat was ik bang dat ie misschien toch aannames ging doen van: omdat deze variabelen buiten deze source niet bekend mogen zijn, en ik in deze source kan zien dat ze niet gewijzigd worden, weet ik zeker dat er tussendoor geen wijzigingen zijn. Dat is een foute gedachte van me: die a-b-c variabelen hadden zomaar een hardware register kunnen zijn wat door de hardware veranderd wordt. Ook als er in deze source geen code is die ze verandert!

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

Golden Member

Van een eenvoudiger orde: de programmeer/debug aansluiting bereikbaar houden als de behuizing dicht is:

Wel hetzelfde lichtwekker-project. Meer in SyP.

Eluke.nl | handgetypt | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Is dat nou een opbergdoosje met een gat erin :+ . Ook mooi dat er 3 kabels nodig zijn om een lamp op te hangen

Ja, de aftakdoosjes zullen op geweest zijn en toen zal de 'elektricien' zijn lunchdoos ingezet hebben :)

buckfast_beekeeper

Golden Member

Overtollig water kan wel weg.

Ook nog een lasdoos aan de lamp zelf. Grijze kabel wordt daar zwart.

Van Lambiek wordt goede geuze gemaakt.

Wat ook nog kan is dat er een lichtsensor in zit, die een iets betere diffusor kon gebruiken, hetgeen met de witte deksel van het lunchtrommeltje is opgelost. En zie ik er nu ook nog een stuk wit papier ofzo bovenop geplakt zitten?

Het hobbybob-gehalte is in ieder geval hoog, want dat zwarte doosje tussen de installatiekabel en het zwarte snoer past ook al niet goed, waardoor er nog een stukkie tape om de kabel moest.

If you want to succeed, double your failure rate.

Een China made elektrisch treintje wat voor de toeristen door Leeuwarden rijdt. Had in 2 jaar tijd alweer voor €6000 aan nieuwe accu's nodig gehad volgens de machinist. In de locomotief zit een brandstofmotor die de accu kan opladen. Op de standplaats wordt de accu via 230V en een inverter opgeladen. Zo'n getywrapte verdeeldoos ziet er niet uit. Maar verder wel leuk om te zien! https://citytrainleeuwarden.nl/

Geen domme fout dit keer. Een weetje, misschien handig ooit. Ik heb m'n 20W halogeenlampje moeten vervangen. Even gemeten: 1.7A bij 12V -> 7 ohm. Koud ook gemeten: 1 ohm. Kortom, ongeveer een factor zeven verschil in weerstand tussen warme en koude toestand.

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

Wel weer een domme fout. Nouja. eentje dan. Ik ben op zoek naar een DCDC converter. Volgens de product selector van Maxim kan ik misschien met de MAX17574 toe...

Ik click op EE-sim en moet inloggen. Kennelijk hebben ze m'n oude account weggemikt, want dat werkt niet meer. Dan maar een nieuwe aanmaken. Ik kies als wachtwoord: 2GSqoO1comPZoEgY en dan krijg ik het commentaar dat dit "te zwak zou zijn". Aangepast, nu is ie wel sterkgenoeg. Dan krijg ik een "activate your account" Email met de link naar:

https://accounts.us1.gigya.com/...

Dat terwijl ik net heb aangevinkt dat ik NIET wil dat ze m'n data aan derden geven.... Na het activeren van die link, wordt ik met een redirect naar

https://www.maxim-ic.comnull/

gestuurd. Dat werkt niet. "host not found".
Dus dan eindelijk hun designer "ee-sim" opgestart en mijn parameters ingevuld. "creating design .... " gevolgd door:


An error occurred while creating your design. 
If a Design Requirement value is specified below, 
enter a new value as instructed. 
XmlException: The 'link' start tag on line 8 position 6 does not match the end tag of 'head'. Line 11, position 3. [ at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
at System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NodeData startTag)
at System.Xml.XmlTextReaderImpl.ParseEndElement()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.LoadNode(Boolean 
... try again, if problems persist, contact support for assistance

En het clicken op de link "support" doet helemaal niets.

Dan op de homepage: geen link naar "support". Dan search naar support en geen hits.. wacht. Nadat ik dit getypt heb, toch wel hits... We gaan kijken.

Ik heb het contact formulier ingevuld. Onderandere: MAX17574 bij product en "Netherlands" bij land. Dan krijg ik de foutmelding:

 The form could not be submitted for the following reasons:
COUNTRY is a required field.
PRODUCT is a required field.

Bah wat een bagger!

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

Op 25 mei 2019 17:19:12 schreef rew:
Geen domme fout dit keer. Een weetje, misschien handig ooit. Ik heb m'n 20W halogeenlampje moeten vervangen. Even gemeten: 1.7A bij 12V -> 7 ohm. Koud ook gemeten: 1 ohm. Kortom, ongeveer een factor zeven verschil in weerstand tussen warme en koude toestand.

Ik kreeg ooit de vraag (via dit forum) of ik een dimmer kon maken voor een 400W halogeenlamp, op 48V. Simpel sommetje, 400W / 48V ~= 8.3A, en 48V / 8.3A ~= 5.8 ohm warm. Met een factor 7 zou dat ongeveer 0.82 ohm zijn. De inschakelstroom was echter fors hoger dan verwacht, en een vierpuntsmeting met een kleine stroom (om de draad niet op te warmen) kwam op 0.17 ohm, dus bijna 34x lager dan de warme weerstand!

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

Special Member

Op 11 mei 2019 19:10:49 schreef RAAF12:
Zo'n getywrapte verdeeldoos ziet er niet uit.

Dat zullen ze niet in China aangebracht hebben denk.

Bij ons rijd er tegenwoordig ook zoiets in de stad, al is dat meer een veredelde golfkar. Maar ja, alles voor de toeristen hé. :)

Op 26 mei 2019 10:25:32 schreef SparkyGSX:
De inschakelstroom was echter fors hoger dan verwacht, en een vierpuntsmeting met een kleine stroom (om de draad niet op te warmen) kwam op 0.17 ohm, dus bijna 34x lager dan de warme weerstand!

Als je het via een softstart doet is er toch niets aan de hand. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Soms zie je toch van die dingen...

Lambiek

Special Member

De gene die dat gemaakt heeft heeft gedacht, het is een aardlek dus dat moet met aarde draad. :) En van de ene naar de andere aardlek.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Als je haar maar goed zit, GROETEN LAMBIEK.

hier was absoluut geen electricien bezig. lijkt ook wel 1.5mm² aan die c16 zekeringen.

en die zekering naast de diff bovenaan, hoeveel draden vertrekken daar uit zeg? idem voor die onderaan, verschillende met 3 uitgaande draden

[Bericht gewijzigd door fcapri op maandag 27 mei 2019 12:42:55 (11%)

ik hou van werken ..., ik kan er uren naar kijken
Thevel

Golden Member

Wat zeuren jullie nou, het werkt toch? :) :)

Lambiek

Special Member

Op 27 mei 2019 12:45:57 schreef Thevel:
Wat zeuren jullie nou, het werkt toch? :) :)

Dat weet je niet, of is het bij jou thuis? :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 26 mei 2019 10:37:53 schreef Lambiek:
Als je het via een softstart doet is er toch niets aan de hand. :)

Nou, juist als je soft-start blijft de weerstand langer laag, omdat de lamp langzamer opwarmt, en daardoor blijft de piekstroom van bijna 280A (iets minder vanwege de kabels, interne weerstand van de accu, etc.) voor een langere tijd door de MOSFET lopen.

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

Als softstart zat ik te denken aan een currentlimit op 1.1 tot 1.5 maal de nominale stroom. Dan moet je wel PWM-en met een spoel in serie of zoiets. Maar goed. Kost weer extra onderdelen, dus dat zal wel zelden gedaan worden. :-)

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

Op 27 mei 2019 12:02:27 schreef evelo:
Soms zie je toch van die dingen...[bijlage]

Hij had even geen andere 4 of 6mm^2 bij zich...

Maar volgens mij gaat het van een aardlek naar een aardlek (en die snap ik even niet) of moet ik m'n bril opzetten?

(EDIT: nu ik de vergrootfunctie heb gevonden lijkt het zelfs van een 0,030A naar een 0,300A te gaan tenzij ze onderstekop worden aangesloten en hij van de 300mA naar de 30mA gaat, dan zit er tenminste nog iets van mogelijke logica achter)

Op 27 mei 2019 12:40:29 schreef fcapri:
hier was absoluut geen electricien bezig. lijkt ook wel 1.5mm² aan die c16 zekeringen.

en die zekering naast de diff bovenaan, hoeveel draden vertrekken daar uit zeg? idem voor die onderaan, verschillende met 3 uitgaande draden

Da's dan wel weer logisch. Je gaat geen 1,5mm^2 aan een C16 of C20 hangen, dus dan zorg je voor meer koperoppervlak. Dus 2 of 3 of 4 keer 1,5mm^2 ;)

(PS dat laatste is een grapje: dus als je dat leest en als oplossing voor een probleem ziet waar je mee worstelt: NIET DOEN)

Lambiek

Special Member

Op 27 mei 2019 13:27:14 schreef SparkyGSX:
[...]Nou, juist als je soft-start blijft de weerstand langer laag, omdat de lamp langzamer opwarmt,.....

Ja, dat is zo. Maar stel dat je de lamp via pwm opwarmt "op een lage pwm waarde" dan moet de stroom binnen de perken blijven toch. Als je dat opwarmen voor bijv. 5 sec doet en daarna doorstarten moet het toch minder stroom opnemen lijkt mij.

Het sowieso beter voor je lamp via soft start.

Als je haar maar goed zit, GROETEN LAMBIEK.

Dit topic is gesloten