Fehlermeldung schon beim kompilieren

Hallo zusammen
Brauch mal Eure Hilfe
Schreibe gerade als Anfänger einen Sketch auf Arduino Nano Every

Dies wird als Fehler erkannt, was ist daran falsch ?
TCCR1B = TCCR1B & 0b11111000 | 0x04; // Setzt Timer1 (Pin 9 und 10) auf 122Hz

Fehlermeldung:
sketch_jul05a_122Hz:46:3: error: TCCR1B' was not declared in this scope

Danke schonmal
Ingo

Das ist das im ATmega328 vorhandene Timer/Counter control Register B, welches in Deinem µC nicht existiert.

Eigentlich steht das schon da. Der Compiler kennt "TCCR1B" nicht. Warum benutzt Du als Anfänger die direkte Programmierung von Timern. Was hast Du den überhaupt vor.

Danke für Eure rasche Antworten, das erklärt mein Problem
Denke das ich einen Arduino Uno verwenden muss, oder ?

Nun , genau genommen verwende ich einen Sketch ( Netzfund ), ich google, lese, studiere ja nun seit wochen, den ich auf meine Bedürfnisse umschreibe.
http://www.scynd.de/tutorials/arduino-tutorials/3-luefter-steuern/3-4-temperaturgesteuerter-lüfter.html

Ich benötige ein Kühlwassertemperaturabhängiges ( über NTC Temp-Fühler) PWM -Signal nahe 100Hz um einen KFZ-Kühlerlüfter, der ein Steuergerät mit Leistungsendstufe enthält, anzusteuern.
Ich hoffe das bekomme ich ( mit Eurer Hilfe sei Dank) noch hin.
Gruß Ingo

Hallo,
versuche doch erst mal ob die pwm Frequenz wirklich um 100 Hz sein muss, oder ob Du mit dem Standard hinkommst.
Heinz

Nö, der µC hat andere Register, aber die kann man auch ändern. Du könntest mal dies probieren: Arduino Nano Every ATMEGA4809 PWM Code

Ich habe es schon befürchtet, jetzt wird es kompliziert.....
aber wenn der Uno den richtigen ATmega hat würde ich den nehmen wollen.
Im Fortgang steht ja auch noch folgendes :

void setup()

{

TCCR1B = TCCR1B & 0b11111000 | 0x04; // Setzt Timer1 (Pin 9 und 10) auf 122Hz

Serial.begin(9600); // Baudrate für die Ausgabe am Serial Monitor

pinMode(fanPin, OUTPUT); // Setzt den Pin des Lüfters als Ausgang

pinMode(ntc, INPUT); // Setzt den Pin des NTC Wiederstands als Eingang

}

danke agmue, aber wo soll ich das in den Sketch einfügen, habe da leider zu wenig Grundkenntnisse um das folgerichtig zu programieren

Hallo,

das wird eine längere Geschichte, die aber machbar ist, wenn du das wirklich mit dem Nano Every machen möchtest. Dafür fummeln wir am Timer TCA oder an TCA und TCB rum. Das ist abhängig davon welchen Pin du verwenden möchtest.
Zur Auswahl stehen Pin 5, 9 und 10 die an TCA0 hängen.
Und Pin 3 und 6 die an TCBn hängen.
Da ich weiß das für 100Hz ein Prescaler von 1024 benötigt wird, muss zwangsweise immer TCA0 angefasst werden egal welcher Pin von denen.
millis() muss auch korrigiert werden damit das wieder passt.

Also, möchtest du das mit dem Nano Every machen oder nicht? Dazu sollten schon ein paar Grundlagen vorhanden sein und das ATmega4809 Manual Kapitel TCB wenigstens komplett durchgelesen sein. Die App Note TB3214 - Getting Started with TCB gelesen zu haben ist auch hilfreich.

Und ändere mal bitte die Betreffzeile vom Thread in was passenderes. Nano Every Timer zum Bsp. oder ähnliches.

Hallo Doc
danke für das Intresse an meinem Problem
Ich habe nun aufgerüstet und möchte/werde einen UnoV3 mit ATmega328P verwenden.
Den heute morgen gleich mal mit dem angedachten Sketch gefüttert, aber gleiche Fehlermeldung
wie oben schon beschrieben:
Dies wird als Fehler erkannt, was ist daran falsch ?
TCCR1B = TCCR1B & 0b11111000 | 0x04; // Setzt Timer1 (Pin 9 und 10) auf 122Hz
Fehlermeldung:
sketch_jul05a_122Hz:46:3: error: TCCR1B' was not declared in this scope

Hab dann den Sketch nach dem Vorschlag / Link vom agnue ergänzt und nun ging es auch mit dem Hochladen auf den Nano Every, aber am Ende ohne Erfolg.
Hab den ganzen Nachmittag damit verbracht mit Versuchaufbauten um den Lüfter in einen Regelbetrieb zu bekommen.
Habe leider keine Ozi od. ahnliches um das PWM -Signal zu prüfen, somit learning by doing.
Wie schon oben beschrieben benötige ich ein 100Hz PWM Signal für die Lüfter-Leistungsendstufe ( Steuergerät) am Lüfter in abhängigkeit der Kühlwassertemperatur ( NTC-Fühler )
Dutycicle: 90° 15% / 100° 30% / 110° 60% / 120° 90%

