Bascom Siebensegment Zähler 0- 199 fängt nach Reset irgendwo an zu Zählen

Matthiasab64

Mitglied
21. Feb. 2012
82
0
6
Brandenburg an der Havel, de
Sprachen
  1. BascomAVR
Hallo AVR - Praxis Gemeinde,

Ich bin Matthias, ich beschäftige mich jetzt seit gut einer Woche mit AVR´s und hab schon meine ersten Problemchen. Zuerst einmal die Frage, welche Programmiersprache emfehlt ihr mir, ich weiss die Meinungen gehen da auseinander aber es muss ja ein für und wieder geben(grob). Ich selbst habe in meiner Lehrzeit mal mit Assambler zu tun gehabt und damals waren das 8080 und 8086 Prozessoren, ist glaub ich nicht vergleichbar und auch nicht mehr aktuell und viel zu lang her.

Gut nun zu meinem (Problem), ich habe mir aus einer Siebensegmentanzeige (max 188) tot-4301ng-1 und einem Atmega8 einen einfachen Zähler so zum testen aufgebaut. Erst eine Stelle dann Multiplex und darauf wollt ich dann weiter aufbauen.
Mein Problem ist das mein Zähler der einfach nur von 00 - 199 zählen soll, bei einem Reset (oder einschalten der avcc) mit 80 anfängt. Ich habe den code dahin ändern können das er bei 00 anfängt aber ich möchte zum besseren verständnis wissen was ich falsch gemacht habe das er bei 80 anfängt wenn ich die variablen i und n auf 0 stelle, bei I = 0 und N = 2 zählt er von 00

Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32


Ocr1a = 12500
Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect
On Oc1a T1
Enable Oc1a
Enable Interrupts

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Config Portb = Output
Config Portd = Output
Config Portc.5 = Output
Portd = &HFF
Portb = &HFF
Portc.5 = 0
Dim Speed As Integer
Dim I As Byte
Dim N As Byte
Dim H As Byte
Dim Z As Integer
Dim X(10) As Byte

Restore Value_table



For I = 1 To 10
   Read X(i)
Next


Z = 0
I = 0
N = 2
H = 1
Do

  For Z = 1 To Speed
   Portd = X(i)
   Portb = &HFE
  Waitms 1
   Portd = X(n)
   Portb = &HFD
  Waitms 1
  Next
  If I = 10 Then
  Incr N
  I = 0
  End If
  If N = 11 Then
  Incr H
  N = 1
  End If
  If H = 2 Then
  H = 0
  End If
  Incr I
  If H = 0 Then
  Portc.5 = 0
  Else
  Portc.5 = 1
  End If


Loop

 T1:
 Speed = Getadc(0)
 Return


End                                                         'end program

Value_table:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10

verzeiht mir wenn das noch n bissel durcheinander aussieht - ich lerne noch.
Sollte es zu diesem Thema schon einen Beitrag geben, dann bitte einen Link dorthin, hatte aber nix gefunden.

Ich danke euch schon einmal im vorraus.

Gruss Matthias
 
Hallo Matthias!

