Hallo zusammen,
ich habe in einem anderen Forum folgenden Code für eine
Treppenstufenbeleuchtung gefunden. Dieser Code funktioniert soweit
einwandfrei.
Auf der Platine sind Jumper zur Vorwahl der Anzahl an LEDs vorhanden.
Die LEDs werden durch 2 Lichtschranken als INT0 und INT1 gesteuert.
Nun möchte ich dieses Script gerne verändern: Der Jumper soll durch
einen Schalter ersetzt werden mit dem ich alle LEDs einschalten kann. So
möchte ich quasi ein Dauerlicht erzeugen.
Es wäre nett, wenn mir einer bei der Umsetzung helfen könnte.
Ich muß ja quasi den Interrupt sperren und alle Ausgänge auf 1 setzen.
Habe schon ein bisschen probiert, aber irgendwie hat es nicht
funktioniert.
Vielen Dank für eure Hilfe
Gruß
Scubydoo
Hier der Quelltext
1
/*
2
* main.c
3
*
4
* Created on: 14.10.2010
5
* (C) 2010 D.Goersch
6
*/
7
8
9
#include<avr/io.h>
10
#include<avr/pgmspace.h>
11
#include<avr/interrupt.h>
12
#include<util/delay.h>
13
#include<stdint.h>
14
#include"soft-pwm.h"
15
16
#define DELAY_FADE 11 // wait XX ms between each fade step
17
#define DELAY_LED 20 // wait XX ms between each LED
18
#define DURATION_SHORT 15 // autofade off after XX sec if jumper is open (high)
19
#define DURATION_LONG 25 // autofade off after XX sec if jumper is closed (low)
20
#define LTR 0 // Fade fom PortA0 forwards
21
#define RTL 1 // Fade from the last (amount) to PortA0 backwards
22
#define OFF 0 // State of
23
#define ON 1 // the LEDs
24
25
uint8_tamount=0;// Amount of LEDs
26
uint8_ttime;// Fade-Off time
27
uint8_tdirection;// 0 - LTR 1 - RTL
28
uint8_tstate=OFF;// 0 - OFF 1 - ON
29
volatileuint8_tint0=0,int1=0;// flags for interrupts
Scubydoo schrieb:> Habe schon ein bisschen probiert, aber irgendwie hat es nicht> funktioniert.
was (wo) ist "ein bichen", und was ist "irgendwie"?
Solche Aussagen zwecks Fehleranalyse und Unterstützungshilfe sind so
sinnvoll wie mein Tip: "Du must irgendwie irgendwas an dem Programmcode
ändern, um die gewünschte Funktion zu erhalten."
Wenn du die Jumper für die Anzahl der LEDs anders benutzt und die
Lichtschranken nicht mehr benutzt, was bleibt dann vom Originalprogramm?
Wäre es da nicht sinnvoller ein eigenes Programm zu schreiben?
Braucht man dafür überhaupt einen µC oder reicht eine AN/AUS Schaltung?
Beim vorhandnen Programm solltest du Dauerlicht bekommen, wenn
* die Lichtschranke fürs Einschalten mit dem Schalter so eingestellt
wird, dass immer der betreffende Interrupt ausgelöst wird (ODER,
Schalter parallel)
* und die Lichtschranke für das Ausschalten so eingestellt wird, dass
nie ein Interrupt ausgelöst wird (UND, Schalter in Serie)
* das time auto-off im Code auskommentiert wird (z.B. running nicht
hochzählen).
Schaltplan und Beschreibng der Originalschaltung wäre nicht schlecht.
Hallo,
danke für die erste Hilfestellung:
1) Ja, das Programm ist original und nicht "verpfuscht"
2) Schaltplan und die Include Dateien habe ich mal angehängt
3) Ich habe mir das so vorgestellt, dass bei geöffnetem Schalter die
LEDs nacheinander an-/bzw. ausgehen. So wie es zur Zeit läuft. Lege ich
den Schalter um, bleiben alle LEDs an. Und das unabhängig ob jemand
durch die Lichtschranken läuft (INT0/INT1) oder nicht.
Auskommentieren ist also nicht!
4.) Versucht habe ich folgendes:
In Zeile 63: if(int0 || int1) amount = ~((PIND & 0x03) | ((PIND >>2) &
0x1C)) & 0x1f; // read PD0,1,4,5,6 as a dec. number
steht meiner Meinung nach die Abfrage der Jumper. Das habe ich über die
For Schleife kopiert und nur nach z.B. PIND7 abgefragt. Dann wollte ich
mit PORTA = 0xFF; alle Ausgänge setzen.
Aber so ganz hat das nicht funktioniert.
Nun die Frage: Was muß ich wo einfügen um meine Idee umsetzen zu können.
Danke und Gruß
Scubydoo
> 2) Schaltplan und die Include Dateien habe ich mal angehängt
Welche Lichtschranken hängen wie an IN 1 und IN 2?
Wie hast du den/die Schalter derzeit angeschlossen?
> Auskommentieren ist also nicht!
Dann mach diesen time auto-off Teil und und die Reaktion aut int0/int1
von einem Pinzustand abhängig. Hast du noch einen freien Pin am AVR,
z.B. einen auf JP1, den du mit dem Schalter füttern kannst?
Die Lichtschranken hängen per Masse an IN1. Sind NPN-Lichtschranken
Schalter habe ich im Moment keinen dran. Der Versuch ist ja gescheitert!
Jumper ist noch frei. Die Anzahl der LEDs braucht nicht variabel zu
sein. Daher kann ich PD7 für einen Taster nehmen
Wo muß das im Code implementiert werden?
> Daher kann ich PD7 für einen Taster nehmen
Wie jetzt, Taster oder Jumper/Schalter?
Hier die Fassung mit Jumper/Schalter, d.h. der Schaltzustand braucht die
Software nicht zu archivieren, sondern kann stets das Bauteil abfragen.
Hallo Krapao,
vielen vielen Dank für Deine Hilfe.
Es wird ein Schalter. Sorry für die Verwirrung!
Diesen Absatz verstehe ich leider nicht
else if(state==OFF)// && !dauerlicht()
{
... wie vorher aber Fehler &, | zu &&, || korrigieren!
}
else if(state==ON) // && !dauerlicht()
{
... wie vorher aber Fehler &, | zu &&, || korrigieren!
}
Kannst Du mir das vielleicht etwas näher erklären?
DANKE!
Im Originalcode sind ja noch weitere if bzw elseif Abfragen:
if(int0 & (direction==LTR)) int0=0; // LEDs LTR on, left switch
ignored
else if(int1 & (direction==RTL)) int1=0; // LEDS RTL on, right
switch ignored
else if(int0 & (direction==RTL)) // LEDs RTL on, fade off on
left switch
{
TCCR0 = 0; // disable timer0
tenms = 0; running = 0; // reset turnoff-timer
fade_off(direction);
state = OFF;
int0 = 0;
}
else if(int1 & (direction==LTR)) // LEDs LTR on, fade off on
right switch
{
TCCR0 = 0; // disable timer0
tenms = 0; running = 0; // reset turnoff-timer
fade_off(direction);
state = OFF;
int1 = 0;
}
Diese benötige ich aber weiterhin, oder?
Aber eine Schalterabfrage muß da nicht mehr hin.
Danke und Gruß
Scubydoo