Wauw
Wat een verschil
Eerder : 9.5 us
Nu: 0.37500 us
met 1 pin
Wauw
Wat een verschil
Eerder : 9.5 us
Nu: 0.37500 us
met 1 pin
En als ik het met 3 pinnen doe met deze code :
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
uint8_t outPins[3] = { 3, 6, 11 };
void setup()
{
for (uint8_t cnt = 0; cnt < NUMELEMENTS(outPins); cnt++)
{
pinMode(outPins[cnt], OUTPUT);
}
}
void loop()
{
PORTD = B01001000;
PORTD = B00000000;
PORTB = B00001000;
PORTB = B00000000;
}
Dan zijn de resultaten ;
Eerst: 26.62400 us
Nu: .5 us
Een ook heeel groot verschil
Eerst kon ik 38.099 pulses doen en nu 2 miljoen pulses per seconde
en met 1 pin kon ik 105 263 en nu 2 666 667 miljoen pulses per seconde
Niet voor te stellen hoeveel dat zijn
Kun je de vcd file van het programma hier als bijvoegsel zetten. Ik lijk wat problemen te hebben met wokwi en zie dit
Ik zou pulsen verwachten op alle kanalen maar zie er maar twee.
Als ik het op mijn hardware draai zie ik
Ik zit wel aan de grens van wat mijn logic analyser aan kan en vandaar de puntjes die je ziet.
Ik vroeg niet om screenshots
Ik vroeg om de vcd file.
Maar jij hebt dezelfde resultaten als ik heb (daar ging het om), voor 1 pin zou je één kanaal moeten zien met een puls.
Het is me verder opgevallen dat de tijdsaanduiding in de wokwi simulatie wat schokkeriger draait dan vroeger.
De pulsen zijn 62.5 ns. Nadat je de D1 en D3 hoog gemaakt hebt neemt het vervolgens nog eens 62.5 ns om D1 en D3 weer laag te maken waarna de puls op D0 hoog gaat.
Je kunt theoretisch dus iedere 125 ns een puls hebben hetgeen neerkomt op een frequentie van 8 MHz. Dat gebeurt hier niet omdat na het laag maken van de pin op PORTB loop() verlaten wordt hetgeen wat tijd kost en daarna wordt loop() weer aangeroepen hetgeen ook wat tijd kost.
Je kunt kijken wat de er in loop() gebeurt als je één pin bv 10 x van hoog naar laag laat schakelen; dan zou je gedurende die periode pulsen moeten zien met een breedte van 62.5 ns en een interval van 62.5 ns.
Dat is in theorie goed als je geen andere pinnen op PORTD wilt aansturen. Maar de pinnen 0 en 1 van de Uno (PD0 en PD1) zijn de seriële interface en als je de seriële poort ook wilt gebruiken (bv voor communicatie met de PC) heb je een probleem. Of als je pin 5 van de Uno gebruikt voor hardware PWM (analogWrite()).
Je moet in dat geval van die pinnen afblijven. Enig idee hoe je dat kunt doen?
Klopt
met dit programma :
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
uint8_t outPins[3] = { 3, 6, 11 };
void setup()
{
for (uint8_t cnt = 0; cnt < NUMELEMENTS(outPins); cnt++)
{
pinMode(outPins[cnt], OUTPUT);
}
}
void loop()
{
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
PORTD = B01001000;
PORTD = B00000000;
}
Zie ik dat de puls 62 ns aan is en 63 ns uit. Dus gemiddeld 62.5 ns
wokwi-logic(27).zip (2,2 MB)
Heb helaas het bestand in een zip moeten inpakken omdat ik het anders niet kon uploaden.
Heb geen idee.
Geloof dat in dat artikel daar geen oplossing voor stond.
Schuif operaties zoals je dat ook gedaan hebt toen je de data voor je schuifregister programma berekende. Maar nu kun je het direct naar de port sturen (geen tussen variabele nodig, mag wel.
oke
De artikel die je me stuurde , geeft heel duidelijk aan om dit niet te doen omdat het kan zorgen dat sommige zaken niet goed meer werken.
Heb er even over nagedacht maar zie het niet.
En vraag me af wanneer je de poort manipluatie echt nodig hebt ?
Refereer je naar https://docs.arduino.cc/retired/hacking/software/PortManipulation/#why-use-port-manipulation? Of iets anders.
Het enige probleem is dat het de hardware API omzeilt; als je dat programma wilt omzetten naar bv een ESP32 of een modernere Arduino heb je problemen.
PORTD |= B01001000;
Dat zet alleen pinnen 3 en 6 hoog en de anderen veranderen niet. Je kunt zelf het laag maken wel bedenken.
Ja, ik refeer naar die pagina
is een uno v3 or uno v4 dan oud.
Ik lees nu veel dingen over een arduino q maar dat lijkt me meer een mini computer dan een controller.
ja, alles op 0 zetten.
nog wat te leren of kan ik verder met de McWorther cursus zodat jij ook wat rust hebt.
Een Uno R3 is oud. In de niet te verre toekomst zal de processor die daar in zit (328P) niet meer geproduceerd worden en zul je de Unos en Nanos zoals je die nu kent niet langer kunnen kopen. Ik doe geen voorspelling wanneer dat zal zijn.
Er zijn genoeg andere processoren in de AVR familie die gebruikt worden in Arduinos zoals de Leonardo (32U4), Micro (32U4) en Mega (2560) en die zullen nog wel een tijdje geproduceerd worden voor zover ik weet.
Er zijn ook clone fabrikanten die nu Unos en Nanos leveren met de 328PB hetgeen een verbeterde versie is van de 328P.
Een Uno R4 is niet oud maar directe toegang tot de pinnen werkt op een andere manier en dus zal de code die we in dit onderwerp gebruikt hebben niet compileren.
Nee. Als je dat doet beïnvloed je pinnen die je niet zou moeten beïnvloeden; je moet alleen de pinnen die je op 0 wilt zetten op 0 zetten.
Ik zal hier waarschijnlijk nog één of twee berichten op laten volgen maar je kunt rustig verder werken aan je cursus.
oops,.dan werk ik op mijn werk/dagbesteding (om weer naar betaald werk te komen) met een hele oude kaart.
Dat maakt niet uit. Ze zijn nog steed beschikbaar en geven je een goede basis om zaken te leren.
De basis van het ontwerp stamt uit 2005 en er waren een aantal iteraties. Van oud (links) naar nieuwer (zie Arduino - Wikipedia).
| Bord | Processor | Communicatie | Opmerking |
|---|---|---|---|
| Arduino RS232 | ATmega8 | RS232 | |
| Diecimila | ATmega8 | FT232 | 3.3V |
| Duemilanove | ATmega8 | FT232 | Autoswitch voor 5V voeding |
| Uno R2 | ATmega8 | ATmega8U2 | |
| Uno R3 | ATmega328P | ATmega16U2 |
En dat is wat ik weet van de geschiedenis van de Uno.