Auch wenn ich zu deinem Phänomen gerade keine Erkkärung habe....
weil ich zugegebener Maßen gerade wenig Zeit habe, um mich in fremde Code`s hinein zu denken.... :cool:
möchte ich dich im AVR-Praxis Forum aber erst einmal Willkommen heißen! :ciao:

Danke auch, für die Infos zu deiner Person und deinen Vorkenntnissen.


Grüße,
Cassio
 
Hallo Cassio,

Danke erstmal für die Willkommensgrüsse.

Is ja nich schlimm, wie gesagt er läuft ja hab heut auch schon weitergemacht und von eine in die nächste Zahl gedimmt - so halbwegs aber es wird langsam.
Aber zu dem oben stehenden Code hab ich echt kein schimmer, wenn ich n mit 0 definiere sollte "incr" auch bei null anfangen,
aber ich komm schon noch dahinter, is ja nur nen Schönheitsfehler.
Hab mir jetzt auch einige LCD´s bei Pollin bestellt und wenn die kommen damit gehts dann gleich weiter. :D

Gruss
Matthias
 
Hallo Matthias!

Ich habe versucht deinen Programmcode auf die Schnelle zu verstehen.....
aber irgendwie bin ich nicht ganz dahinter gekommen. :hmmmm:

Momentan habe ich so einige Fragezeichen über dem Kopf schwirren und von daher möchte ich dich bitten,
dass du deinen Code mal mit Kommentaren versiehst.
Der Kommentar sollte mindestens hinter jeder Anweisung kurz erklären, was da passieren soll.

Ich habe zwar so ein paar Vermutungen, was dein "Restore Value_table" und dein "Dim X(10) As Byte" betrifft, aber beschreib doch noch mal dein Vorgehen im Programm selbst.
Irgendwie hänge ich auch nebenbei noch gerade an der Stelle:
Code:
  For Z = 1 To Speed
   Portd = X(i)
   Portb = &HFE
  Waitms 1
   Portd = X(n)
   Portb = &HFD
  Waitms 1
  Next


Was soll das mit dem "Waitms 1" und dem "Portd = X(n)" in der FOR-NEXT Schleife ? :hmmmm:

Wie schon erwähnt....
kommentiere deinen Code doch mal bitte so dass jeder weiß, was du da eigentlich machen wolltest. :wink:


Grüße,
Cassio
 
Hallo Mathias
Erst mal einen Gruß von mir zum Anfang.
Nun, Bascom ist nicht grad meine Stärke aber.... was soll diese For I schleife. Sie Liest Daten, sie schreibt keine. Wenn du damit das Array löschen wolltest, sollte es glaub ich Write heißen
Weiter:
Du scheinst ein wenig mit den Schleifen durcheinander zu kommen. Die Z Schleife zeigt dies deutlich:

For Z = 1 To Speed
Portd = X(i)
Portb = &HFE
Waitms 1
Portd = X(n)
Portb = &HFD
Waitms 1
Next
Zuerst: welchen Wert hat Speed ? Ich hab da keine Zuweisung gsehen.
danach: welchen Wert hat i bei der folgenden Zeile.. ich vermute mal, das sollte Z sein.
Weiter: Woher nimmst du den Wert n, kann ich leider so nicht achvollziehen.

So, nun hab ich bezüglich Programm noch ein paar Fragen und Hinweise. Ich will hier nicht den Oberschlauen raushängen lassen, aber Wait-Anweisungen in einem µC-Programm.... ist nicht sehr clever und das gewöhnst du dir am besten gleich wieder ab. Der Hintergrund: eine Wait-Anweisung ist im Prinzip eine kleine Programmschleife, die nix tut, außer Zeit verplempern. Hast du irgendwelche Eingänge, die du polst, dann mußt du diese Eingänge solange anstehen lassen, bis alle Wait's in deinem Programm gedenken, dir mal wieder etwas weiter im Code zu helfen. Du setzt die Wait-Anweisung auch noch in Schleifen..... da kannst schon mal krumme Finger bekommen, bis dein Taster erkannt wird.
Lerne mit dem Timer umzugehen. Wenn du eine Pause haben willst, dann setz ein Bit. In der Timer-ISR erkennst du das gesetzte Bit und zählst einen Wert zu Null oder auch hoch, grad wie's beliebt. Kommt der Zähler dann zu Null oder aud den Vergleichswert, löscht du das Bit wieder und setzt ein Flag ( Bit) für "Zeit abgelaufen".
Mit diesem Flag startest du deine Aktion und löscht dieses Flag ( Bit ) wieder. Nnun wird dein Programm ständig rotieren und, wenn nix zu tun ist zumindest die anderen Aufgaben abfragen. Es "wartet" nun nix mehr.
Ja, ich weiß schon, warum ich Bascom meide, und Assembler vorzieh. Befehle wie Wait gibt's da nicht und selbstgeschriebene Warteschleifen machen diese Zeitvernichtungsmaschine offensichtlich....
Gruß oldmax
 
Die for i-Schleife belegt das Array X(1..10) mit den Werten aus der value_table.
Speed wird oben dimensioniert, und dann bei jedem Output-Compare-match von OC1A mit der digitalisierten Analogspannung an ADC0 beschrieben.
Für mehr hab ich erstmal keine Zeit.
 
Die for i-Schleife belegt das Array X(1..10) mit den Werten aus der value_table.


Hallo Lota!

Was er damit bezwecken möchte ist mir schon klar....
Allerdings wird SPEED über die Timer_ISR mit GETADC gefüllt.

Was soll denn passieren, wenn SPEED einen Wert von 84 oder gar 925 hat? :hmmmm:

Hinzu kommt der sehr schnelle Timer (8MHz und Prescale 64).
Ich kann mir vorstellen, dass der ADC gar nicht so schnell ist (Müsste ich aber erst noch mal nachlesen).


Bevor wir aber über diverse Punkte rätseln und Kaffeesatz lesen, soll er den Code mal vernünftig kommentieren.
Dann weiß man wenigstens was er sich dabei gedacht hat......
und wir können schauen, ob seine Gedanken mit dem Code zusammen passen. :wink:


Grüße,
Cassio
 
Hi
Ich glaub, die Erklärung von LotadaC galt mir... Asche auf mein Haupt. Klar, jetzt wo er es sagt erinner ich mich wieder....
Ok, aber trotzdem ist Speed erst mal gar nicht definiert und steht beim Start in's Programm erst mal irgendwo im Wald. Mittlerweile hab ich auch die Zuweisungen für i und die anderen Indexis gefunden..... Man sollte bei Sprachen die man nicht spricht doch besser die Klappe halten :agree:
Gruß oldmax
 
Hallo,

und danke für eure Mühe, hätte mir fast klar sein müssen das sich ein anderer nicht in meine gedanken versetzen kann. Also das ganze wirrwar kommt daher das ich Programmschnipzel fand dich ich nach belieben einfach mal verändert hatte um zu sehen was da was bewirkt. Aber ich mache mich jetzt dabei und lösche die für den oben beschriebenen Zweck der Zähler , nicht benötigten sachen Raus und werde das ganze kommentieren.

Der Timer sorgt dafür das der ADC ständig ausgelesen wird. Vorher wurde er immer am Ende ausgelesen und es hat lang gedauert bis sich die änderung bemerkbar gemacht hat.
Ich bezwecke damit das die recht schnelle for next schleife 2ms + ein paar zyklen öfter oder weniger öfter durchlaufen wird und kann somit über ein Potentiometer am ADC den Zähler "Speed" einstellen. Wie gesagt es sind nur test aufbauten von daher ist nicht wichtig das der Zähler eine Sekunde oder eine sekunde und n bischen braucht, ich will mich ja erstmal damit vertraut machen was überhaupt geht. Diese ADC Zählerdingsta hatte ich noch von nem Lauflicht womit ich vorher rumgespielt hab. :D

Das mit den Waitms hab ich gemacht das mir meine Einer bzw Zehner stelle eine gewisse zeit angezeigt werden wenn ichs weglasse ist der einer fast dunkel und der zehner hell weil nach dem anzeigen des zehners noch ein bissel was abgearbeitet wird und nach dem einer fast nix ausser die anzeige für den zehner, das ist natürlich nur mein erster versuch mal ne ssanzeige im "Multiplex anzsprechen" geht bestimmt auch besser

Aber wie oben beschrieben Funktioniert der Zähler Perfekt, nur das ich mir nicht erklären kann wieso ich n zu anfang mit 2 definieren muss das er bei null anfängt, ligt wahrscheinlich daran das ich die tabelle einfach nochmal mit n auslese und nicht mit i. Aber eigentlich sollte es egal sein mit welcher variable man aus dem x-Array liest wenn es erst einmal geladen ist.

Gruss
Matthias
 
So da bin ich wieder, ich hoffe es ist jetzt ein wenig übersichtlicher, aber es soll mir ja auch dienen, wenn jetzt einer sagt das und das kannste kürzer formulieren.
Ich gehe nicht davon aus das ich als neuling gleich den Perfekten Code in seiner optimalsten Form treffe...

Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32


Ocr1a = 12500
Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect
On Oc1a T1
Enable Oc1a
Enable Interrupts                                           'Timer zum abfragen des Analogeingangs   (wie das mit dem Prescale ist weis ich nicht hab das so übernommen(das er den Tackt teilt weiss ich schon))

Config Adc = Single , Prescaler = Auto , Reference = Avcc   ' setzen des ADC
Start Adc
Config Portb = Output                                       ' portb als ausgang   stellen
Config Portd = Output                                       ' portd als ausgang   segmente
Config Portc.5 = Output                                     ' portc.5 als ausgang (da die linke stelle der anzeige nur eine 1 kann und die beiden segmente extra anschlüsse haben hab ich sie auf diesen port gelegt)
Portd = &HFF                                                'portd = 255 (segment hat gemeinsame anode)
Portb = &HFF                                                'portb = 255
Portc.5 = 0                                                 'portc.5 = 0
Dim Speed As Integer                                        ' der wert des ADC geht bis 1023
Dim I As Byte                                               ' einer
Dim N As Byte                                               ' zehner
Dim H As Byte                                               'hundert
Dim Z As Integer                                            ' zähler
Dim X(10) As Byte                                           '  legt X als Array mit Zehn Byte´s an - würde ich sagen
Restore Value_table



For I = 1 To 10                                             ' liest die daten der Tabelle in´s X Array
   Read X(i)
Next


Z = 0                                                               ' werte in variablen laden ( da wäre dan auch das mit n=2 wie oben beschrieben)
I = 0
N = 2
H = 1
Do

  For Z = 1 To Speed                                         ' Speed wird vom ADC geholt (Poti zum einstellen der zählgeschwindigkeit) bestimmt wie oft die schleife durchlaufen wird bevor es neue werte aus der tabelle bekommt
   Portd = X(i)                                               ' gibt den wert aus dem x-Array auf portd segmente i ist der zeiger (einer)
   Portb = &HFE                                              'portb.0 = 0 ansteuerung pnptransistor für stelle einer
   Waitms 1                                                 ' zeige einer 1ms
   Portd = X(n)                                             'gibt den wert aus dem x-Array auf portd segmente  n ist der zeiger (zehner)
   Portb = &HFD                                             'portb.1 = 0 ansteuerung pnptransistor für stelle zehner
  Waitms 1                                                 ' zeige zehner 1ms
  Next
  If I = 10 Then                                          ' wenn einer = 10 dann einer = 0 und zehner + 1
  Incr N                                                   
  I = 0
  End If
  If N = 11 Then
  Incr H                                                    ' wenn zehner = 11 dann zehner = 1 und hunderter + 1  (warum das nun mit n11 und n1
   N = 1                                                               funktioniert und nicht mit n=10 und n=0 weiss ich nicht)
   End If
  If H = 2 Then
  H = 0                                                     ' hunderter umschalten - da oder nicht da
  End If
  Incr I
  If H = 0 Then
  Portc.5 = 0
  Else                                                      ' ausgabe des hunderters auf portc.5
  Portc.5 = 1
  End If


Loop

 T1:                                                        ' timer zum auslesen des adc
 Speed = Getadc(0)
 Return


End                                                         'end program

Value_table:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10

DSC01924k.jpgDSC01928k.jpg
Danke für eure Zeit

Gruss
Matthias
 
Ja, war direkt auf oldmax bezogen (aber nicht als Angriff gemeint - und hoffentlich auch nicht so interpretiert)
Mit dim blablub wird die Variable ja mit einer SRAM-Adresse alloziiert. Ob Bascom da jetzt auch gleich für irgendwelche default-Werte sorgt, weiß ich nicht. Direkt nach einem reset sollte überall 0 drinstehen, wenn aber zwischendurch diese Zellen benutzt wurden (und anschliessend von Bascom wieder freigegeben (?) - Gibts in Bascom überhaupt solche ... äh ... scopes?)

Zu "perfectem code"...: Ich finde eher das ganze Konzept (Algorithmus) etwas ... ähm... "von hinten durch die Brust ins Auge". Wenn die Dezimalstellen gleich hell leuchten sollen (und die enthaltenen LEDs identisch angesteuert werden), mußt Du doch einfach dafür sorgen, daß sie gleich lang leuchten. Das schreit doch förmlich nach Verwendung eines weiteren Timers (Du hast drei davon). Mit OutputCompare (quasi PWM) kannst Du sogar dimmen - im OC-IRQ (wenn die LEDs aus sind) rollst Du dann durch die Zehnerpotenzen. Nur so als Ansatz (OC-ISR schaltet alle "Multiplexleitungen" (dezimalstelle) ab, und die Ziffernleitungen (a,b,g,...)für die nächste Dezimalstelle an. TOV-ISR schaltet die "Multiplexleitung" für die nächste Stelle an.
(Auch Dir sei das Datenblatt des Controllers empfohlen - kann man 'ne Menge draus lernen)
P.S.: wenn Du schon Erfahrungen mit Assemblersprachen hast, warum fängst Du hier nicht auch damit an? Sosehr kann das doch gar nicht rosten...
 
Ja super das war ja mal Input, mein Code = Müll und gleich ansätze für nen vernünftigen Code, danke. :adore:
Nun muss ich wirklich erstmal schauen und mich belesen was die Befehle oc-isr,oc-irq usw alle machen,
du hast es ja schon beschrieben aber mal sehen ob ich die zusammenhänge verstehe und alles in einen vernünftigen Code zusammensetzen kann.:hmmmm:

Tja mit dem Assambler, ich hab mal wie gesagt in der Lehrzeit als Radio-Fernsehtechniker mal reingeschnuppert, habtsächlich ging es in der Lehre aber ums Reparieren solcher Geräte also elektronik und so. Die Programme die wir geschrieben hatten waren eher klein, ich erinnere mich an ne Ampelsteuerung und an nen Lauflicht usw, so einzelne befehle vieleicht auch noch. Hauptsächlich war es aber eher trockener Stoff aufbau und innere Strukturen von Microprozessoren. Sicher ist es wahrscheinlich Efektiver als Bascom aber bis man sich da durch gebissen hat, ich tu mich ja nach fast zwei wochen noch immer schwer mit den Timern in ner Hochsprache.

Gruss
Matthias
 
Hallo,

Direkt nach einem reset sollte überall 0 drinstehen, wenn aber zwischendurch diese Zellen benutzt wurden (und anschliessend von Bascom wieder freigegeben (?) -
also ich würde bei SRAM-Zellen nie davon ausgehen das sie nach einem Reset oder PowerUp alle Null beinhalten. Das mag sein das es manche Controller dann so herrichten. Genauso wie manche Controller RAMTOP automatisch als Stackpointer setzen. Sicher kann man sich aber nur sein wenn man es selber initialisiert.

Wenn man nach PowerUp aus dem SRAM einige Speicherstellen ausliest wird man bestimmt ne schöne Quelle für Zufallszahlen haben ;)

Gruß
Dino
 
Hallo Dino,

das habe ich mir auch gedacht, darum hab ich ja in meinem fall "n" noch ne "0" aufgezwungen und trotzdem fängt er damit nicht bei null an, hatte auch schon andere Buchstaben aber es bleibt gleich. SRam? Entschuldiege die wahrscheinlich dumme Frage, ist das der Speicher wo alles abgelegt wird oder ist das ein bestimmter bereich den ich versehentlich erwischt hab der normal für sowas nicht genutzt wird?

Gruss
Matthias
 
Hi Matthias,

SRam? Entschuldiege die wahrscheinlich dumme Frage, ist das der Speicher wo alles abgelegt wird oder ist das ein bestimmter bereich den ich versehentlich erwischt hab der normal für sowas nicht genutzt wird?
warum dumme Frage ?

Also Flash ist der Speicher wo dein compiliertes Programm reinprogrammiert wird (geflasht wird)
EEPROM ist der Speicher wo man Daten über den Stromausfall retten oder Kallibrierdaten lagern kann.
SRAM (statisches RAM) ist der Speicher wo deine Register, Daten, Stack, Variablen, ... liegen. Der ist nach Stromausfall leer.

Neben SRAM gibt es bei PCs noch DRAM (Dynamisches RAM)

Statisches RAM besteht aus Speicherstellen die aus logischen Gattern aufgebaut sind und benötigt kein Refresh.
Dynamisches RAM besteht aus Kondensatoren als Speicherstellen und benötigt einen Refresh weil sich die Kondensatoren langsam entladen.

Für sowas kann ich dir Wikipedia wärmstens ans Herz legen. Da sind Basistechnologien richtig gut erklärt.

Gruß
Dino
 
Danke,

so langsam kommt ordnung in meinem Kopf, bin auch grad dabei "mal eben kurz" :D die 302 seiten des Atmega8 aufzunehmen(geistig).
Aber so ist das, man will immer gleich ein Erfolgserlebnis, und am Ende macht man doch das was man besser schon am Anfang hätte machen sollen um zum Ergebnis zu kommen - lesen lesen lesen :D

Gruss
Matthias
 
bin auch grad dabei "mal eben kurz" :D die 302 seiten des Atmega8 aufzunehmen(geistig).
Aber so ist das, man will immer gleich ein Erfolgserlebnis, und am Ende macht man doch das was man besser schon am Anfang hätte machen sollen um zum Ergebnis zu kommen - lesen lesen lesen :D
Wenn du die Funktionsteile (Timer, Takterzeugung, ADC, IO, UART, I2C,...) grob im Kopf hast dann reicht das. Man muß es nicht auswendig können. Wenn man weiß was man damit anstellen kann reicht das schon. Ich hab auch meißt das Datenblatt vom Controller nebenher offen um Einzelheiten nachzulesen. Verwende es als Nachschlagewerk und nicht als Roman.

Je mehr du einfach mal machst desto mehr wird von den Datenblättern durch das "Machen" im Kopf landen.

Gruß
Dino
 
Naja alles werd ich auch nicht lesen(jedenfalls nicht jetzt).
Wichtig ist mir erstmal Takterzeugung und Timer, ich überlege gerade was ich mir auf mein Board stecke um mal alle funktionen die ein Timer bietet,
Testen zu können und dann werd ich mit einfachen sachen beginnen und dann auch mal solche Befehle wie sie Lota genannt hat verwenden.
Denn bei so vielen Bedingungen die man an einem Timer einstellen muss(kann) fällt es mir im moment schwer zu erkennen wozu die werte da sind und was sie machen,
zumal ich nicht wirklich englisch kann, leider. Das heisst ich muss oft erst schauen was das Wort heisst was mir da eine Funktion erklären will.

Gruss
Matthias
 
Hallo,

ich hab in Deinem Programm ein paar Kommentare dazugefügt. Sieh Dir das mal an und lese noch in der BASCOM-Hilfe den Abschnitt zum Array nach. Beim füllen des Arrays hast Du (wahrscheinlich instinktiv) noch Richtig indexiert, danach aber nicht mehr.

Code:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32


Ocr1a = 12500
Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect
On Oc1a T1
Enable Oc1a
Enable Interrupts               'Timer zum abfragen des Analogeingangs
                                '(wie das mit dem Prescale ist weis ich nicht hab das so übernommen
                                '(das er den Tackt teilt weiss ich schon))

Config Adc = Single , Prescaler = Auto , Reference = Avcc   ' setzen des ADC
Start Adc
Config Portb = Output           'portb als ausgang   stellen
Config Portd = Output           'portd als ausgang   segmente
Config Portc.5 = Output         'portc.5 als ausgang (da die linke stelle der anzeige nur eine 1 kann und die beiden segmente extra anschlüsse haben hab ich sie auf diesen port gelegt)
Portd = &HFF                    'portd = 255 (segment hat gemeinsame anode)
Portb = &HFF                    'portb = 255
Portc.5 = 0                     'portc.5 = 0
Dim Speed As Integer            'der wert des ADC geht bis 1023
Dim I As Byte                   'einer
Dim N As Byte                   'zehner
Dim H As Byte                   'hundert
Dim Z As Integer                'zähler
Dim X(10) As Byte               'legt X als Array mit Zehn Byte´s an - würde ich sagen
Restore Value_table

For I = 1 To 10                 'Bitmuster für die 7-Segmentanzeige in Array laden
   Read X(i)
Next

Z = 0                           'Werte in Variablen laden
I = 0             '<- hier gehört eine 1 hin
N = 2             '<- hier ebenfalls
H = 1

Do

  For Z = 1 To Speed            'Speed wird vom ADC geholt
    Portd = X(i)                'gibt das Bitmuster für die Einerstelle auf PortD aus
    Portb = &HFE                'portb.0 = 0 Ansteuerung PNP.Transistor für Einerstelle
    Waitms 1                    'zeige einer 1ms
    Portd = X(n)                'gibt das Bitmuster für die Zehnerstelle auf PortD aus
    Portb = &HFD                'portb.1 = 0 Ansteuerung PNP-Transistor für Zehnerstelle
    Waitms 1                    'zeige zehner 1ms
  Next

  If I = 10 Then  '<- hier auf > 10 prüfen
    Incr N                                                  
    I = 0         '<- hier gehört auch eine 1 hin
  End If

  If N = 11 Then  '<- hier auch auf > 10 prüfen
    Incr H                      'wenn zehner = 11 dann zehner = 1 und hunderter + 1
    N = 1                                                               
  End If

  If H = 2 Then   '<- hier auch auf > 1 prüfen
    H = 0                       'hunderter umschalten - da oder nicht da
  End If

  Incr I

  If H = 0 Then
    Portc.5 = 0
  Else                          'ausgabe des hunderters auf portc.5
    Portc.5 = 1
  End If

Loop

T1:                             'timer zum auslesen des adc
Speed = Getadc(0)
Return


End                             'end program

Value_table:
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10 'Bitmuster
'       ^      ^      ^      ^      ^      ^      ^      ^      ^      ^ 
'7-Seg. 0      1      2      3      4      5      6      7      8      9  Anzeige
'Index  1      2      3      4      5      6      7      8      9     10  Index des Arrays

LG
 
Hallo Trueneo,

Danke für deine hilfe, aber wenn ich das programm so gestalte wie du es kommentiert hast fängt der zähler bei 128 an zu zählen.
Und wenn ich bei abfrage n 10 statt 11 eintrage springt er von 89 auf 100
Ich würde sagen ich lösch den ramsch und fang nochmal an, wenn ich mehr über Timer und co weiß.

Hab schon alles ausprobiert, egal wie ichs ändere wenn die werte nicht so stehen wie im Programm dann fängt er nicht bei 0 an.

gruss
Matthias
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)