NTC
bei 40° 287 Ohm / 60° 134 Ohm / 90° 51Ohm / 100° 38Ohm/ 128°18Ohm

Gruß
Ingo

Hallo,

folgende Zeile sollte nur eine Warnung wegen fehlender Klammern geben. Der Compiler weiß nicht recht was er zuerst verknüpfen soll.

TCCR1B = TCCR1B & 0b11111000 | 0x04;

Wobei das auch etwas Unsinn ist. Der Schreiber meinte bestimmt

TCCR1B = 0b11111000 | 0x04;

Nur dann kann man auch gleich schreiben

TCCR1B = 0b11111100;

Was er mit Bit 7 und 6 möchte erschließt sich mir aus seinem Code nicht.
Man benötigt nur die WGM und CS Bits und ich schreibe lieber die Bitnamen statt 0 und 1.

Allerdings muss der Registername TCCR1B bekannt sein. Mich verwundert das er nicht bekannt ist. Hast du in der IDE auch das Board auf UNO R3 umgestellt?

Wegen dem Timer. Wenn du jetzt einen UNO nimmst könnte und sollte dir folgender Thread helfen. Timer 1 PWM Wenn irgendwas unklar sein kannste jederzeit fragen.
Daraus sollte am Ende hervorgehen das man die Pulsweite mit dem Register OCR1A ändert. Für den verwendeten Pin. Passende Funktion mit Formel zum umrechnen DutyCycle % -> OCR1A erstellen und Wert übergeben.

Die Links zu pighixxx funktionieren nicht mehr und das aktuelle Manual vom ATmega328P sieht auch etwas anders aus. Das Manual brauchste zum Verständnis was gemacht wurde hier auch.

Den Rest mit dem NTC kannste bestimmt übernehmen. Habe ich nicht überprüft.

pinout diagramm unov3pdf.pdf (812,6 KB)

Du darfst den NTC nicht über Arduino Versorgen dh. nicht die 5V benutzen.
den bei Übertemp.= 128°C wierden 0,3 A benötigt

Dieses Programm erzeugt 125 Hz PWM:

const int fanPin = 9;                 // Pin für den Lüfter
 
void setup()
{
  TCCR1B = (TCCR1B & 0b11111000) | 0x04;   // Setzt Timer1 (Pin 9 und 10) auf 125 Hz
  analogWrite(fanPin, 128);      // Den Lüfter mit dem PWM Wert ansteuern
}

void loop(){}

Hallo,

ich habe mir das heute nochmal im Detail betrachtet. Das macht in der Gesamtbetrachtung wirklich keinen Sinn.

TCCR1B = TCCR1B & 0b11111000 | 0x04;

Warum? Weil TCCR1B defaultmäßig auf 0b0000'0011 eingestellt ist.
Das ver-UND-en mit Bitmaske 0b1111'1000 löscht das Register komplett.
Danach wird mittels ver-ODER-ern mit 0x04 (0b0000'0100) das Bit 2 gesetzt.
Dann sollte man es auch gleich so schreiben, erzeugt weniger Verwirrung.

Ich bevorzuge folgende Schreibweise _BV(CS12) statt 0x04 damit das besser lesen ist was man da macht bzw. gemacht hat.

Am Ende wird nur der Prescaler von 64

TCCR1B = _BV(CS11) | _BV(CS10);

auf 256 geändert.

TCCR1B = _BV(CS12);

Hallo zusammen
Danke,danke für die vielen Tipps und Hinweise, da habe ich nun erstmal genug zu tun alles zu lesen, und zu verstehen
@Doc_Arduino
Beim Anschliesen des UNO R3 wurde ich ja von der IDE aufgefordert das entsprechende Programm (Treiber) zu installieren,dann getan, nun habe ich festgestellt das der im Werkzeug garnicht expliziet auswählbar ist ?
wird der Programmer automatisch ausgewählt, oder muss/darf ich da auch nur einen bestimmten verwenden
Nun kommt aber noch mein wohlverdienter Urlaub dazwischen, bin dann 4 Wochen mal weg.
Dannach geht es weiter
Gruss Ingo

Der UNO verwendet den/seinen Bootloader, für den Upload.
Es ist also kein Programmer nötig, bzw. egal welchen du da auswählst.

Es sei denn, du möchtest wirklich einen Programmer verwenden, dann wirst du auch den richtigen eintragen müssen.

Hallo,

vielleicht zu spät, vielleicht auch nicht.
Vermutlich hast du Windows? Taucht er im Gerätemanager auf? Ich vermute du musst vielleicht nochmal die IDE neu starten und ggf. den Rechner neu starten. Dann sollte der UNO auswählbar sein. Dann noch den COM Port auswählen und es sollte funktionieren.

Hallo Doc
Danke für den Tipp
ja ich habe Windows10 und musste das IDE neu installiern
Gruß Ingo

Im Gerätemanager siehst Du spezielle Treiber, die meist von Produkten aus Fernost verwendet werden:

grafik

Diese Treiber sind der IDE unbekannt. Da kannst/mußt Du nur den passenden Port auswählen.

Hallo agmue
hat bei mir ja nun funktioniert, alles Gut
Upload auf den UNO R3 hat auch funktioniert,
Versuchaufbau und Funktionkontrolle aber erst in 4-5 Wochen
Gruß
Ingo

Dann wünsche ich Dir einen schönen Urlaub, erhole Dich gut!