Forum: Mikrocontroller und Digitale Elektronik Frequnzgenerator | IR-Fernbedinung


von Christian R. (Gast)


Lesenswert?

Ich will mir eine IR-Fernbedienung nachbauen leider keine RC5. Die 
Datenblöcke habe ich hinbekommen auch mit den Zeiten, habe also eine LED 
für die gliche Zeit Eingeschalten nun ist mein Problem das ich diese 
Schaltzeiten eigentlich nur ein Fenster für das Trägersignal sind aber 
wie kann ich diese Trägerfrequenz erzeugen. Mir würde es zunächst 
reichen das Trägersignal zu erzeugen um die Fensterzeiten würde ich mich 
im Nachhinein kümmern.
Mein Versuch mit Timer0 und Interrupt in C hatten keinen erfolg (TCCR0 
nicht bekannt) [ATTINY2313].

Kann mir da einer Helfen einen Frequenzgenerator in C zu schreiben?

von Michael U. (amiga)


Lesenswert?

Hallo,

schonmal ins Datenblatt des Tiny2313 geschaut, wie die Register beim 
Timer0 heißen?
Da gibt es 2: TCCR0A und TCCR0B

Ich hoffe jetzt mal, C kennt die auch unter dem Namen. ;)

Gruß aus Berlin
Michael

von Christian R. (Gast)


Lesenswert?

Danke, jetzt kennt er zwar TCCR0A aber mit
1
ISR(TIMER0_OVFA_vect)

kann er nichts anfangen.

von Tip (Gast)


Lesenswert?

Der IRQ, den Du nutzen willst gibt es auch nicht.
Ich vermute du brauchst TIMER0_OVF_vect.
Außerdem mußt Du

#include avr/interrupt.h

oben in der C-Datei stehen haben.

Siehe auch hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

von Christian R. (Gast)


Lesenswert?

Wenn ich richtig aufgepasst habe dann errechnet sie die Blinkfrequenz 
für Timer0 8bit OVF alle 256  doch so

(F_CPU / Prescaler) / OVF
(8MHz / 1024) / 256 = 30,52

bedeutet also das der Controller  30-mal in der Sekunde den Port an bzw. 
ausschaltet wenn ich mir das aber am Oszi ansehe braucht er 250ms um den 
Port umzuschalten kommt also gerade mal auf 4-mal in der Sekunde das der 
Port an bzw. ausgeschalten wird.

Habe ich da etwas nicht richtig verstanden oder ist da ein 
Programmfehler?


[ATtiny2313 FUSE: 0xDF64]
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
ISR(TIMER0_OVF_vect) {
5
  PORTB ^= (1 << PB4);
6
  //TCNT0 = 231;
7
}
8
9
10
11
12
int main(void) {
13
  DDRB = (1 << PB4);                  // PB4 als Ausgang schalten
14
  PORTB &= ~(1 << PB4);                // Alle Ausgang auf 0 schalten
15
16
  //TCCR0B |= (0 << CS02) | (0 << CS01) | (0 << CS00);   //Timer abgeschalten
17
  //TCCR0B |= (0 << CS02) | (0 << CS01) | (1 << CS00);   //Prescaler auf 0 stellen / CPU Takt
18
  //TCCR0B |= (0 << CS02) | (1 << CS01) | (0 << CS00);   //Prescaler auf 8 stellen
19
  //TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00);   //Prescaler auf 64 stellen
20
  if(PINB & (1 << PINB3)) {
21
    TCCR0B |= (1 << CS02) | (0 << CS01) | (0 << CS00);   //Prescaler auf 256 stellen  |16
22
  } else {
23
    TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00);   //Prescaler auf 1024 stellen |4
24
  }
25
26
  TIMSK  |= (1 << TOIE0);
27
28
  sei(); // Interrupts einschalten
29
30
  for(;;); //ever
31
  return 0;
32
}

von Michael U. (amiga)


Lesenswert?

Hallo,

ich habe die Fuse-Bits jetzt nicht auseinandergenommen, aber Du bist 
sicher, daß er so mit 8MHz läuft?

Ein Tiny2313 im Lieferzustand läuft mit 1MHz, dann würde es ja stimmen.

Gruß aus Berlin
Michael

von Christian R. (Gast)


Lesenswert?

Laut AVR-OSP II steht er auf 8MHz Int RC (default) und dieses Programm
hat für intern nur 4MHz und 128kHz.

Apropos 128kHz, habe gestern mal einen anderen Tiny auf 128kHz gestellt 
der blinkt jetzt auch seeehr langsam aber ich kann ihn nicht mehr 
programmieren?! Wie geht das eigentlich ist der jetzt zu langsam für 
meine ISP?

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

schau dir mal das clkdiv8 fuse an, das sollte alle fragen beantworten ;)

von Christian R. (Gast)


Lesenswert?

Und was ist "clkdiv8" ?

von Michael U. (amiga)


Lesenswert?

Hallo,

Datenblatt Tiny2313 Seite 31 letzter Abschnitt...

Die CDIV8 Fuse ist ab Werk programmiert und der Takt wird durch 8 
geteilt, das ergibt dann 1MHz wenn der interne RC-Takt auf 8MHz steht 
(auch ab Werk).

Gruß aus Berlin
Michael

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.