Hallo!
Kann sich bitte einer von euch meinen Quelltext anschauen und mir sagen,
was ich falsch gemacht habe?
Ursprünglich hat dieser Code mal einen ATmega8 dazu gebracht, YEAH auf
einer 7-Segment-Anzeige auszugeben.
Dann habe ich die Anzeige in eine Unterfunktion anzeigen() ausgelagert -
und schon leuchtet nur noch die erste Ziffer der Anzeige (Punkt und alle
Segmente außer dem Obersten).
Die Verschaltung der Anzeige seht ihr im angehängten Schaltplan (die
Ziffern hängen in Wirklichkeit allerdings zusammen).
1
#include<avr/io.h>
2
#ifndef F_CPU
3
#define F_CPU 1000000UL //Taktfrequenz einstellen, damit _delay_ms() funktioniert
4
#endif
5
#include<util/delay.h>
6
#include<stdint.h>
7
8
////
9
////Beginn des neuen Teils
10
////
11
12
uint8_tbwert;//wird in anzeigen() verwendet
13
uint8_tcwert;//wird in anzeigen() verwendet
14
15
voidanzeigen(uint8_tstelle,charzeichen)
16
{
17
switch(stelle)//der Stelle, die angesteuert werden soll, + geben, die anderen ausschalten
18
{
19
case1:PORTD=((PORTD&&0b11001100)||0b00000001);
20
break;
21
case2:PORTD=((PORTD&&0b11001100)||0b00000010);
22
break;
23
case3:PORTD=((PORTD&&0b11001100)||0b00010000);
24
break;
25
case4:PORTD=((PORTD&&0b11001100)||0b00100000);
26
break;
27
}
28
switch(zeichen)//den benötigten Segmentteilen - geben, die anderen ausschalten
@Lothar:
Das war tatsächlich der Fehler. Ich habe die || durch | und && durch &
ersetzt - und die Anzeige funktioniert wieder.
Vielen Dank für deine Hilfe.
@Ben:
Ich weiß nicht, ob das eine low-current-Anzeige ist, allerdings wird der
ATmega8 kein bisschen warm (und das müsste er bei Überlastung doch
werden, oder?).
Außerdem: Dadurch, dass ich die Anzeige multiplexe, sind die
Zeichen-Pins (PD0,1,4,5) sowieso nur ein Viertel der Zeit belastet, also
müsste ich ja theoretisch bis zu 80mA Last dran hängen können.
Zu den Vorwiderständen: Ich hatte gerade keine vier 150 Ohm-Widerstände
da, also habe ich einfach je eine LED zwischen die Anode jedes Zeichens
und den entsprechenden Pin am ATmega gehängt.
@ Nils S. (n-regen)
>Ich weiß nicht, ob das eine low-current-Anzeige ist, allerdings wird der>ATmega8 kein bisschen warm (und das müsste er bei Überlastung doch>werden, oder?).
Ohje. Du hast mehr Glück als Verstand. Die Ausgänge vom AVR haben so um
die 30 Ohm Ausgangswderstnd und begrenzen dadurch den Strom.
>Außerdem: Dadurch, dass ich die Anzeige multiplexe, sind die>Zeichen-Pins (PD0,1,4,5) sowieso nur ein Viertel der Zeit belastet, also>müsste ich ja theoretisch bis zu 80mA Last dran hängen können.
Nö.
>Zu den Vorwiderständen: Ich hatte gerade keine vier 150 Ohm-Widerstände>da, also habe ich einfach je eine LED zwischen die Anode jedes Zeichens>und den entsprechenden Pin am ATmega gehängt.
[ ] Du kennst den Unterschied zwischen einer Diode und einem Widerstand.
Naja
na klasse...
also da besteht wohl noch etwas verbesserungsbedarf. hattest du
wenigstens einen netztrafo zur hand? oder läuft der atmega direkt an
230V~?
schon komisch auf was für ideen manche leute kommen.
die strombegrenzung gehört übrigens nicht in die gemeinsame
stromversorgung der segmente (in deinem fall die anode). bei dir braucht
jede kathode ihren widerstand. da du die anzeige gemultiplext betreibst
reichen 7 stück am "kathode-port" des atmega. wirst staunen, da
verschwindet auch dein problem, daß die anzeigen bei verschienen zeichen
verschieden hell leuchten.
und was die spitzenströme angeht hast du prinzipiell recht, da die
effektive einschaltzeit nur 25% sind. 80mA find ich aber dennoch ganz
schön viel für einen einzigen pin. beim nächsten mal einfach vier
PNP-transistoren (mit basiswiderständen bitte!!) opfern bzw. zur hand
haben und du kannst sicher sein, daß es dauerhaft funktioniert. mußt nur
aufpassen, daß die PNP-transistoren das signal invertieren, sprich bei
logisch 0 am ausgang hast du 5v auf der segmentanzeige.
Ben schrieb:
> und was die spitzenströme angeht hast du prinzipiell recht, da die> effektive einschaltzeit nur 25% sind.
Allerdings muss der Strom ja auch durch die Spannungsanschlusspins des
µC erst mal in den µC hineinkommen. Es gibt also nicht nur die eine
Grenze, weiviel Strom durch einen einzelnen Pin rauskommen darf, sondern
auch noch die Grenze, dass der Gesamtstrom eine Grenze nicht
überschreiten darf.
Die "Absolute Maximum Ratings" sind laut ATmega8-Datenblatt 05/09, Seite
242 40mA pro I/O-Pin und 300mA bei den VCC- und GND-Pins.
Und dann schreiben sie, dass ein Port kurzzeitig auch mehr als 20mA
aushält, dass aber dabei alle Ports zusammen nicht mit mehr als 300mA,
die Pins C0-C5 nicht mit mehr als 100mA und die Ports B0-B7, C6, D0-D7
und XTAL2 nicht mit mehr als 200mA belastet werden dürfen.
Da meine Anzeige funktioniert, werde ich die Schaltung nicht mehr
umbauen (das würde außerdem entgültig zu Chaos auf meiner Platine
führen), aber bei der nächsten Anzeige kann ich ja vor dem Löten mal
etwas messen und rechnen.
Nils S. schrieb:
> Zu den Vorwiderständen: Ich hatte gerade keine vier 150 Ohm-Widerstände> da, also habe ich einfach je eine LED zwischen die Anode jedes Zeichens> und den entsprechenden Pin am ATmega gehängt.rofl