Counter - Vordefinierter Wert wird nicht angenommen

Fragen oder Tipps & Tricks über Software

Moderatoren: Tim Sasdrich, Sebi

Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon Teddy » 07.02.2012, 13:30

Ich habe eine programmiertechnische Frage!

Ich habe mir aus diversen Büchern und Vorlagen einen Counter zusammen programmiert und steuere damit eine 6 stellige Reihe an 7 Segmentanzeigen an. (Derzeit 5 Stellen programmiert) Diese werden mit einem Multiplexer angesteuert. Soweit so gut.
Das Programm funktioniert und die Anzeigen zeigen die Werte ohne flackern. Smile
YEAH!
Das Programm ist übrigens die erste Entwicklungsstufe und soll später weiter ausgebaut werden, aber mal Schritt für Schritt...

Mein Problem ist folgendes:

Wenn ich dem Counter einen vordefinierten Wert zuweisen will, zu wird dieser nicht richtig übernommen. (zb: Sollwert= 1234, Ist Wert= 1230 oder SOllwert=12345, Ist Wert= 12297 ???)

Ich habe als Definition des Wertes DIM "LONG" eingesetzt, da dieser meinen Zahlenumfang als bestes abdeckt.

Aber warum zum Geier übernimmt er beim Starten des Programms den falschen Wert?

Hier noch der Code der Vollständigkeitshalber: (BASCOM)
Code: Alles auswählen
' BASCOM-Programm
' Teddy 2012
' Counter mit Zählerstand an bis zu 6Stk. 7 Segmentanzeigen
' In: Entprellter Taster an T0 = C.4
'
' Out: PortB: Siebensegmentanzeigen Anoden
' Ansteuerung via BCD Codierung
'
$regfile = "m8def.dat" 'Chip: ATmega8
$crystal = 1000000 'Frequenz: 1 MHz

$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 32 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space


Config Portd.7 = Input
Portd.7 = 1 'Pullup-Widerstand

Config Portb = Output 'Siebensegmentanzeige
Siebensegment_anoden Alias Portb ' Anoden

Config Portc = Output 'Siebensegmentanzeige 2
Siebensegment_kathoden Alias Portc ' Kathoden

' Timer fuer Multiplex
Config Timer0 = Timer , Prescale = 256
On Timer0 Anzeige
Const Timervorgabe_0 = 237 ' 200 Hz / bei 4 Anzeigen = 50 Hz pro Anzeige

Enable Timer0
Enable Interrupts

Dim Ziffer As Byte

Dim Zahl As Long
Dim Zahl_temp As Long
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Zehntausender As Byte
Dim Stelle As Byte

Zahl = 12345


Do
Debounce Pind.7 , 0 , Count , Sub

Loop
End

Count:

Incr Zahl
Return

Anzeige:
Timer0 = Timervorgabe_0
'Zahl zerlegen in Zehner, Einer usw. Beispiel
Zahl_temp = Zahl '1234
Einer = Zahl_temp Mod 10 '4

Zahl_temp = Zahl_temp - Einer
Zahl_temp = Zahl_temp / 10
Zehner = Zahl_temp Mod 10 'Mod definiert den Restwert der Division

Zahl_temp = Zahl_temp - Zehner
Zahl_temp = Zahl_temp / 10
Hunderter = Zahl_temp Mod 10

Zahl_temp = Zahl_temp - Hunderter
Zahl_temp = Zahl_temp / 10
Tausender = Zahl_temp Mod 10

Zahl_temp = Zahl_temp - Tausender
Zahl_temp = Zahl_temp / 10
Zehntausender = Zahl_temp Mod 10


If Stelle < 5 Then
Incr Stelle
Else
Stelle = 1
End If
If Stelle = 1 Then Ziffer = Einer
If Stelle = 2 Then Ziffer = Zehner
If Stelle = 3 Then Ziffer = Hunderter
If Stelle = 4 Then Ziffer = Tausender
If Stelle = 5 Then Ziffer = Zehntausender

