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

Hallo nochmal,

Du hast Recht, da ist noch ein kleiner Fehler drinn.

Der Befehl "Incr I" gehört natürlich vor "If I > 10 Then".

Und warum die Anzeige dann nicht mit "000" beginnt, liegt daran das Du der Variable "Speed" keinen Startwert zugewiesen hast.
Nach der Initialisierung steht da 0 drinnen. Die Folge davon ist, das die Do - Loop Schleife X mal durchlaufen wird ohne je in die For/Next-Schleife rein zulaufen. Erst wenn der Interrupt ausgelöst wird und der Analogwert zum ersten mal in die Variable Speed übernommen wird läuft es Richtig. Bis dahin wurden aber die Variablen I, N, H schon X-Fach hochgezählt.

Als alternative kannst Du auch die Schleife erst durchlaufen wenn in der Variable "Speed" ein Wert > 0 steht.

Z.B.:

Do
If Speed > 0 Then

.
.
.

Endif
Loop

Alles klar. ;)

LG
 
Lies mal die Kapitel zur Clock und dem (zu verwendendem) Timer (Timer1 ist der mächtigste) ein paar mal durch - und wenn dann Fragen sind, frage. (Ist mir jetzt etwas viel, das alles(!) zu erklären (@Dino: hast Du da vielleicht schon was in Deiner FAQ?)).
Zu Z80&co: das hier sind RISC-Controller - mit nur gut hundert Assembler-Instruktionen. Dafür dann aber "schneller" (RISC halt). Und mit einer Trennung zwischen Programmspeicher (Flash) und Arbeitsspeicher (SRAM), von dem allerdings 32(!) Register mit der ALU verknüpft sind, und dann nochmal ne größere Menge (unterschiedlich bei den versch. Prozessoren) mit der integrierten Hardware (die I/O-Registern - die Steuern die integrierte HW bzw werten sie aus) (siehe Kapitel "AVR ... Memories").
Meiner Meinung nach ist vielen, die über "Hochsprachen" wie C oder Bascom etc zu den Rechenzwergen kommen, das Potential der enthaltenen Hardware gar nicht bewußt. Bei "alten hasen" von anderen Prozessorarchitekturen kann ich das schlecht einschätzen - aber da wird möglicherweise auch einiges unterschätzt bzw übersehen.
Vor diesem Hintergrund mußt Du dann auch die Hinweise an Deinem Lösungsweg;) sehen - deinen Code wollte ich nicht kritisieren. Ich(!) bin halt lediglich ein "Fan" der internen Hardware. So sah zB mein Hauptprogramm einer, per UART (serielle Schnittstelle) steuerbaren PWM-gedimmten LED-Ring-Lichtquelle aus:
Code:
loop:
    sleep
    rjmp loop
alles andere spielte sich dann in der UART recieve complete interrupt service routine ab.
War hier übrigens auch ähnlich, UND: beide Programme verwenden außer einigen der 32 Rechenregister (und der nötigen I/O-Register, klar) nur 2 byte SRAM. Und zwar den Stack zum Rücksprung ins Hauptprogramm aus den ISR (RETI).
 
Hallo Leute,

Danke nochmal für die Tips.
@TrueNEO Ich glaub das wird es sein mit dem festlegen des wertes von Speed, werd ich gleich mal Probieren. Dennoch werd ich das löschen und mich erstmal hinsetzen und die Timer studieren.
@LotadaC Völlig in Ordnung dein vorgehen, ich hab mich hier auch nicht angemeldet um mir die Cods vorkauen zu lassen, den ich will auch verstehen was ich da mache, und von daher sind Lösungswege und auch Kritik sogar wünschenswert.
ich weiss jetzt wo ich ansetzen muss und werde mich bestimmt wieder melden wenn ich erstmal das durch hab was ihr mir geraten habt.
Ich bin auch schon am überlegen Zweigleisig zu fahren, zum einem Assambler für allgemeine sachen und Bascom für zum beispiel Display ansteuerung oder Tastermatrix lesen (also alles was in Bascom vereinfacht wird) aber noch hab ich zu wenig ahnung um sagen zu können das das so sinvoll ist.

Dank euch allen
Gruss
Matthias
 
Hallo,

hab mich nochmal eingehend mit dem Code den ich geschrieben hatte beschäftigt. Unter berücksichtigung der möglichen Fehler die ihr mir genannt habt hab ich es endlich geschafft das der Zähler läuft wie er soll, gut das hat er vorher auch aber jetzt kann ich nachvollziehen wann er welche zustände hat und warum. Wie zu sehen ist werden die werte "i" und "n" jetzt mit einer 1 geladen so wie es sein soll und er fängt bei null an. Der fehler war wie @TrueNEO bemerkt hat einzig und allein der nicht festgelegte Wert von"Speed". Danke nochmal.....

So hier noch einmal das Ergebnis meines Zählers(nach wie vor ohne Timer für die Multiplex, kanns ja noch nicht:D)
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

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

H Alias Portc.5                                             'portc.5 = h


Dim H As Bit                                                'hundert
Dim I As Byte                                               ' einer
Dim N As Byte                                               ' zehner
Dim Z As Integer                                            ' zähler
Dim Speed As Integer                                        ' der wert des ADC geht bis 1023
Dim X(10) As Byte                                           ' X-Array mit 10 Byte


Restore Value_table

For I = 1 To 10                                             ' liest die daten der Tabelle ins x-Array
   Read X(i)
Next


I = 1
N = 1
H = 1
Speed = 100


Do

  For Z = 1 To Speed                                        ' Speed wird vom ADC geholt
     Portd = X(i)                                           ' gibt den wert aus der tabelle auf portd segmente i ist der zeiger
     Portb = &HFE                                           'portb.0 = 0 ansteuerung pnptransistor für stelle einer
   Waitms 1                                                 ' zeige einer 1ms
     Portd = X(n)                                           'gibt den wert aus der tabelle auf portd segmente  n ist der zeiger
     Portb = &HFD                                           'portb.1 = 0 ansteuerung pnptransistor für stelle zehner
   Waitms 1                                                 ' zeige zehner 1ms
  Next


    If I = 10 Then
      Incr N                                                ' wenn einer = 10 dann einer = 1 und zehner + 1
      I = 1
    Else                                                    'sonst i++
      Incr I
    End If

    If N = 11 Then
      Toggle H                                              ' wenn zehner = 11 dann zehner = 1 und hunderter zustandsänderung portc.5
      N = 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

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)