Autor |
Simpler einstelliger 7segmentanzeigen Counter |
|
|
|
|
BID = 847243
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
|
...vielleicht sollte ich auch noch mal meinen Quellcode posten...
Verbesserungsvorschläge sind stets willkommen.
Code : |
#include <avr/io.h>
#define F_CPU 4e6
#include <util/delay.h>
#define Modul1 PORTD, PORTD2
#define Modul2 PORTD, PORTD1
#define setbit(IO) __setbit(IO)
#define __setbit(PORT, BIT) PORT |= (1<<BIT)
#define clearbit(IO) __clearbit(IO)
#define __clearbit(PORT, BIT) PORT &=~ (1<<BIT)
#define debounce( port, pin ) \
({ \
static uint8_t flag = 0; /* new variable on every macro usage */ \
uint8_t i = 0; \
\
if( flag ){ /* check for key release: */ \
for(;;){ /* loop ... */ \
if( !(port & 1<<pin) ){ /* ... until key pressed or ... */ \
i = 0; /* 0 = bounce */ \
break; \
} \
_delay_us( 20 ); /* * 256 = 25ms */ \
if( --i == 0 ){ /* ... until key >25ms released */ \
flag = 0; /* clear press flag */ \
i = 0; /* 0 = key release debounced */ \
break; \
} \
} \
}else{ /* else check for key press: */ \
for(;;){ /* loop ... */ \
if( (port & 1<<pin) ){ /* ... until key released or ... */ \
i = 0; /* 0 = bounce */ \
break; \
} \
_delay_us( 20 ); /* * 256 = 25ms */ \
if( --i == 0 ){ /* ... until key >25ms pressed */ \
flag = 1; /* set press flag */ \
i = 1; /* 1 = key press debounced */ \
break; \
} \
} \
} \
i; /* return value of Macro */ \
})
volatile uint8_t zaehler[2];
//Initialisierung
void init( void )
{
DDRB = 0xFF; //Port B Ausgang
PORTB = 0b00000001; //Alle Pins HIGH
DDRD = 0b0000110; //Port D Pin6,5,4,3,0 Eingänge; Pin 2,1 Ausgänge
PORTD = 0b1111111; //Alle PullUp-Widerstände 6...3 ein; Ausgänge auf HIGH (PNP Transistoren aus)
}
//Ausgabemuster für 7Segment-Anzeige
void SiebenSegAnz(uint8_t a)
{
switch(a)
{
case 9: PORTB = 0b00110000; break;
case 8: PORTB = 0b00000000; break;
case 7: PORTB = 0b11110000; break;
case 6: PORTB = 0b00000110; break;
case 5: PORTB = 0b00100100; break;
case 4: PORTB = 0b00110010; break;
case 3: PORTB = 0b01100000; break;
case 2: PORTB = 0b01001000; break;
case 1: PORTB = 0b11110010; break;
case 0: PORTB = 0b10000000; break;
default: PORTB = 0b01111110;
}
}
int main(void)
{
init();
zaehler[0]=9;
zaehler[1]=9;
for(;;)
{
if( debounce( PIND, PD3 ) ) zaehler[0]++;
if( debounce( PIND, PD4 ) ) zaehler[0]--;
if( debounce( PIND, PD6 ) ) zaehler[1]++;
if( debounce( PIND, PD5 ) ) zaehler[1]--;
if((zaehler[0] < 1) || (zaehler[1] < 1)) //Rücksetzen erst möglich
{ //wenn ein Zähler auf Null
if( debounce( PIND, PD0 ) )
{
zaehler[0]=9;
zaehler[1]=9;
}
}
//Zähler 1
clearbit (Modul1); //Erstes Modul ein
SiebenSegAnz (zaehler[0]); //Wert von Zähler 1 ausgeben
_delay_ms(1); //Anzeige 1ms stehen lassen
setbit (Modul1); //Erstes Modus aus
//Zähler 2
clearbit (Modul2);
SiebenSegAnz (zaehler[1]);
_delay_ms(1);
setbit (Modul2);
}
}
|
|
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber. |
|
BID = 847265
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
|
Wie ihr sicherlich schon gemerkt habt, stimmen die Pin-Zuordnungen im Programm nicht mit denen im Schaltplan überein.
Das liegt daran, dass ich den Schaltplan nachträglich gezeichnet, es auf dem Steckbrett zum Testen aber anders aufgebaut, habe. Und zwar so wie im Programm.
...ein falscher Kommentar ist auch noch drin...
Bis jetzt werden die Segmente direkt von der CPU angesteuert, was natürlich nicht so schön ist. Man sieht auch, dass die CPU überfordert ist. Denn immer wenn die Zähler in~/dekrementiert werden, werden die Anzeigen kurz dunkel.
Besser ist es, soviel habe ich schon herausgefunden, dies in eine Interrupt-Routine auszulagern - in diese Problematik muss ich mich aber erst mal einarbeiten...
...oder DonComi schreib schnell hin, wie das für dieses Programm aussehen muss
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
[ Diese Nachricht wurde geändert von: Offroad GTI am 10 Sep 2012 18:46 ] |
|
BID = 847310
Lakko Gerade angekommen
Beiträge: 9
|
Hi.
Ich danke für den tip mit den 100mm anzeigen, die kosten bei Conrad 20€.
Ich danke auch für deine Mühen die du für mich aufwendest.
Ich denke ich werde erst am Wochenende erst wieder dazu kommen weiter zu suchen bzw zu bestellen.
Du müsstest mir noch sagen wie hoch der "Obolus" für deine Programmierung und der Chip ist! Da ich davon ja noch weniger Ahnung habe als vom löten.
Danke und MfG.
|
BID = 847345
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Zitat :
| erst wieder dazu kommen weiter zu suchen bzw zu bestellen.
Du müsstest mir noch sagen wie hoch der "Obolus" für deine Programmierung und der Chip ist! |
Siehe dazu meine PM.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 847371
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Bzgl. der Versorgungsspannung und der Vorwiderstände für die Anzeige:
Dies hängt genau von selbiger ab. Bei einer größe von 100mm benötigen sie meist zwischen 8V und 12V.
Um genaueres zu erfahren, müsste erst mal das Datenblatt konsultiert werden.
Wenn die Anzeige 8V benötigt, kann die Schaltung auch mit 12V Versorgt werden (bspw über einen 12V Akku). Benötigt sie jedoch schon 12V, reicht ein 12V Akku nicht mehr aus.
Die Vorwiderstände berechnen sich wie gehabt:
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 847461
Lakko Gerade angekommen
Beiträge: 9
|
Hallo.
Die 100mm 7segment LEDs haben eine Durchlass Spannung von 10v. Reicht es da die "Anlage" mit 12v zu betreiben? Wie Zb ein lipo Akku mit 3 Zellen(11,1v) oder ein 12v Blei Akku , es ist beides vorhanden. Oder muss ich mir doch Ehr ein 4 Zellen lipo (14,8v) zulegen?
Mfg
|
BID = 847462
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Durchlass Spannung von 10v. Reicht es da die "Anlage" mit 12v zu betreiben? Wie Zb ein lipo Akku mit 3 Zellen(11,1v) |
12V werden reichen, aber 3 Li-Zellen nicht, da die 3,7V keinen Bestand haben, sondern sie bis auf etwa 3V/Zelle entladen werden.
Wie ist denn die Einsatzdauer und Häufigkeit, und wo soll das Gerät benutzt werden (Helligkeit)?
Poste außerdem mal eine Link auf das Datenblatt des ausgesuchten Displays.
|
BID = 847467
Lakko Gerade angekommen
Beiträge: 9
|
Hi.
H denke es soll diese hier werden:
http://www.reichelt.de/index.html?;.....891d8
Ok dann werd ich den kleinen Blei Akku nutzen.
Die Anzeige wird alle 2-4 Wochen für je 6-8std benutzt. Es wird an einer überdachten Hauswand "hängen".
MfG und danke
|
BID = 847475
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Jup, bei dieser Anzeige genügt ein 12V Akku.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 847479
Lakko Gerade angekommen
Beiträge: 9
|
Ok, also Strom hab ich dann. Wie sieht es mit den Schaltern aus? Reichen da billige Taster (Schließer) ?
Und der summer? Kann ich den ohne weiteres, also Verstärker oder so in die Schaltung einbauen? Ich habe noch einen rumliegen den ich nutzen möchte. Es konnte der hier sein (zumindest optisch)
http://www.reichelt.de/Alarmmelder/.....891d8
Danke und mfg
|
BID = 847486
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Zitat :
| Kann ich den ohne weiteres, also Verstärker oder so in die Schaltung einbauen? |
Nein, darum habe ich schon einen Verstärker für dieses Teil vorgesehen (der achte Kanal des Transistorarrays ULN2803)
Zitat :
| Reichen da billige Taster (Schließer) ? |
Ja, hauptsache Schließer. Ich würde aber keine zu kleinen nehmen.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 847487
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Ok dann werd ich den kleinen Blei Akku nutzen. |
Oder einen abgenudelten Laptop Akku plus Spannungsregler, oder den vom Akkuschrauber.
Für 8 Stunden alle Segmente an, brauchst du ja nur 1,1Ah, und das sollten solche Akkus noch schaffen.
Der Vorteil der NiCd und NiMH-Akkus ist, dass sie eine konstante Spannung von 1,2V pro Zelle abgeben, während sich bei Bleiakkus die Spannnung zwischen 2,3V und 1,8V verändert und bei Li-Akkus etwa zwischen 4V und 3V.
Dadurch kann man bei den Ni-Akkus den Segmentstrom rein über die Wahl der Vorwiderstände einstellen, während man bei den anderen Typen stabilisierende Maßnahmen braucht.
P.S.:
Zitat :
| darum habe ich schon einen Verstärker für dieses Teil vorgesehen (der achte Kanal des Transistorarrays ULN2803 |
Vorsicht mit den ULNs!
Selbst bei diesen geringen Strömen verursachen die Darlingtons darin eine Spannungsabfall von 0,7V, und wenn die Betriebsspannung knapp ist, kann das problematisch werden.
[ Diese Nachricht wurde geändert von: perl am 12 Sep 2012 13:38 ]
|
BID = 847492
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Zitat :
| Vorsicht mit den ULNs!
Selbst bei diesen geringen Strömen verursachen die Darlingtons darin eine Spannungsabfall von 0,7V |
Ja, das haben sie leider. Aber bei knapp 8V für die LEDs der Anzeige, sagen wir mal 1V Spannungsabfall im ULN und nur noch 11V am Bleiakku, bleiben immer noch gut 2V übrig. Sollte also gerade reichen.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|
BID = 847519
Lakko Gerade angekommen
Beiträge: 9
|
ok, danke , dann werde ich wohl auf 10st akkus der grösse AA ausweichen.
|
BID = 847932
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
Hier der überarbeitete Schaltplan mit ein paar Hinweisen zum Aufbauen/Löten:
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.
|