der code ist aber maximum, mehr passt in den kleinen Atmel net rein.
wenn du andere lichtmuster machen möchtest, musst du erst ein paar von meinen löschen.
sehr zu empfehlen ist der
Ledsimulator von spacemaster.
so sieht der code aus
http://vimeo.com/6348245
/*
* Blitzdings main.c
* (c) pangu
*/
/******************************************************************/
/* WICHTIG: Fusebits in Ponyprog für 8MHz setzen:
Häkchen in Ponyprog:
CKSEL3 gesetzt
CKSEL2 nicht gesetzt
CKSEL1 gesetzt
CKSEL0 gesetzt
*/
/******************************************************************/
#include "main.h"
#include "timer.h"
#include "analog.h"
#include "lprg.h"
/* Strings zum definieren von Dauer-Ein Dauer-Aus */
const char l_on[]="A";
const char l_off[]="a";
// Wait flags:
// . 10 ms
// : 20 ms
// ; 50 ms
// I 100 ms
// N 200 ms
// M 300 ms
// V 500 ms
// S 1s
// LED:
// A-an a-aus
char *led_1[] = {
"a", // LED #1
"a", // LED #2
"a", // LED #3
"a", // LED #4
"a", // LED #5
"a", // LED #6
"a", // LED #7
"a", // LED #8
"a", // LED #9
"a" // LED #10
};
char *led_2[] = {
"A", // LED #1
"a", // LED #2
"a", // LED #3
"a", // LED #4
"a", // LED #5
"a", // LED #6
"a", // LED #7
"a", // LED #8
"a", // LED #9
"a" // LED #10
};
char *led_3[] = {
"A:aIA:aIA:aIA:aV", // LED #1
"a", // LED #2
"a", // LED #3
"a", // LED #4
"a", // LED #5
"a", // LED #6
"a", // LED #7
"a", // LED #8
"a", // LED #9
"a" // LED #10
};
char *led_4[] = {
"A:aIA:aIA:aIA:aV", // LED #1
"NA:aIA:aIA:aMS", // LED #2
"a", // LED #3
"a", // LED #4
"a", // LED #5
"a", // LED #6
"a", // LED #7
"a", // LED #8
"NA:aMS:aIA:aIA", // LED #9
"a" // LED #10
};
char *led_4b[] = {
"A", // LED #1
"A", // LED #2
"a", // LED #3
"a", // LED #4
"a", // LED #5
"a", // LED #6
"a", // LED #7
"a", // LED #8
"A", // LED #9
"a" // LED #10
};
char *led_5[] = {
"A", // LED #1
"a", // LED #2
"a", // LED #3
"aIA:aIA:aIA:aIA:aV", // LED #4
"a", // LED #5
"a", // LED #6
"aV:aIA:aIA:aIA:aIA", // LED #7
"a", // LED #8
"a", // LED #9
"A" // LED #10
};
char *led_6[] = {
"aI:AI:aI:AI:", // LED #
"aM;AM;aM;AM;", // LED #2
"aV:aIA:aIA:aIA:aIA", // LED #
"aIA:aIA:aIA:aIA:aV", // LED #4
"aIA:aIA:aIA:aIA:aV", // LED #
"aV:aIA:aIA:aIA:aIA", // LED #
"aV:aIA:aIA:aIA:aIA", // LED #7
"aIA:aIA:aIA:aIA:aV", // LED #
"AM;aM;AM;aM;", // LED #9
"A" // LED #10
};
char *led_7[] = {
"A:aIA:aIA:aIA:aV", // LED #1
"A", // LED #2
"A", // LED #3
"A", // LED #4
"A", // LED #5
"A", // LED #6
"A", // LED #7
"A", // LED #8
"A", // LED #9
"a" // LED #10
};
char *led_8[] = {
"a:a:a:a:a:A:a:a:a:", // LED #1
"a:a:a:a:A:a:a:a:a:", // LED #2
"a:a:a:A:a:a:a:a:a:", // LED #3
"a:a:A:a:a:a:a:a:a:", // LED #4
"a:A:a:a:a:a:a:a:a:", // LED #5
"A:a:a:a:a:a:a:a:a:", // LED #6
"a:a:a:a:a:a:a:a:A:", // LED #7
"a:a:a:a:a:a:a:A:a:", // LED #8
"a:a:a:a:a:a:A:a:a:", // LED #9
"a" // LED #10
};
char *led_9[] = {
"a;;;;;A;a;;;;;;;;;A;a;;;", // LED #1
"a;;;;A;a;;;;;;;;;;;A;a;;", // LED #2
"a;;;A;a;;;;;;;;;;;;;A;a;", // LED #3
"a;;A;a;;;;;;;;;;;;;;;A;a", // LED #4
"a;A;a;;;;;;;;A;a;;;;;;;;", // LED #5
"A;a;;;;;;;;A;a;;;;;;;;;;", // LED #6
"a;;;;;;;;A;a;;;A;a;;;;;;", // LED #7
"a;;;;;;;A;a;;;;;A;a;;;;;", // LED #8
"a;;;;;;A;a;;;;;;;A;a;;;;", // LED #9
"a" // LED #10
};
char *led_10[] = {
"A", // LED #1
"A", // LED #2
"A", // LED #3
"A", // LED #4
"A", // LED #5
"A", // LED #6
"A", // LED #7
"A", // LED #8
"A", // LED #9
"a" // LED #10
};
// low Volatage Warning: alle LEDs toggeln synchron, 100ms Leucht/Aus-Dauer
char *led_lowVolt[] = {
"A", // LED #1 vorn weiss
"aIAI", // LED #2 hinten blau
"aIAI", // LED #3 weiss unten
"aIAI", // LED #4 weiss seite
"aIAI", // LED #5 blau unten
"aIAI", // LED #6 blau seite
"aIAI", // LED #7 grün unten
"aIAI", // LED #8 grün seite
"aIAI", // LED #9 rot unten
"a" // LED #10 rot seite
};
// Hier die zu verwendenden LichtProgramme einfach eintragen.
int current = 0;
void *modes[]= { led_1, led_1, led_10, led_10, led_7, led_7, led_4b, led_4b, led_4, led_4, led_3, led_3, led_2, led_2, led_5, led_5, led_6, led_6, led_8, led_8, led_9, led_9, led_lowVolt, led_lowVolt };
void nextMode() {
current = ++current % (sizeof(modes)/sizeof(void *));
lprg_init(modes[current]);
}
ISR(INT1_vect)
{
nextMode();
}
int main() {
int tim1s, tim3s, tim10s;
int Vcurr;
// Ports einstellen
// Pin B |7|6|5|4|3|2|1|0
// Binär:|0|0|0|0|0|1|0|1 (b) => #05 (h)
// Pin B0 und B2 als Ausgänge festlegen
DDRB = 0x05;
// Pin C |7|6|5|4|3|2|1|0
// Binär:|0|0|1|1|1|1|1|0 (b) => #3E (h)
// Pin C1 bis C5 als Ausgänge festlegen
DDRC = 0x3E;
// Pin D |7|6|5|4|3|2|1|0
// Binär:|1|1|1|1|0|0|0|0 (b) => #F0 (h)
DDRD = 0xF0;
//Pullup für PD3 aktivieren
PORTD |= (1 << PD3);
//interrupt konfigurueren
GIMSK = 1<<INT1;
MCUCR = 1<<ISC10;
ALLES_OFF;
STATUS_ON;
Timer_Init();
lprg_init(modes[current]);
tim10s = SetDelay(10000);
tim3s = SetDelay(3000);
tim1s = SetDelay(1000);
sei(); //interrupts einschalten
while (1) {
if(flag10ms) { // every 10ms
flag10ms = 0;
lprg_step(); // next step in light prog
}
// 1s-Task: Status-LED toggeln, Spannung checken
if(CheckDelay(tim1s)) {
Vcurr = getVcurr();
if(Vcurr < 180) {
lprg_init(led_lowVolt);
}
STATUS_TOGGLE;
tim1s = SetDelay(1000);
}
// 3s-Task: Unterspannungswarnung ggf. zurücknehmen
if(CheckDelay(tim3s)) {
if(Vcurr>=180) {
lprg_init(modes[current]);
}
tim3s = SetDelay(3000);
}
// 10s-Task: DEMO: programm wechseln
if(CheckDelay(tim10s)) {
// nextMode();
tim10s = SetDelay(10000);
}
}
}