Arduino sketch aanpassen

Wie wil mij helpen met het aanpassen van een Arduino (NAN0) sketch. Dit zou een klein en simpel programma zijn. Het gaat hier om een inverter van ‘Great Scotty’ en heet een SquareWaveInver.
En te vinden op https://www.patreon.com/posts/21571279 deze werk met een 50hz. Frequentie
Maar ik zou graag deze op 200 of 300hz. willen hebben. Ik vraag dus dan ook wie kan mij vertellen welke regels moeten worden aangepast in de sketch en hoe deze te berekenen. Hoewel ik hiervan geen verstand heb gaat mijn gedachte uit naar de gemerkte regels in de INO. File.
Wie kan mij helpen.

Anoniem

OCR1A en OCR1B zijn de registers waarmee de timing van die sketch bepaald wordt.

Daarbij; ISR == "Interrupt Service Routine". ISR(TIMER1_COMPA_vect) en ISR(TIMER1_COMPB_vect) zijn de interrupt 'vectoren' die aangeroepen worden zodra de timer de ingestelde waarden bereikt. Je zou dus aan die 6000 en 20000 moeten sleutelen (die worden dus lager voor jou).

EDIT: Hieronder de gerefereerde sketch:

c code:


bool state = 0;

void setup() {
  Serial.begin(115200);
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B = (1 << WGM12) | (1 << CS11);
  TIMSK1 = 0;
  TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B);
  OCR1A = 20000;
  OCR1B = 6000;
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
}

ISR(TIMER1_COMPA_vect) {
  off();
  state = !state;
}

ISR(TIMER1_COMPB_vect) {
  if (state == 0) {
    highon();
  }
  else {
    lowon();
  }
}

void loop() {
}

void off() {
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
}

void highon() {
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(7, HIGH);
}

void lowon() {
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(7, LOW);
}
buckfast_beekeeper

Golden Member

Het nadeel van de arduino theaterstukjes. Ik ga me niet verdiepen of de gebruikte poorten tot 1 byte behoren.

Kan de poort niet beter in 1 keer geschreven worden ipv 4.

c code:


void off(){
    write portB(1100);
}

void highon(){
   write portB(1000);
}

void lowon(){
    write portB(0110);
}

50Hz zou ik op een andere manier genereren.

Van Lambiek wordt goede geuze gemaakt.

hallo buckfast_beekeeper. Ik wil zoals ik dacgt te hebben aangegeven naar 200 of 300Hz.en daar ik niets weet van deze zaken steld ik dus hier deze vraag.ARDUINO FORUM'S EN DE BEDENKER GEVEN GEEN THUIS VANDAAR DAT HIJ HIERSTAAT

Daarvoor heb je de datasheet van de ATMEGA328 nodig. Dat heeft niet veel meer met de ARDUINO filosofie te maken, maar werkt wel.

code:


  TCCR1B = (1 << WGM12) | (1 << CS11);

WGM12 is hoog, dus de timer wordt gereset op OCR1A.
CS11 = 1, dus de timer werkt met een prescaler van 8.

Een ARDUINO loopt op een kristal van 16MHz, dus met een prescaler van 8 loopt de timer op 2 MHz.

code:


  OCR1A = 20000;

Hier wordt OCR1A op 20000 gezet. Dat bepaalt de interrupt frequentie.
Hier dus 2 MHz / 20000 = 100 Hz.
Met deze frequentie wordt de functie ISR(TIMER1_COMPA_vect) aangeroepen door de timer hardware

code:


  OCR1B = 6000;

Deze instelling zorgt ervoor dat de ISR(TIMER1_COMPB_vect) wordt aangeroepen als de timer op 6000 komt. De timer loopt dan gewoon door totdat die door OCR1A wordt gereset.

Dus door OCR1A en OCR1B te verkleinen kun je een hogere frequentie genereren.

benleentje

Golden Member

Kan de poort niet beter in 1 keer geschreven worden ipv 4.

Dit is sterk af te raden. In de arduino IDE zitten tegenwoordig veel verschillende microcontroller van verschillende merken. Door de poorten in 1 keer te schrijven ontstaat er dan ook een probleem als je later van Arduino board wilt wisselen.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Je hoeft niet te gaan schreeuwen..... met al die hoofdletters.

[Bericht gewijzigd door RazeR op woensdag 9 oktober 2019 15:32:03 (25%)

@benleentje
Weinig kans dat deze sketch in een andere arduino nog iets doet. Die timer registers zijn nogal specifiek voor een ATMEGA328.

En dan kun je erg veel performance winnen door direkt naar de poort te schrijven in plaats van deze trage digitalWrite() functies te gebruiken, zeker hier in een ISR.

buckfast_beekeeper

Golden Member

Op 9 oktober 2019 15:31:27 schreef benleentje:
[...]Dit is sterk af te raden. In de arduino IDE zitten tegenwoordig veel verschillende microcontroller van verschillende merken. Door de poorten in 1 keer te schrijven ontstaat er dan ook een probleem als je later van Arduino board wilt wisselen.

Weet ik weer waarom ik ze niet gebruik, net zo min als de bijhorende toneelstukjes. Ik zal wel bij de ATtiny's en ATmega's houden. Daar weet ik tenminste dat poort B poort B blijft. De bootloader? Die neemt alleen maar plaats in.

Van Lambiek wordt goede geuze gemaakt.
benleentje

Golden Member

@De kees Daar heb je ook weer gelijk in :).

@Buckfast Het mag wel en het werkt ook gewoon zolang je bij in dit geval de nano blijft maar ga je naar een andere Micro controller dan heb je veel kans dat het niet meer werk.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Beste RazeR, Ik ben niet gaan schreeuwen maar simpel de Capslock vergeten terug te zetten.Foutje kan iedereen overkomen .

Allicht ten overvloede, maar men gebruikt hier de Arduino omgeving en een aantal Arduino library functies zoals digitalWrite() en Arduino (in enige betekenis) hardware.
Arduino was bedoeld om heel portable te zijn, dus te werken zonder uitgebreide kennis van de onderliggende hardware. Informatie over deze libraries staat bijvoorbeeld op de Arduino site.

De namen zoals TCCR1A verwijzen echter direct naar de hardware registers van één specifieke famillie van Atmel microcontrollers, mogelijk zelfs naar registers die er enkel in de 328 zijn of werken zoals bedoeld.
Zij worden door de specifieke compiler die de Arduino omgeving voor deze famillie gebruikt vertaald naar hardware adressen. Informatie hierover staat in de datasheet van de microcontroller.
Het is daarom noodzakelijk te weten voor welke chip het geschreven is, in geval van de Nano vermoedelijk de Atmega 328P.

Dat is zo een beetje het andere uiterste van het spectrum. Je zit hier direct op de hardware, het is goed denkbaar dat iets dat op 50 Hz kan niet met dezelfde hardware op 300 Hz kan. Om dat uit te zoeken is een datasheet/hardware begrijp-klus, geen Arduino programmeer uitdaging.

[offtopic] Het lijkt sociaal wenselijk een capslock fout met excuses te corrigeren.

buckfast_beekeeper

Golden Member

Wat op de ATmega328 van toepassing is, is dat ook op de ATmega48, ATmega88 en ATmega168. Zijn dezelfde controllers maar met wat minder geheugen aan boord. Respectievelijk 4kB, 8kB en 16kB.

Van Lambiek wordt goede geuze gemaakt.