PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm hängt



MrPower
13.06.2015, 21:49
Hallo zusammen,
ich habe ein Problem mit meinem Programm, wenn ich es durch den Simulator laufen lasse springt es von der Stelle Pind.2 = 1 wieder in die erste Zeile. Es sollte doch eigentlich in der Do - Loop Schleife hängen bleiben.:confused: Wer hat eine Erklärung warum das so ist.
Viele Grüsse Kalle

$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 132
$swstack = 132
$framesize = 164
$baud = 19200

Config Pinb.0 = Input 'Starttaster
Config Pinb.1 = Input 'MV manuell ein / ausschalten
Config Pinb.2 = Input 'im Menü scrollen
Config Pinb.3 = Input 'Wert im Menü erhöhen
Config Pind.2 = Input 'Wert im Menü verringern
'config pind.3 = input(Res)
'config pind.4 = input(Res)
'config pind.5 = input(Res)
Config Portc.2 = Output 'Magnetventil 1
Config Portc.1 = Output 'Magnetventil 2
Config Portc.0 = Output 'Kamera
Config Portd.7 = Output 'Blitz

Kamera Alias Portc.0
Mv1 Alias Portc.2
Mv2 Alias Portc.1
Blitz Alias Portd.7
Taster_start Alias Pinb.0 ' starttaster
Taster_mm Alias Pinb.1 ' Taster_mv_manuell
Taster_ms Alias Pinb.2 ' Taster_menü_scroll
Taster_we Alias Pinb.3 ' Taster_wert_erhöhen
Taster_wv Alias Pind.2 ' Taster_wert_verringern

Pinb.0 = 1 'Pull Up einschalten da taster gegen gnd
Pinb.1 = 1 'Pull Up einschalten da taster gegen gnd
Pinb.2 = 1 'Pull Up einschalten da taster gegen gnd
Pinb.3 = 1 'Pull Up einschalten da taster gegen gnd
Pind.2 = 1 'Pull Up einschalten da taster gegen gnd

Dim Wert1 As Word
Dim Wert2 As Word
Dim Wert3 As Word
Dim Wert4 As Word
Dim Wert5 As Word
Dim Wert6 As Word
Dim A As Byte
Dim B As Byte
Dim C As Byte

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2

Do
If Taster_ms = 0 Then
Incr A
End If
Cls
Lcd A

Loop


End

peterfido
14.06.2015, 07:34
Hallo Kalle,

welche Bascom Version nutzt Du? Bei mir gibt es dieses Problem nicht. Allerdings würde ich nicht ständig ein CLS vor LCD A setzen.

z.B. so:

Cls
Do
If Taster_ms = 0 Then
Incr A
End If
Locate 1 , 1
Lcd A ; " "

Loop
End
Einzelschritte werden da aber schwierig ;)

Auffällig:
Die Baudfehlerrate ist recht hoch.
Der Stack ist großzügig gewählt. Kommt wohl noch bissel was 'vermaschtes' dazu? Eingang ist Standard bei PINs, kann man aber ruhig trotzdem konfigurieren, wenn der Platz reicht.
Mehrere Pullups kann man zusammenfassen. Für Pullups das Port nutzen setzen.

Statt


Pinb.0 = 1 'Pull Up einschalten da taster gegen gnd
Pinb.1 = 1 'Pull Up einschalten da taster gegen gnd
Pinb.2 = 1 'Pull Up einschalten da taster gegen gnd
Pinb.3 = 1 'Pull Up einschalten da taster gegen gnd

also besser so:

Portb = &B00001111 'Pullups

fredred
14.06.2015, 13:37
Hallo Kalle,

habe deine Anfrage nicht so richtig verstanden. Erste Zeile im Programm oder LCD. LCD währ normal, hast kein Locate festgelegt.
Nach Cls wird der komplette Puffer der LCD gelöscht.(sieht meistens auch hässlich aus wenn die Anzeige flackert)
Siehe Hinweis von Peterfido.
Zum Simulator. In der alten BASCOM- Testversion wird Zeile für Zeile abgefragt. Auch „End“.
Mit Terminal müsstest Du am besten mit (Print A) sehen ob sich A bei jedem Tastendruck um eins erhöht.

Gruß

MrPower
14.06.2015, 19:00
Hallo zusammen,
@peterfido ich benutze die Version 2.0.7.5 . Das mit dem Port ist eine gute Idee. Die Baud brauche ich eigentlich gar nicht da es keine Verbindung nach außen gibt. Ich hab mir nur mal so ein Grundgerüst erstellt damit ich es nicht dauernd tippen muss. Es soll dann auch ein Menue entstehen in dem ich dann verschiedene Werte einstellen kann. Das Cls brauche ich für das Menue wenn der nachfolgende Eintrag kürzer ist als der vorige damit keine Textfetzen zurückbleiben, oder?
@fredred Er springt zur ersten Zeile im Programm zurück also zu $regfile.
Gruß Kalle

