Forum: Mikrocontroller und Digitale Elektronik ATTiny 412 OOK Modulation


von IrgendSoEinTyp I. (irgendsoeintyp_i)



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!

von Johann K. (klammerj)


Lesenswert?

Die F_CPU #define nicht vergessen anzupassen. Sonst funktioniert das 
_delay Zeugs  nicht richtig. Steht typischerweise im makefile.

von IrgendSoEinTyp I. (irgendsoeintyp_i)


Angehängte Dateien:

Lesenswert?

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.

von Johann K. (klammerj)


Lesenswert?

Und wenn du es vor die #includes setzt?

von Georg M. (g_m)


Angehängte Dateien:

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
}

von S. L. (sldt)


Lesenswert?

> ... Byte-Sendeprogramm ...

Gibt es einen Grund, USART0 nicht zu verwenden?

von IrgendSoEinTyp I. (irgendsoeintyp_i)


Angehängte Dateien:

Lesenswert?

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.

von S. L. (sldt)


Lesenswert?

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

von IrgendSoEinTyp I. (irgendsoeintyp_i)


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

von IrgendSoEinTyp I. (irgendsoeintyp_i)


Lesenswert?

Ich werde wohl einfach aufhören main-Funktionen zu verwenden wenn ich 
die Arduino IDE verwende.

von Marci W. (marci_w)


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

von Rainer W. (rawi)


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?

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

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
Noch kein Account? Hier anmelden.