Code:
/* >>
Sicherung 05Nov2011 1220 ..\C1 mC Projekte\mist\ML-3_1p3
// ============================================================================== =
Target MCU : ATtiny13
Target Hardware : FLEX2313, umgesteckt auf Pinout tiny13
Target cpu-frequ. : 9,6 MHz, interner Oszillator
// ============================================================================== =
Enthaltene Routinen :
#includes siehe unten //
void TC0ML3_init(void) // Init Timer/Counter0 für 37,5 kHz-Modulation
void wt25us(uint16_t us) // Pausenzeit etwa 25 Mikrosekunden
int main(void)
// ============================================================================== =
*** Versionsgeschichte:
====================
1p3 05Nov2011 1210 Betriebs-/Funktions-rtLED auf PB1 ansteuern
1p2 01Nov2011 1940 Zum Stromsparen werden alle Pins als Ausgang definiert,
jede viertel Sekunde wird - endlos - in eine Doppelsequenz gesendet
1p1 01Nov2011 1530 Redaktionelle Nacharbeiten
1p0 01Nov2011 1520 Nach Korrektur der Zeiten (Pause zum 4. Burst) gehts problemlos
x00 31Okt11 1020 Neu
// ============================================================================== =
*** Aufgabenstellung : Fernsteuerung für Nikon D80
Original: ..\C2\Cpcr13\Cpcr13_x33.c x11 11apr09 2230
// ============================================================================== =
Alle möglichen Portanschlüsse am ATtiny 13 :
============== ===
dW, /RESET, (PB5) 1 8 Vcc
PCINT3, CLKI, ADC3,(PB3) 2 7 (PB2), SCK, T0, ADC1, PCINT2
PCINT4, ADC2,(PB4)___3 6___(PB1), MISO, INT0, AIN1, PCINT1, OC0B
GND 4 5 (PB0), MOSI, AIN0, PCINT0, OC0A
--------------------==========-----------------------
Vorgesehene/belegte Anschlüsse am ATtiny 13 :
==================
/RESET, (PB5) 1 8 Vcc
(PB3) 2 7 (PB2)
Taster, PCINT4, (PB4)___3 6___(PB1), ab 1p3 rtLED = Betriebsanzeige
LED-Kathode, GND 4 5 (PB0), IR-LED-Anode + 0k22
*/
// ============================================================================== =
// ============================================================================== =
//
#include <avr/io.h> //
#include <stdlib.h> //
#include <avr/interrupt.h> // Wegen des Timers
//
// #define MCU = // siehe Current Configuration Options
// #define F_CPU 9600000 // siehe Current Configuration Options
//
// ============================================================================== =
// ============================================================================== =
// ===== Subroutinen ========================================================== =
// ============================================================================== =
// ============================================================================== =
// == Ansteuerung/Modulation einer IRLED, 40 kHz für NIKON-Fernsteuerung ML-L3
// Die LED wird moduliert durch PB0=OC0A
void TC0ML3_init(void) // Init Timer/Counter0 für 37,5 kHz-Modulation
{ //
TCCR0A |= (1<<COM0A1); // Clear/set OC0A on Compare Match, OC0A ist PB0
// normale PWM aktivieren (nicht invertiert)
// Bezug doc 2535J-AVR-08/10 doc S 63
TCCR0A |= (1<<WGM02)|(1<<WGM01)|(1<<WGM00);
// fast PWM, TOP=OCR0A doc S 72
TCCR0B |= (1<<CS00); // no Prescaler, clk => 9,6 MHz doc S 73
OCR0A = 64; // => Einschaltdauer ca. 25%
}
// ============================================================================== =
// ============================================================================== =
// ============================================================================== =
/*### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !*/
//
void wt25us(uint16_t us) // Pausenzeit etwa 25 Mikrosekunden
{ // diese Zeit ist NUR experimentell bestimmt
for(; us>0; us--) // für tiny13 @ 9,6 MHz
{
uint16_t __c = 54;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
// ============================================================================== =
// ============================================================================== =
// ===== ENDE Subroutinen ================================================== =
// ============================================================================== =
// ============================================================================== =
// === HAUPTProgramm und Initialisierungen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
int main(void) //
{ //
uint8_t i; // Zählvariable für Endlosschleife
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// /RESET, (PB5) 1 A - 8 Vcc //
// (PB3) 2 A A 7 (PB2) //
// (PB4)___3 A A 6___(PB1) //
// LED-Kathode GND 4 - A 5 (PB0) // LED-Anode + Widerstand 1k
// Pins als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b00111111; // siehe aktuell oben
PORTB = 0b11000000; // und Port/Pull Ups (1) aktivieren
// ###>>> DDRB-0 auf 0 setzen, schaltet die LED AUS !!!!!
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
i = 0; //
TC0ML3_init(); // Initialisiere LED-Interrupt
TCCR0B &= ~(1<<CS00); // no Prescaler, clk => 9,6 MHz doc S 73
// .. damit wird der Timerinterrupt verhindert
sei(); // Erlaube Interrupts
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
// ============================================================================== =
// Lauffähiges Codebeispiel, getestet 01. Nov. 2011 mit ND80
// ============================================================================== =
// ============================================================================== =
// Vorgeschriebenes Timing in ms und in ticks zu 25-µs
// on: 2,000 0,390 0,410 0,400
// =in µs-ticks 80 16 16 16
// off: --- 27,830 1,580 3,580 ----
// =in µs-ticks 1113 63 143
// Pause bis zur zweiten Sequenz: 63 ms entspr. 2520 µs-ticks
// vgl: http://www.sbprojects.com/projects/nikon/index.php
// http://www.bigmike.it/ircontrol/index.html bzw.
// http://www.bigmike.it/ircontrol/images/ML-L3.r2.png
// ============================================================================== =
//
while (1) //
{ //
i++; // Schleifezähler eins rauf
// Die Kommandosequenz
// 1. Burst
PORTB |= (1<<PB1); // rtLED einschalten
DDRB |= (1<<PB0); // IR-LED schalten
TCCR0B |= (1<<CS00); // no Prescaler, clk => 9,6 MHz doc S 73
wt25us ( 80); //
TCCR0B &= ~(1<<CS00); // no clock, timer stopped doc S 73
DDRB &= ~(1<<PB0); // IR-LED schalten
wt25us ( 1113); //
// 2, Burst
DDRB |= (1<<PB0); // IR-LED schalten
TCCR0B |= (1<<CS00); // no Prescaler, clk => 9,6 MHz doc S 73
wt25us ( 16); //
TCCR0B &= ~(1<<CS00); // no clock, timer stopped doc S 73
DDRB &= ~(1<<PB0); // IR-LED schalten
wt25us ( 63); //
// 3. Burst
DDRB |= (1<<PB0); // IR-LED schalten
TCCR0B |= (1<<CS00); // no Prescaler, clk => 9,6 MHz doc S 73
wt25us ( 16); //
//
TCCR0B &= ~(1<<CS00); // no clock, timer stopped doc S 73
DDRB &= ~(1<<PB0); // IR-LED schalten
wt25us ( 143); //
// 4. Burst
DDRB |= (1<<PB0); // IR-LED schalten
TCCR0B |= (1<<CS00); // no Prescaler, clk => 9,6 MHz doc S 73
wt25us ( 16); //
TCCR0B &= ~(1<<CS00); // no clock, timer stopped doc S 73
DDRB &= ~(1<<PB0); // IR-LED schalten
//
PORTB &= ~(1<<PB1); // rtLED ausschalten
//
// Pause bis zur nächsten Sequenz: 63 ms entspr. 2520 µs-ticks
wt25us ( 2520); //
if (i == 2) //
{ //
i = 0; //
wt25us (10000); // Warte eine viertel Sekunde, danach neue
} // Doppelschleife
} // Ende von while (1)
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return 0;
}
// ===== Ende
// ============================================================================== =
/* Es folgt der aktuelle Übersetzungskommentar:
rm -rf D01_20.o D01_20.elf dep/* D01_20.hex D01_20.eep D01_20.lss D01_20.map
Build succeeded with 0 Warnings...
avr-gcc -mmcu=attiny13 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -O0
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
-MD -MP -MT D01_20.o -MF dep/D01_20.o.d -c ../D01_20.c
avr-gcc -mmcu=attiny13 -Wl,-Map=D01_20.map D01_20.o -o D01_20.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature D01_20.elf D01_20.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load"
--change-section-lma .eeprom=0 --no-change-warnings -O
ihex D01_20.elf D01_20.eep || exit 0
avr-objdump -h -S D01_20.elf > D01_20.lss
AVR Memory Usage
----------------
Device: attiny13
Program: 542 bytes (52.9% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
Ende des Kommentars ...
============================================================ */
Lesezeichen