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?
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
Danke, jetzt kennt er zwar TCCR0A aber mit
1 | ISR(TIMER0_OVFA_vect) |
kann er nichts anfangen.
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
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 | }
|
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
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?
schau dir mal das clkdiv8 fuse an, das sollte alle fragen beantworten ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.