Siebensegment_kathoden = &B11111111 'Kathoden aus

Select Case Ziffer
' gfedcba dp
Case 0 : Siebensegment_anoden = &B00000000
Case 1 : Siebensegment_anoden = &B00000001
Case 2 : Siebensegment_anoden = &B00000010
Case 3 : Siebensegment_anoden = &B00000011
Case 4 : Siebensegment_anoden = &B00000100
Case 5 : Siebensegment_anoden = &B00000101
Case 6 : Siebensegment_anoden = &B00000110
Case 7 : Siebensegment_anoden = &B00000111
Case 8 : Siebensegment_anoden = &B00001000
Case 9 : Siebensegment_anoden = &B00001001
End Select


Select Case Stelle
'
Case 1 : Siebensegment_kathoden = &B00000100
Case 2 : Siebensegment_kathoden = &B00000011
Case 3 : Siebensegment_kathoden = &B00000010
Case 4 : Siebensegment_kathoden = &B00000001
Case 5 : Siebensegment_kathoden = &B00000000
End Select

Return
Teddy
 

Re: Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon Teddy » 07.02.2012, 17:14

So, ich habe in der Zwischenzeit den Tipp bekommen, dass das die Variablen "Einer - Zehntausender" auch als LONG definiert werden müssen.
Nun wird die Zahl korrekt angezeigt.
Jedoch ergibt sich ein neues Problem.

Nun (ohne weitere Abänderung) verlangsamt sich das Programm so sehr, das bei Tastendruck nix mehr passiert.
Wenn man die Taste >20 Sek. drückt, springt der Zähler dann doch weiter.
Warum aber die Abarbeitung scheinbar nun so langsam passiert, verteh ich nicht.

Kann mir jemand helfen das zu durchschauen, bzw. eine Lösung zu finden?

Teddy
Teddy
 

Re: Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon Anse » 07.02.2012, 17:47

1Mhz ist etwas wenig.
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Re: Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon eggbert » 07.02.2012, 18:25

code im spoiler würde die übersicht im thread wahren :lol:
eggbert
 

Re: Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon topas » 07.02.2012, 18:26

Warum machst Du die Ausgabe von Ziffer und Stelle so kompliziert mit select case? Du gibst doch trotzdem nur den jeweiligen Wert ohne Umsetzung aus.
Code: Alles auswählen
Siebensegment_anoden = Ziffer
Siebensegment_kathoden = Stelle

dürfte schon schneller laufen.

Edit: 200Hz für das Multiplexen muss nicht sein - 50Hz reichen vollkommen.
topas
 
Beiträge: 3796
Registriert: 16.08.2010, 12:47

Re: Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon sudden » 07.02.2012, 22:27

Das kann ich nicht bestätigen! bei mir waren 50Hz immer zu wenig :x
Ich würde auf mindestens 100Hz gehen dann flimmerts auch bei schnellen Kopfbewegungen und in den Augenwinkeln nicht :)
sudden
 

Re: Counter - Vordefinierter Wert wird nicht angenommen

Beitragvon Teddy » 08.02.2012, 14:26

So ich habe mit fremder Hilfe die Lösung erarbeitet.

1. Fehler war die fehlende Definition aller Var as Long.
2. Fehler war die Berechnung der Zahl innerhalb der Anzeigeroutine. Diese hat den Interuptprzess aufgehalten.
Habe diesen Teil nun in den Count-Bereich verlagert und nun funktioniert es bereits 6Stellig einwandfrei.

Getestet und erarbeitet mit MyAVR MK2 und 7 Segment add on.

Bei Bedarf stelle ich auch gerne den aktuellen Code ein.

Teddy

PS: Mit dieser Programmvariante ist kein Flackern der Anzeigen erkennbar. Läuft 1A! :lol:
Teddy
 


Zurück zu Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron