ATTiny 412 OOK Modulation

OP #7873881
Lesenswert?

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!

#7873968
Lesenswert?

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
}
Angehängte Dateien:
OP #7874053
Lesenswert?

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..

Gast #7874136
Lesenswert?

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

#7874859
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren