Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <inttypes.h>
//#include <global.h> // include our global settings
//#include <uart.h> // include UART function library
#include <proc.h>
#include <avr/pgmspace.h>
#define uchar unsigned char
#define uint unsigned int
static void avr_init(void);
unsigned const int phaseAngleTiming[257] = {
498,704,863,997,1116,1223,1322,1414,1501,1583,
1662,1737,1809,1878,1946,2011,2074,2136,2196,2254,
2312,2368,2422,2476,2529,2581,2632,2682,2732,2780,
2828,2876,2922,2968,3014,3059,3103,3147,3191,3234,
3276,3319,3360,3402,3443,3483,3524,3564,3603,3643,
3682,3721,3759,3797,3835,3873,3910,3948,3985,4022,
4058,4094,4131,4167,4202,4238,4274,4309,4344,4379,
4414,4448,4483,4517,4551,4585,4619,4653,4687,4721,
4754,4787,4821,4854,4887,4920,4953,4985,5018,5051,
5083,5116,5148,5180,5212,5245,5277,5309,5341,5373,
5404,5436,5468,5500,5531,5563,5594,5626,5657,5689,
5720,5751,5783,5814,5845,5876,5908,5939,5970,6001,
6032,6063,6095,6126,6157,6188,6219,6250,6281,6312,
6343,6374,6405,6437,6468,6499,6530,6561,6592,6624,
6655,6686,6717,6749,6780,6811,6843,6874,6906,6937,
6969,7000,7032,7064,7096,7127,7159,7191,7223,7255,
7288,7320,7352,7384,7417,7449,7482,7515,7547,7580,
7613,7646,7679,7713,7746,7779,7813,7847,7881,7915,
7949,7983,8017,8052,8086,8121,8156,8191,8226,8262,
8298,8333,8369,8406,8442,8478,8515,8552,8590,8627,
8665,8703,8741,8779,8818,8857,8897,8936,8976,9017,
9057,9098,9140,9181,9224,9266,9309,9353,9397,9441,
9486,9532,9578,9624,9672,9720,9768,9818,9868,9919,
9971,10024,10078,10132,10188,10246,10304,10364,10426,10489,
10554,10622,10691,10763,10838,10917,10999,11086,11178,11277,
11384,11503,11637,11796,12002};
volatile unsigned char ch1_level = 50,ch2_level = 0;
volatile unsigned char next_trigger;
volatile int test = 50;
volatile unsigned char clk_msec = 0,clk_sec = 0,clk_min = 00,clk_hour = 20;
volatile unsigned int t_msec = 0,old_msec = 0;
volatile unsigned char c_on=0;
int main(void)
{
avr_init();
//Variable declaration
char btn_temp;
char btn1,btn2;
unsigned int btn1_time = 0;
while(1==1)
{
btn_temp = PINA & 0b00001111;
btn1 = PINA & 0b00000001;
btn2 = PINA & 0b00000010;
//btn3 = PINA & 0b00000100;
//btn4 = PINA & 0b00001000;
if (old_msec != t_msec){
if(!btn1){
btn1_time = btn1_time + (t_msec - old_msec);
}
old_msec = t_msec;
}
if (clk_msec>=100){
PORTB = PORTB ^ 1<<2;
clk_msec = 0;
clk_sec++;
}
if (!btn1){
//in_use = in_use ^ 1<<0; // Toggle
//in_use = in_use & ~(1<<0); // Set
if (btn1_time >= 150){
// put_char(ch1_level); //Debuging
PORTB = PORTB & ~(1<<0); //dem kneppi seng luuscht unmaan :
btn1_time=149;
ch1_level = ch1_level + 1;
if (ch1_level >=255){
ch1_level = 0;
}
}
}
else{
btn1_time = 0;
if (!(PORTB & 1<<0)){
PORTB = PORTB ^ 1<<0;
}
}
}
}
static void avr_init(void)
{
// Initialize device here.
// initialize the UART (serial port)
//UART einstellen 8 Bit, 1 Stoppbit
UCSRB = (1<<TXEN) ;
UBRRH = (uchar)(UART_BAUD_SELECT>>8); // (uart.h)
UBRRL = (uchar)(UART_BAUD_SELECT); //Baud rate einstellen
UCSRC = (1<<URSEL)| (1<<UCSZ1)| (1<<UCSZ0); // 8 Bit
DDRA = 0b11110000;
PORTA = 0x00;
DDRB = 0xFF;
PORTB = 0xFF;
DDRC = 0xFF;
PORTC = 0x00;
enable_int(0);
MCUCR = (1<<ISC01) | (1<<ISC00); // int0 sense: rising edge
TCCR1B = (1<<CS11);//Vorteiler auf 8
// TIMSK |= (1<<TOIE1);
TIMSK |= (1<<OCIE1A);
TCNT1 = 1;
OCR1A =65530;
sei();
return;
}
INTERRUPT(SIG_INTERRUPT0){
TCNT1 = 1; //TIMER_START + TIMER_FIXED_BIAS - (127 << 4) + (u16) (g_zeroCrossBias << 4);
TCCR1B = (1<<CS11); // CK/8
TIMSK &= ~((1<<OCIE1A) | (1<<OCIE1B) | (1<<TOIE2) | (1<<TOIE1));
GICR &= ~(1<<INT0); // make sure we're not called recursively
GIFR = (1<<INTF0); // clear flag in case it's been set again already
t_msec++;
clk_msec++;
TCNT1 = 1;
next_trigger = 1;
OCR1A = 498;
// OCR1A = phaseAngleTiming[(int) next_trigger];
PORTC = 0x00;
GICR |= (1<<INT0); // reenable this isr
TIMSK |= (1<<OCIE1A);
return;
}
INTERRUPT(SIG_OUTPUT_COMPARE1A){
if (next_trigger >= ch1_level){
PORTC = PORTC | 0b00000001;
}
next_trigger = next_trigger + 1;
OCR1A = phaseAngleTiming[(int) next_trigger];
return;
}
//Interrupt enabler
void enable_int(char interrupt)
{
switch(interrupt)
{
case 0:
GICR = (1<<INT0);
break;
case 1:
GICR = (1<<INT1);
break;
default:
break;
}
}
void disable_int(char interrupt)
//Interrupt disabler
{
switch(interrupt)
{
case 0:
GICR = (1>>INT0);
break;
case 1:
GICR = (1>>INT1);
break;
default:
break;
}
}
void put_int(char c)
{
char c1=0;
while( (UCSRA & 1<<UDRE) == 0 ); //bereit für neues Zeichen ???
// itoa(c,c1,10);
UDR = c1; //und ausgeben
}
void put_char(char c)
{
while( (UCSRA & 1<<UDRE) == 0 ); //bereit für neues Zeichen ???
UDR = c; //und ausgeben
}
also das ganze soll mal ne dimmer steuerung werden doch bis jetzt ist es nur ne "ich flakere nur mal kurz und bin dann ganz aus" steuerung.
Lesezeichen