Hallo liebe AVR-Community. Ich bin noch relativ neu in der MC Programmierung und hadere gerade mit folgendem Problem: Ich möchte ein 1 Byte langes Signal auf ein 433Mhz Trägersignal aufmodulieren und wollte dafür folgendes Programm in einer Low-Power Sendeeinheit mit 1Mhz Takt verwenden. Den Takt stelle ich über die Arduino IDE ein. Deepseek sagt, die IDE setzt direkt die Fuses. Nun zum Problem: Bei einem Takt von 20 Mhz und deaktiviertem Prescaler (Teilung = 1) bekomme ich die erhoffte Bitlänge von 500us. Wenn ich jetzt aber den Takt auf 1 Mhz stelle verringert sich die Bitlänge auf etwa 32us. Daher habe ich ein einfaches Blink-Programm geschrieben um zu testen wie sich Bitlänge meines Signals in Verbindung mit Prescaler (Standardteilung von 6) und ohne Prescaler bei den Taktraten 1 Mhz und 20 Mhz verhalten. Im Anhang eine Tabelle zur beobachteten Veränderung der Bitlänge unter o.g. Bedingungen. Für den Fall dass noch nicht klar geworden ist was ich eigentlich möchte.. Ich möchte bei meinem Byte-Sendeprogramm eine Bitlänge von 500us einstellen können damit das Datensignal mit 2kbps auf mein Trägersignal aufmoduliert werden kann. Die Sendeeinheit soll mit möglichst wenig Strom auskommen daher die Idee den Takt auf 1 Mhz zu reduzieren. Vielen Dank schonmal im vorraus!
Die F_CPU #define nicht vergessen anzupassen. Sonst funktioniert das _delay Zeugs nicht richtig. Steht typischerweise im makefile.
Vielen Dank für den Tipp. Leider hat das mein Problem nicht behoben. Ich habe eben diese Zeile für 20 bzw 1 Mhz noch in das Programm eingefügt aber es hat leider nichts geändert.
Testcode für 2 MHz Main Clock und 10 kHz Output am PA3 (Pin 7):
1 | ATtiny412/402/212/202 |
2 | |
3 | VDD 1|‾‾‾‾‾‾‾|8 GND |
4 | PA6 2| |7 PA3 / TCA0 WO0 ----> 10 kHz |
5 | PA7 3| |6 UPDI |
6 | PA1 4|_______|5 PA2 |
7 | |
8 | 500 kHz / 25 / 2 = 10 kHz |
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | _PROTECTED_WRITE(CLKCTRL_MCLKCTRLB, CLKCTRL_PDIV_10X_gc | CLKCTRL_PEN_bm); // 2 MHz Main Clock |
6 | |
7 | TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP0EN_bm | TCA_SINGLE_WGMODE_FRQ_gc; // TCA Frequency Mode |
8 | TCA0.SINGLE.CMP0 = 24; // (25-1) |
9 | TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV4_gc | TCA_SINGLE_ENABLE_bm; // 500 kHz TCA Clock, start timer |
10 | |
11 | PORTA.DIRSET = PIN3_bm; // PA3 output |
12 | |
13 | while(1) |
14 | {
|
15 | |
16 | }
|
17 | }
|
> ... Byte-Sendeprogramm ...
Gibt es einen Grund, USART0 nicht zu verwenden?
Hier das Ergebnis deines Testprogramms. Ich könnte damit eine Bitlänge einstellen die ungefähr passend wäre allerdings wüsste ich gerne trotzdem wieso es nicht genau so funktioniert wie es soll. In diesem Fall sollte es wohl ein 10khz „blinkprogramm“ sein.
> 10 kHz Output am PA3 > In diesem Fall sollte es wohl ein 10khz „blinkprogramm“ sein. Offenbar ist die Fuse OSCCFG auf 0x01 gesetzt, d.h. der Controller läuft mit 16 MHz (statt 20).
Ich habe das Problem gefunden: Es scheint eine sehr schlechte Idee gewesen zu sein, einfach den von DeepSeek vorgeschlagenen Code zu übernehmen, da er die Main- Funktion überschreibt. Wenn ich meinen Code umschreibe, sodass ich keine Main-Funktion definiere und nur die Setup- und Loop-Funktionen verwende, funktioniert alles gut. Es scheint, als ob die Standard-Main-Funktion etwas mehr tut, als nur „Setup“ aufzurufen und dann wiederholt die loop-Funktion aufzurufen. wahrscheinlich irgendwas mit dem Prescaler..
Ich werde wohl einfach aufhören main-Funktionen zu verwenden wenn ich die Arduino IDE verwende.
Hi ISET, ich würde vorschlagen, den von KIs gelieferten Antworten nicht blind zu vertrauen und deren Ergebnisse nicht unkontrolliert zu verwenden. (ich dachte, das sein inzwischen allgemein bekannt!? (*)) ;-) (*) Ich verwende auch sehr gerne KIs, und es bringt mich sehr schnell weiter, wenn ich mich in ein neues Thema einarbeiten will. Ich habe dann schnell Lösungs- bzw. Anwendungswege. Allerdings funktionieren die meisten Code-Beispiele nicht oder lassen sich gar nicht erst fehlerfrei übersetzen. ciao Marci
IrgendSoEinTyp I. schrieb: > Ich werde wohl einfach aufhören main-Funktionen zu verwenden wenn ich > die Arduino IDE verwende. Richtig, wenn du die main()-Funktion von Arduino verwenden willst, ist es keine gute Idee, sie durch eine eigene zu überschreiben. > Es scheint, als ob die Standard-Main-Funktion etwas mehr tut, > als nur „Setup“ aufzurufen und dann wiederholt die loop-Funktion > aufzurufen. Warum guckst du dir in main.cpp nicht an, was in der main()-Funktion von Arduino passiert?
:
Bearbeitet durch User
Apropos 433MHz OOK. Soviel ich weiß, ist bei dieser Funkkommunikation auch die Null ein Signal und nicht nichts. Zumindest bei den Funksteckdosen ist es so. Aber das wäre schon ein Thema für das Forum "HF, Funk und Felder".
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.