peterfido
14.06.2015, 19:10
Bei meinem Beispiel oben werden die nächsten evtl. vorhandenen Zeichen hinter A geleert. Gibt natürlich noch bessere Methoden dafür.

Bei meinen Projekten schreibe ich nur aufs LCD wenn sich was geändert hat. Spart Programmlaufzeit, braucht aber mehr RAM. Das sind dann aber meist Grafik-LCDs.

MrPower
14.06.2015, 20:29
Hallo zusammen,
habe das Programm geändert und neu kompeliert, jetzt läuft es wie es soll. @peterfido du meintest sicher Pinb = &B00001111 nicht Portb = &B00001111.
Gruß Kalle

Sauerbruch
15.06.2015, 11:55
@peterfido du meintest sicherPinb = &B00001111 nicht Portb = &B00001111.

Nein, das stimmt schon so mit PORT! In die PIN-Register werden mit jeder Taktflanke die logischen Zustände übernommen, die in diesem Moment an den korrespondierenden Anschlüssen des Controllers anliegen. Es macht also wenig Sinn sie aktiv zu beschreiben, oder anders gesagt, sie sind reine "Auslese"-Register.

Die PullUp-Widerstände werden daher über das PORT-Register ein- und ausgeschaltet, wenn der I/O-Anschluss ein Eingang ist. In Deinem Code sind die PullUps im Moment also definitiv abgeschaltet.

Gruß,

Daniel

fredred
15.06.2015, 15:03
Hallo Kalle,

Variable A ist ein Byte. Mit Incr A wird diese mit Taster hochgezählt. Ist A>255 könnte es sein ein Fehler wird generiert und Do Loop wird unkontrolliert verlassen. Ein END nach Loop ist nicht zwingend aber wie Du erfahren hast hilfreich. Programmablauf wird ortendlich beendet. Sollten nach Loop weitere Programmteile stehen, und kein END eingefügt, geht es weiter und die Fehlersuche wird Aufwendig.

Kleiner Hinweis zum LCD- Menü:
Ich mache es mit einer Statusabfrage der verschiedenen Auslöser für Anzeige.

Dim Lcd_aktualisieren As Byte 'Zähler für LCD-Anzeigen
'Warte bis LCD bereit, falls gleichzeitig Spannung eingeschaltet wird
Waitms 250
Lcd_aktualisieren = 255 'ist Startanzeige

Nun lege ich mal mein bescheidenes Programm “Bus-Modul“ im Anhang. Dort findest Du bestimmt eine Anregung wie eine LCD-Anzeige „Schick“ aussieht.

Gruß

MrPower
15.06.2015, 15:40
Hallo fredred,
bis ich das gelesen geschweige kapiert hab vergeht ein halbes Jahr. Bin absoluter Programmieranfänger .Hab mir gedacht A wird hochgezählt (Anzahl der Menueeintrage max. 7). Mit select case springe ich in die Menue´s und verstelle dort die Werte.

Gruß Kalle

fredred
15.06.2015, 17:59
Hallo Kalle,
bitte um Entschuldigung, sollte doch nur eine Anregung sein. Dein Hinweis(„es sollten keine Textfetzen zurückbleiben“),sollte nur in meinem Code zeigen, wie es auch funktioniert könnte um dies zu vermeiden. Persönlich finde ich es immer besser ein Teil eines bewerden Programms zu übernehmen, um das „Fahrrad nicht neu zu erfinden“.
Musst kein halbes Jahr lesen, um Anhang zu begreifen. Einfach die Kommentar und Anhänge ignorieren.
So einfach ist es.

Mit freundlichen Grüßen

peterfido
15.06.2015, 18:05
Variablen laufen beim inkrementieren / dekrementieren nicht über. Eine Byte-Variable mit dem Wert 255 zu inkrementieren sorgt dafür, dass diese den Wert 0 bekommt. Ein Wert 0 wird beim Dekrementieren 255.

unregistriert
15.06.2015, 18:48
Hallo fredred,
bis ich das gelesen geschweige kapiert hab vergeht ein halbes Jahr. Bin absoluter Programmieranfänger .Hab mir gedacht A wird hochgezählt (Anzahl der Menueeintrage max. 7). Mit select case springe ich in die Menue´s und verstelle dort die Werte.

Gruß Kalle

Tatsache ist, von Select Case sieht man nichts in Deinem Code.

Der Code wird meines Wissens übrigens nur mit §sim im Programmkopf richtig im Simulator laufen.
Ein Delay von 100ms nach dem LCD INIT schadet auch nicht, da es etwas Zeit benötigt zum initialisieren.

Viele Grüße

MrPower
15.06.2015, 19:52
Hallo,
@ Gast, das mit den 100ms werd ich mal ausprobieren. Das mit select case ist eine Überlegung und noch lang nicht umgesetzt.

Gruß Kalle