Kod: Markera allt
/**
* Authors:
* Daniel Björklund (danbj266@student.liu.se)
* Last updated: 2010-04-09
* Version: 1.0
* Description:
*
* Control program for wall-mounted RGB lamp, remote controlled through IR
*
* µC : ATmega168
* Clock rate : 8 MHz
**/
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdint.h>
#include <stdbool.h>
#include "rgb_cmd.h"
// Initial color
#define R_INIT 0
#define G_INIT 10
#define B_INIT 20
// PWM pulse length registers
#define R_PW OCR0A
#define G_PW OCR0B
#define B_PW OCR2A
// LED output pin locations
#define R_PIN 6 // PORT D
#define G_PIN 5 // PORT D
#define B_PIN 3 // PORT B
// IR input pin locations
#define IR_PINS PIND
#define IR_INPUT 2
void init();
void rgb(uint8_t r, uint8_t g, uint8_t b);
int main()
{
init(); // Initialize timers, ports
/* Enable interrupts */
sei();
for(;;) // Loop, interrupt handlers do all the work
{
}
}
void init() {
/* PORT SETUP */
DDRD = (1 << R_PIN) | (1 << G_PIN) | (0 << IR_INPUT);
DDRB = (1 << B_PIN);
/* VARIABLE SETUP */
rgb(R_INIT, G_INIT, B_INIT);
/* TIMER 0 SETUP */
// Red/Green PWM channels, 1/64 clock division
TCCR0A |= (0b11 << WGM00)|(0b10 << COM0A0)|(0b10 << COM0B0);
TCCR0B |= (0 << WGM02) | (0b011 << CS00);
/* TIMER 1 SETUP */
// 1/8 clock division, CTC mode, interrupt/top on tcnt 1000
TCCR1B |= (0b11 << WGM12) | (0b010 << CS10);
ICR1 = 1000;
TIMSK1 |= (1 << ICIE1);
/* TIMER 2 SETUP */
// Blue PWM channel, functions like timer0
TCCR2A |= (0b11 << WGM20)|(0b10 << COM2A0);
TCCR2B |= (0 << WGM22) | (0b011 << CS20);
}
uint8_t cnt = 0;
ISR (TIMER1_CAPT_vect) {
cnt = cnt + 1;
rgb(cnt,cnt,cnt); // Cycle colors
}
void rgb(uint8_t r, uint8_t g, uint8_t b) {
R_PW = r;
G_PW = g;
B_PW = b;
}
TCCR0A |= (0b11 << WGM00)|(0b10 << COM0A0)|(0b10 << COM0B0);
I slutet av denna sätter jag att båda utgångarna OC0A och OC0B ska vara kopplade till timern med PWMfunktion. Jag har lyckats isolera felet till den här raden, om än på ett något underligt sätt. Om jag kommenterar enligt någon av följande varianter så funkar programmet som det ska (förutom att en färgkanal saknas förstås):
Kod: Markera allt
TCCR0A |= (0b11 << WGM00)|(0b10 << COM0A0);
eller
TCCR0A |= (0b11 << WGM00)|(0b10 << COM0B0);
Några förslag på vad som kan vara fel?
Utgångarna OC0A/B är kopplade enbart till ett par transistorer, genom ett 1kohms basmotstånd (som sedan driver LEDkanalerna tillsammans med strömbegrmotstånd).
Tack på förhand!
EDIT: Hoppsan. Råkade posta i Allmänt istället för Mikroprocessorforumet, ni får ursäkta.
