Hallo!
Ich wollte ganz gerne das Anzeigemodul von Ulrich Radigs Labornetzteil
für meines Verwenden. Das funktioniert auch im Test richtig gut!
Nur habe ich jetzt das Problem, dass ich auch ganz gerne die
Wicklungsumschaltung von dem µC steuern lassen wollte. Hier für ist auch
schon PD7 vorgesehen, aber noch nicht Programmiert.
Nun dachte mich mir, dass kann ja nicht so schwere sein!
Da ich gerade anfange mich mit µC Programmierung in C zu beschäftigen,
musste ich mich erstmal einlesen, das hat auch so ganz gut geklappt.
Aber wenn ich nun die if/else Abfrage mit einbau, fängt die Anzeige an
zu flackern, nur warum weiß ich leider nicht :(
Ich hoffe ihr könnt mir helfen, im Anhang ist meine Code und die
Original teil:
Meiner mit PD7
Ich glaube nicht, dass es an deiner zusätzlichen IF-Abfrage liegt. Das
muss andere Gründe haben. Benutzt Du ein Relais um die Wicklung
umzuschalten? Freilaufdiode?! ....
Außerdem musst Du noch eine Hysterese einbauen. Ungefähr so:
if (display1 > 200)
PORTD |= (1 << PD7);
else if (display 1 < 180)
PORTD &= ~(1 << PD7);
Stimmt, die Hysterese fehlt, danke die habe ich noch ganz vergessen :)
Aber das ändert nicht am Phänomen.
Es noch auf einem Steckbrett aufgebaut. An dem Anschluss für das Relais
(mit Treibertransistor später) ist aktuell nur eine LED mit
Vorwiderstand, also Simulation.
Mit dem Original Code ist alles super (aus dem AVR Studio 5 heraus
Programmiert, mit selbst erzeugter hex), aber sobald ich die Änderung
mit eine Programmiere fängt alles an zu flackern, also ob dir
Multiplexabfolge nicht mehr richtig ausgeführt werden würde.
=> Also kann es auch nicht am Steckbrettaufbau liegen, den mit dem
Originalcode flackert es nicht, nur mit dem angepassten :(
Hallo,
soweit ich das sehe, hängt an PortD auch die Anzeige. Der Multiplex
läuft in einem TimerInt. Wenn du in Main PortD auch veränderst, dann
muss das atomar sein, sonst gibts diesen lustigen Effekt.
Wenn du die richtige Optimierung hat, sollte zwar aus der
1-Bit-Portoperation in asm ein sbi/cbi werden - das währe dann atomar.
an sonsten so...
1
cli();
2
PORTD|=(1<<PD7);
3
sei();
aber mach das so, das der Portzustand nur dann neu ausgegeben wird, wenn
er sich ändern soll.
Sascha
>aber mach das so, das der Portzustand nur dann neu ausgegeben wird, wenn>er sich ändern soll.
ÖÖÖÖ, jetzt noch mal in LOGO! oder S7 FUP bitte!
Wie soll ich das jetzt machen???
Sollte evtl. ne Logo oder S7 in meien NT einbauen, dass kann ich besser
Programmieren :D :D
Jetzt mal Spaß bei Seite :)
Ich bekomme es nicht hin, habe des jetzt mal in die multiplx.c gepackt.
Das funktioniert jetzt auch so weite, das Flackern ist weg, nur jetzt
schaltet der Pin natürlich im Takt ein und aus => was somit eine
Mischspannung ist und eine DC Relais mag das net so.
Gut mit einer Diode und einem Kondensator funktioniert das auch so, aber
das ich wohl nicht Sinn und Zweck des ganzen.
Hoffe es kann mir eine Helfen!
Sascha Weber schrieb:> oder so ...
(2. Variante)
Das hilft letzten Endes auch nichts. Denn in der Multiplex Routine wird
der PortD als Ganzes neu gesetzt. D.h. in dem Fall würde dann eben das
Relais flackern.
Das könnte man zwar auch abstellen, aber deine erste Variante ist
wharscheinlich die Einfachere.
Karl Heinz Buchegger schrieb:> Sascha Weber schrieb:>>> oder so ...>> (2. Variante)>> Das hilft letzten Endes auch nichts. Denn in der Multiplex Routine wird> der PortD als Ganzes neu gesetzt. D.h. in dem Fall würde dann eben das> Relais flackern.>> Das könnte man zwar auch abstellen, aber deine erste Variante ist> wharscheinlich die Einfachere.
hmm... stimmt - hab ich übersehen, müsste man noch maskieren, damit
wirklich nur die Segmentbits geändert werden.
Ist sowiso mist, da die ISR mit PORTD=0 anfängt.
also so für Var. 1
Hallo!
Erstmal dank für die Antworten!!
@Sascha
Bei deiner Variante 2 bekomme ich in der Main diesen Fehler für deine
beiden if Abfragen:
"lvalue required as left operand of assignment"
Bei Variante 1 sind es 6 Errors in der multiplex
Kann das sein, dass es am Compiler liegen, ich verwende das AVR Studio
5.
@ Karl Heinz Buchegger
>Das könnte man zwar auch abstellen, aber deine erste Variante ist>wahrscheinlich die Einfachere.
Vermute mal du meinst meine Gleichrichtung, das ist wahrscheinlich
wirklich nicht die schönste, aber wirkungsvollste Methode.
Andreas A. schrieb:> Kann das sein, dass es am Compiler liegen, ich verwende das AVR Studio> 5.
nein wohl eher weil du in C programmierst und ich eigentlich in ASM
das erste Problem sollte sich wohl so lösen lassen
statt:
1
if(display1<180&&supply=1)
eher so:
1
if((display1<180)&&(supply=1))
zu Var. 1
wenn es 6 Fehler sind dann ja warscheinlich in switch(), da wird wohl
der Typ von SEGMENTE nicht zum Typ von portdata [uint8] passen - einfach
mal entsprechend anpassen!
Sascha