ALso ich hab ein 2 x 24 Zeichen Display und spreche es mit BASCOM und einem Atmega 8 an. Es ist nun so, das ich Text drauf schreiben kann, aber die letzten ca 5 Buchstaben verblassen. Ich versuch mal Bild zu machen. Häng ich jetzt aber hinter TESTTEST z.B: nohmals TEST also TESTTESTTEST dran wird das was eben ausgeblichen war, voll angezeigt. Setze mich mal ans Foto ran. Hiererstmal der Text: (Auszug) $regfile = "m8def.dat" $crystal = 4000000 CConfig Lcdpin = Pin , Db4 = PortD.2 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4 Config Lcd = 24 * 2 Config Lcdbus = 4 Cursor = Off Config Adc = Single , Prescaler = Auto Dim Adc_vh As Byte Dim W_vh As Word Adc_vh = 0 ' pin a0 Start Adc Main: Cls Locate 2 , 1 W_vh = Getadc(adc_vh) Lcd "wert:" ; W_vh Locate 2 , 10 Lcd "TESTTEST" End If Goto Main
Bild vom LCD COde bissel verändert. Gleiches Problem: $regfile = "m8def.dat" $crystal = 4000000 Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1 Config Lcd = 24 * 2 Config Lcdbus = 4 Cursor = Off Config Adc = Single , Prescaler = Auto Dim Adc_vh As Byte Dim W_vh As Word Adc_vh = Portc.0 Start Adc Main: Cls Locate 2 , 1 W_vh = Getadc(adc_vh) Lcd "wert:" ; W_vh Locate 2 , 10 Lcd "TESTTEST" End If Goto Main PS: ADC ist nebensächlich. Teste nur bisschen rum
NUn gehts, zwar der ADC noch net, aber egal: $regfile = "m8def.dat" $crystal = 4000000 Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1 Config Lcd = 24 * 2 Config Lcdbus = 4 Cursor = Off Config Adc = Single , Prescaler = Auto Start Adc Dim W As Word , Channel As Byte Channel = 0 Do W = Getadc(channel) Cls Locate 2 , 1 Lcd " value " ; W If Channel > 7 Then Channel = 0 Loop End
NUn gehts $regfile = "m8def.dat" $crystal = 4000000 Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1 Config Lcd = 24 * 2 Config Lcdbus = 4 Cursor = Off Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim W As Word , Channel As Byte Channel = 0 Do W = Getadc(channel) Lcd " value " ; W If Channel > 7 Then Channel = 0 Loop End Wo es dran lag man weis es nicht
Ich meine, Du hast das Display einfach nur zu schnell gelöscht und wieder beschrieben. Die ersten Zeichen werden nach dem Löschen zuerst wieder dargestellt und sind dadurch länger sichtbar, die letzten Zeichen werden praktisch gleich nach dem Anzeigen wieder gelöscht. Mein Tip wäre, feste Texte ("value") nur einmal zu schreiben, und den eigentlichen Wert dann jeweils zu überschreiben, etwa in der Art:
1 | Lcd " value " |
2 | |
3 | Do |
4 | ... |
5 | Locate 2 , 8 |
6 | Lcd W |
7 | ... |
8 | Loop |
Damit man sich verändernde Ziffern noch erkennen kann, würde ich sowieso nicht mehr als 3-5 mal in der Sekunde neue Werte aufs Display schreiben.
tja das passiert eben wenn man einfach drauf los hackt. Ein gewisses "Timing" sollte ein Programm schon haben. zB. Messung jede Sekunde, dann Aktualisierung des LCD Die Werte bleiben ja so lange stehen bis neue kommen. Also keine Hast.
Momentan flimmern die VCC Werte aber LED AUS Flimmert nicht. Das liegt an Waitms 50 aber setzt ich das auf Wait 1 kann ich mein Programm knicken ;) Muss aber Lcd Fusing(c , "#.##") Waitms 50 da stehen lassen ansonsten kann ich gar nix mehr lesen ;) kann es au nit vor Loop setzen es muss genau da bleiben aber egal ob waitms 500 oder 2 es flimmert Vorbeugend gegen Verwirrung: Es wird Kanal ADC 0 und ADC 1 gemessen und im LCD angezeigt (VCC) und über UART ein Port gesteuert. Momentan versuch ich nen Taster einzubinden Druck drauf LED an Druck nomma drauf LED aus aber da hab ich atm seit 2 std nen Brett vorm kopf
Nette Mann schrieb: > Momentan flimmern die VCC Werte aber LED AUS Flimmert nicht. Das liegt > an Waitms 50 aber setzt ich das auf Wait 1 kann ich mein Programm > knicken ;) > > Muss aber > > Lcd Fusing(c , "#.##") > Waitms 50 > > da stehen lassen ansonsten kann ich gar nix mehr lesen ;) kann es au nit > vor Loop setzen es muss genau da bleiben aber egal ob waitms 500 oder 2 > es flimmert Wozu brauchst du einen Messwert der sich auf der Anzeige 20 mal in der Sekunde aktualisiert? Kein Mensch kann so schnell schauen bzw. reagieren. Und was dabei auf der Anzeige rauskommt, wenn man zu kurz hintereinander Werte draufschreibt (oder gar das LCD löscht) hast du ja jetzt gesehen. (Der ganze Ansatz mit der Schleife ist schon Müll. Aber wenns denn sein muss: Es reicht völlig, wenn du nur alle 10 oder 20 Schleifendurchgänge den LCD Wert aktualisierst)
Hab versucht mit Interrupt (Enable Interrupts Enable ADC usw.) Nur das klappte net ganz so wie ich wollte und die praktische BASCOM Hilfe und Freund Google half da nicht nd weil man hier so freundlich unterstützt wird in Sachen Interrupts hab ich erst gar net gefragt. Also: Locate 1 , 9 Lcd Fusing(g , "#.##") ; " VCC Hinten" Locate 2 , 9 Lcd Fusing(c , "#.##") ; " VCC Vorne" Waitms 50 verringert das flimmern nur leicht
Nette Mann schrieb: > Hab versucht mit Interrupt (Enable Interrupts Enable ADC usw.) Nicht ADC Interrupt. Ein Timer muss her. Der Timer löst alle, meinetwegen, halbe Sekunde einen Interrupt aus. Der Interrupt führt dazu, dass eine Messung gemacht wird und die Ergebnisse aufs LCD kommen. Und wenn der Interrupt schneller als alle halbe Sekunde kommt, zb alle 0.1 Sekunden, dann macht man zusätzlich einen Zähler ins Programm rein, der bis 5 zählt. Ist er bei 5, dann ist ebenfalls eine halbe Sekunde vergangen. > wird in Sachen Interrupts hab ich erst gar net gefragt. Ach komm. In BASCOM ist das doch nun wirklich ein Klacks. Ein typischer Programmaufbau auf einem µC sieht praktisch fast immer gleich aus: Da gibt es einen Timer, der für einen Basistakt sorgt. Damit hat man im Programm sowas wie eine 'Uhr' die regelmässig tickt. Alle anderen Aktionen werden an diesen Takt gekoppelt und man kriegt auf diese Art einen geordneten zeitlichen Ablauf hin.
der Kalr Heinz und ich habe doch gesagt wie es geht. Also nochmal. Wenn schon dann messe 20mal/Sek Das Display und Dein Auge begnügen sich mit 3-5 Werten /Sek Also hast Du genug Zeit aus den Werten einen Mittelwert zu bilden. Ein Timer muß her !! Lasse den Timer mit 20 Int/SEk laufen und Messe. Nach 5 Messungen Mittelwert bilden und dann 1 Mal ausgeben. Dann wieder 5 Messungen usw. Da hast Du dann 4 Werte /Sek Ist doch nicht sooo schwer. Shit... Karl Heinz war schneller.
Also nehm ich: Config Timer0 = Timer, Prescale= 8 Enable Timer0 On Timer0 Isr_von_Timer0 Enable Interrupts Hauptschleife Isr_von_Timer0: Hier den Dreck mit ADC Return Grobes modell
Nette Mann schrieb: > Hab versucht mit Interrupt (Enable Interrupts Enable ADC usw.) Nur das > klappte net ganz so wie ich wollte und die praktische BASCOM Hilfe und > Freund Google half da nicht nd weil man hier so freundlich unterstützt > wird in Sachen Interrupts hab ich erst gar net gefragt. > > Also: > > Locate 1 , 9 > Lcd Fusing(g , "#.##") ; " VCC Hinten" > Locate 2 , 9 > Lcd Fusing(c , "#.##") ; " VCC Vorne" > Waitms 50 > > verringert das flimmern nur leicht Nochmal: Wozu brauchst du eine Anzeige, die 20 mal in der Sekunde aktualisiert wird? 2 oder 3 mal tuts auch! Counter = Counter + 1 if Counter = 5 then Counter = 0 Locate 1 , 9 Lcd Fusing(g , "#.##") ; " VCC Hinten" Locate 2 , 9 Lcd Fusing(c , "#.##") ; " VCC Vorne" end if waitms 50 (Keine Gewähr für die BASCOM Syntax)
Nette Mann schrieb:
> Grobes modell
Viele Wege führen zum Ziel.
Du musst ein wenig experimentieren. Nur so lernt man die Details.
Aber im Allgemeinen erledigt eine Interrupt Routine nicht sehr viele
Dinge. AM Besten funktioniert:
In der Interrupt Routine wird eine Variable auf 1 gesetzt.
In der Hauptschleife wird abgefragt, ob die Variable 1 ist. Ist sie das,
wird sie wieder auf 0 gesetzt und der zugehörige Rotz (bei dir ADC
abfragen und aufs LCD ausgeben) ausgeführt.
Auf die Art hat man den Interrupt möglichst schnell wieder frei und in
der Hauptschleife wird im Timertakt spezieller Code regelmässig
ausgeführt.
Probieren tue ich seit 1 Uhr heut morgen ;) Counter = Counter + 1 ist bei mir eher contra produktiv mal schaun Hatte erst die Idee ADC in ne Var als str zu schreiben und die Var dann immer auszulesen aber Interrupt ist auch mal interessant Lc = Lc + 1 If Lc = 20 Then Lc = Lc - 20 das sind ungefähr 2 sekunden Also kastriere ich das ganze und hab ne halbe sek bzw werde ich wohl ne ganze nehmen ;)
ich frage mich ob Bascom es hin bekommt den Wert auszugeben bevor die nächste Eins kommt...bei 20 S/Sek
Nette Mann schrieb: > Probieren tue ich seit 1 Uhr heut morgen ;) Counter = Counter + 1 ist > bei mir eher contra produktiv Ob du den Zähler Counter nennst oder Lc ist ja wohl Jacke wie Hose (Ich kenn ja dein Programm nicht, weiß daher auch nicht, welche Variablen du schon benutzt) > > Lc = Lc + 1 > If Lc = 20 Then > Lc = Lc - 20 > > das sind ungefähr 2 sekunden Also kastriere ich das ganze und hab ne > halbe sek bzw werde ich wohl ne ganze nehmen ;) Na siehste. Mit ein wenig Phantasie geht fast alles. > If Lc = 20 Then > Lc = Lc - 20 Wenn Lc gleich 20 ist, und das muss es sein, sonst wäre der Then Zweig nicht genommen worden, was ist dann das Ergebnis von Lc - 20? Man sagt zwar, dass man nicht vorzeitig optimieren soll. Man soll aber auch nicht sonnlos Rechenoperationen ausführen, deren Ergebnis man kennt. Verbraucht nur Rechenzeit. Und in deinem Fall ist das auch noch besonders blöd, denn wenn du die 20 auf 10 änderst, musst du an 2 Stellen ändern. Und dabei vergisst man dann gerne eine Codestelle. Speziell dann, wenn die Änderung erst morgen oder übermorgen oder nächste Woche gemacht wird. -> Bau dir nicht selbst Stolpersteine ins Programm ein, wenn es nicht sein muss!
Reset LC mochte er nicht: Dim Lc As Byte Dim I As Byte Dim Hello As Bit Dim G As Single Dim X As Single Dim B As Single Dim C As Single Dim D As Single Dim An As Bit Dim Vcc As Bit Dim L As String * 10 Dim Z As Word , Channel2 As Byte Dim W As Word , Channel As Byte Bin bei 31 % Flash
Karl heinz Buchegger schrieb: > >> If Lc = 20 Then >> Lc = Lc - 20 > > Wenn Lc gleich 20 ist, und das muss es sein, sonst wäre der Then Zweig > nicht genommen worden, was ist dann das Ergebnis von Lc - 20? nullen muß er aber irgendiwe !
Stephan Henning schrieb: > Karl heinz Buchegger schrieb: >> >>> If Lc = 20 Then >>> Lc = Lc - 20 >> >> Wenn Lc gleich 20 ist, und das muss es sein, sonst wäre der Then Zweig >> nicht genommen worden, was ist dann das Ergebnis von Lc - 20? > > nullen muß er aber irgendiwe ! Und? Wo ist das Problem bei Lc = 0
nix Problem, nur weniger Rechenaufwand mit LC=0. Zumindest hat er den Sinn erfasst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.