Oh kom er eens kijken wat ik in mijn shoentje vind

Vanochtend afgeleverd

En meteen even spelen met een leonardo

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(LED_BUILTIN, HIGH);
}

En het resultaat

sigrok.1.jpg

Hmmm, waar komen die onregelmatigheden vandaan, Is dat ding nu al stuk? Foutje in the pulseview software?

Oh wacht, misschien wel interrupts. Een cli() toegevoegd in setup() en het probleem verdween als sneeuw voor de zon; ik het niet uitgezocht welke interrupts het waren.

Verder spelen, laten we eens zien hoe snel we een poort aan en uit kunnen schakelen. Op een leonardo zit pin 13 op portC.

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  PORTC |= 0x80;
  PORTC &= 0x7F;
}

En het resultaat

sigrok.2.jpg

Hmmm, asymetrisch, Wat is daar nu weer aan de hand? De pulsen zijn 125ns hoog en 375ns laag. Ik heb het niet verder uitgezocht; zeer waarschijnlijk de call en return van loop().

En dan de laatste

void setup()
{
  Serial1.begin(57600);
}

void loop()
{
  delay(2000);
  Serial1.print("Sinterklaas kapoentje");
}

Een het resultaat

sigrok.4.jpg

Deze kostte me wat tijd omdat de eerste bytes niet lekker waren. De oplossing was om een kleine pre-capture trigger ratio in te stellen in pulseview. Als je sigrok,4.jpg hieronder opent zul je zien dat de uart output inderdaad ‘sinterklaas kapoentje’ geeft.

PS
openen van enige plaatje hieronder geeft een grotere versie.

leuk ding zeg, en ik maar klooien met mijn 200 kg scoop met een opwarmtijd van een half uur.hihi en ja de timing zal je nog wel vaker parten spelen, want jouw programma in machinetaal ziet er toch wel anders als verwacht uit hoor.

shooter:
leuk ding zeg, en ik maar klooien met mijn 200 kg scoop met een opwarmtijd van een half uur.hihi

Ik ken het gevoel :smiley:

shooter:
en ja de timing zal je nog wel vaker parten spelen, want jouw programma in machinetaal ziet er toch wel anders als verwacht uit hoor.

Ik weet het. Ik was van plan om zelf een simpele logic analyzer te maken, gebaseerd op alleen een Leonardo. Lage spec, dacht ik (1MS/s max) en de eerste poging ging meteen goed de mist in. Ik gebruikte een timer en het begin van de ISR zier er zo uit

ISR (TIMER1_COMPA_vect)
{
 524:	1f 92       	push	r1                                                  // 2 cycles
 526:	0f 92       	push	r0                                                  // 2 cycles
 528:	0f b6       	in	r0, 0x3f	; 63                                        // 1 cycle
 52a:	0f 92       	push	r0                                                  // 2 cycles
 52c:	11 24       	eor	r1, r1                                                  // 1 cycle
 52e:	8f 93       	push	r24                                                 // 2 cycles
 530:	9f 93       	push	r25                                                 // 2 cycles
 532:	ef 93       	push	r30                                                 // 2 cycles
 534:	ff 93       	push	r31                                                 // 2 cycles
 
                                                                                    // 16 cycles <<<

Ongeveer hetzelfde aan het eind van de ISR (pop). Het totaal kwam neer op ongeveer 80 cycles; keer 62.5 ns geeft 5 us en daar ging de spec :frowning: En dat was met gebruik van direct lezen van de poort.