Meine zweite Bascom Übung

Status
Für weitere Antworten geschlossen.

sulawesi

Neues Mitglied
07. Juni 2009
123
0
0
Raum Stuttgart
Sprachen
Alarm..es geht weiter :eek:

Nun nach dem einiges gelernt habe..( Angeber..ich weiss ) habe folgendes für mich als Übung ausgedacht. Ein Timer..Klar ähnlich wie die Uhr.

Folgende einfache Funktion habe ich ausgedacht.

Mit Taster1 und Taster2 stelle ich die Zeit ein. Das geht.
Wenn ich auf Taster0 Drücke beginnt die Zeit zu laufen, soweit OK

00:00:00 dann 00:00:01

Nun habe ich gedacht wenn ich anstatt incr decr verwende müsste das ganze einfach rückwärts laufen..dachte ich..falsch...

Beim starten passiert folgendes :
00:00:00 dann 00:00:255

woher kommt plötzlich die 255 wobei an der Formattierung nichts geändert wurde ????????????:confused: :confused:

Nun der Code ( Es sind noch einiges auskommentiert, primär geht es um die sekunden..wenn das geht kann ich weitermachen )

Code:
'$sim
   $regfile = "m8def.dat"
   $crystal = 16000000
   $hwstack = 100
   $swstack = 100
   $framesize = 100
   Dim Sekunde As Byte                                      'Uhrzeit - Sekunde
   Dim Minute As Byte                                       'Uhrzeit Minute
   Dim Stunde As Byte                                       'Uhrzeit Stunde
   Dim Timer_flag As Bit


   Dim Lcd_sekunde As String * 2                            'Ausgabe Sekunden
   Dim Lcd_minute As String * 2                             'Ausgabe Minuten
   Dim Lcd_stunde As String * 2                             'Ausgabe Sekunden


   Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , _
      Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
   Config Lcd = 16 * 2
   Cls
   Cursor Off

   '-----------------------------------------------


   'Taster0 Starten
   Config Pind.2 = Input
   Portd.2 = 0
   Taster0 Alias Pind.2

   'Taster1 Uhr stellen
   Config Pind.3 = Input
   Portd.3 = 0
   Taster1 Alias Pind.3

   'Taster2 Minuten stellen
   Config Pind.4 = Input
   Portd.4 = 0
   Taster2 Alias Pind.4

   'LED definieren
   Config Portd.5 = Output
   Led Alias Portd.5

   'Buzzer Port
   Config Portd.7 = Output
   Speaker Alias Portd.7

   '-----------------------------------------------

   Config Timer1 = Timer , Prescale = 256
   Enable Timer1
   On Timer1 Takt
   Enable Interrupts
   Timer1 = 3036

   'Sekunde = 0
   'Minute = 0
   'Stunde = 0
  '-----------------------------------------------


Do



Debounce Taster0 , 1 , Start_timer , Sub

Lcd_stunde = Str(stunde)
Lcd_stunde = Format(lcd_stunde , "00")
'----------------------------------
Lcd_minute = Str(minute)
Lcd_minute = Format(lcd_minute , "00")
'------------------------------------
Lcd_sekunde = Str(sekunde)
Lcd_sekunde = Format(lcd_sekunde , "00")

Locate 2 , 13
Lcd Lcd_sekunde
Locate 2 , 11
Lcd ":"
Locate 2 , 8
Lcd Lcd_minute
Locate 2 , 6
Lcd ":"
Locate 2 , 3
Lcd Lcd_stunde
Locate 1 , 1
Lcd "   Timer    "
Waitms 50

If Taster1 = 1 Then                                         'Uhr einstellen Minute
   Waitms 50
   Incr Minute
End If

If Taster2 = 1 Then                                         'Uhr einstellen Stunde
   Waitms 50
   Incr Stunde
End If

 If Sekunde > 59 Then Minute = Minute - 1
 'If Sekunde > 59 Then Sekunde = 59
 'If Minute > 59 Then Stunde = Stunde - 1
 'If Minute > 00 Then Minute = 50
 'If Stunde > 0 Then Stunde = 23

Loop

'Submenu Timer
Takt:
If Timer_flag = 1 Then
Incr Sekunde
Timer1 = 3036
End If
Return

Start_timer:
Timer_flag = 1

Return

Klar ich könnte den Zähler incr laufen lassen (zus.Zähler vewenden ) dann -1 machen...
 
Hallo Sulawesi,
genauso, wie du beim Hochzählen eine Spezialbehandlung für >59 und >23 hast, musst du beim Runterzählen eine für <0 haben. Da du aber Byte Typen benutzt, die keine Werte <0 (nur 0-255) annehmen können, kannst du auch nicht auf <0 abfragen. Da 0-1 hier 255 ergibt, könntest du es so machen:

If Sekunde = 255 Then
Sekunde = 0
Decr Minute
Else
Decr Sekunde
Endif
If Minute = 255 Then
...

Ich würde dann die Abfrage fürs Hochzählen auf

If Sekunde = 60 Then ...

ändern, weil 255 ja auch größer als 59 ist.

HBA
 
Code:
If Taster1 = 1 Then                                         'Uhr einstellen Minute
   Waitms 50
   Incr Minute
End If

If Taster2 = 1 Then                                         'Uhr einstellen Stunde
   Waitms 50
   Incr Stunde
End If

 If Sekunde > 59 Then Minute = Minute - 1
 'If Sekunde > 59 Then Sekunde = 59
 'If Minute > 59 Then Stunde = Stunde - 1
 'If Minute > 00 Then Minute = 50
 'If Stunde > 0 Then Stunde = 23

Hallo!

Ich dachte wir hätten beschlossen, dass du erst einmal die Grundlagen lernst.....
und dich erst danach wieder an KLEINE Aufgaben wagst. :hmmmm:

Warum du nicht verstehst, dass "Decr 0" = 255 ergibt liegt einfach nur daran, das dir immer noch die Grundlagen fehlen!!!

Es macht einfach keinen Sinn, dir bei diesem Problem auf die Sprünge zu helfen!
Du musst noch viel weiter vorne anfangen!

Was ist ein Bit und welche Zusatände kann es annehmen.
Was ist ein Byte und wieviele Bits passen in ein Byte.
Welcher Zahlenraum kann von einem Byte aufgenommen werden.
Was ist ein Word und....
Was ist ein Integer.....
Was ist ein Single....

Wie wird die dezimale Zahl 129 binär dargestellt.
Wieviele Bits benötigst du um die dezimale Zahl 63 darstellen zu können.
Gleiches gilt für das hexadezimale System!

Wenn diese Dinge klar sind musst du dir die AVR`s mal von "innen" ansehen.
Nein, natürlich mit Hammer und Bohrmaschine. ;)
Nimm z.B. das Datenblatt eines ATMega8.
Schau dort hinein und versuche Teile davon zu verstehen.
Was bedeuten ALLE Pinbezeichnungen und wofür sind sie gedacht?
Welche Timer gibt es und wie breit sind sie?
Welche Spannungen kann man verwenden und was muss man dabei berücksichtigen?
Die ganzen Register kannst du ja erst mal weglassen!

Wenn das soweit verstanden wurde..... und ich prüfe das in Echtzeit im Chat nach .....kannst du den ersten kleinen Aufbau realisieren.
Steckbrett (pack das Pollin-Eva-Board bloß an die Seite !), ATMega8, Spannungsversorgung, ISP-Stecker, Programmer, 3 LED`s, 3Taster.

Wenn das alles richtig aufgebaut ist, kannst du mit den Programmierübungen beginnen!
ABER keine Uhr bauen, oder sonstiges!!!

Erst mal.......
FUSES verstehen und bearbeiten!

Pin und Port bestimmen.

Dann meint wegen:
LED`s automatisch ein und ausschalten lassen.
LED`s abwechselnd blinken lassen.
LED-Lauflicht bauen.
Dann kommen die Taster hinzu.

Und so weiter und so fort....


Je nach Fortschritt kommst du dann dieses Jahr noch bei der Uhr an, oder eben erst nächstes Jahr. :cool:
Allerdings..... OHNE diese Grundlagen wird es mehr als schwer werden, jemals ein vernünftiges Programm zum laufen zu bekommen.

Ich (und einige Andere auch) habe(n) kein Problem damit dir dabei zu helfen, es richtig zu lernen und zu verstehen!
ABER, wenn du anfängst vorzugreifen und irgendwas anderes zu programmieren als du solltest, ist der Spaß (zumindest bei mir) sofort aus!

Du kannst es selbst entscheiden!
Musst dich aber nicht genötigt fühlen!
Wenn du keine Lust dazu hast, ist das kein Thema! Ich bin bestimmt nicht sauer. Allerdings erwarte dann auch keine Infos oder Antworten mehr von mir zu deinen Problemen.

Du hast die Wahl! ;)

Gruß,
Cassio

PS:
Ein Bit reicht zur Antwort vollkommen aus. :)
 
Na gut...wenn ihr die Meinung seid, daß ich eine LED ein und ausschalten muss, dann ist es OK...

klaro was man bisher hinbekommen hat war Zufall , nochmal Danke aber für Eure Hilfe..und klar ich kenne die Fuse Bits auch nicht, immerhin habe schon ein Atmega verfust ...

und weiss ich auch nicht wie man mit einem Taster ein Flag setzt..

und die anderen Vorschläge fürs Boardleben waren auch Käse...

dann bin ich nicht der richtige fürs Board sorry...

Alle anderen haben wahrscheinlich mit einfacheren Sachen angefangen..Bischen habe ich mal in anderen Boards auchmal eingelesen..
 
Hi !

Generell ist gegen die Entwicklungsboards (auch das von Pollin) nichts einzuwenden.

Allerdings halte ich diese "Dinger" für einen Anfänger für ungeeignet!
Selbst ich arbeite immer noch mit ganz einfachen "Steckbrettern".
Hier mal ein aktuelles Beispeil:
4543_1.jpg

Natürlich hätte ein Eva-Board für mich auch seinen Reiz, aber das ist inzwischen ein anderes Thema.

Der Vorteil bei den Streckbrettern ist, dass du immer wieder alles selbst machen musst. Also auch die Spannungsversorgung, Resetbeschaltung, evtl. Systemquarz und so weiter.
Das übt ungemein und du mekrst dir auch schneller die Belegung.... und die Eigenschaften des Controllers.

Hast du denn solche Steckbretter?
Hast du eigentlich einen separaten Programmer?

Grüße,
Cassio
 
Allerdings erwarte dann auch keine Infos oder Antworten mehr von mir zu deinen Problemen.

Dann werde ich mich selber mit meinen Problemen selber beschäftigen oder googlen..werde schon irgendwann ein Beispiel finden, wo ich sehen kann wie es funktioniert..Sorry daß ich mit "dummen" Fragen belästigt habe und nicht gefragt habe wie man ein LED ein oder ausschaltet. Die Fragen habe ich mir gespart weil die Antworten würden heissen, kaufe Dir irgendein Buch...( habe auch )

Ja ich habe ein Steckbrett schon lange...aber es ist bequemer direkt übers Pollin zu arbeiten, was ich von Anfang an gemacht habe, aber ist ja nichts für Anfänger....

Habe sehr viel mit CMOS gemacht...aber gehört hier nicht zum Thema
 
Hi !

Nö, belästigt hast du uns nicht und eine Antwort hast du doch auch immer bekommen.

Ich habe schon ein paar mal geschrieben, dass ich deine Leistung für ein erstes Programm enorm finde... auch wenn es nicht alles aus deiner Feder kam.

In laufe der Zeit haben wir aber festgestellt, dass du wirklich erst mal die GRUNDLAGEN erlenen musst!
Dem hast du auch zugestimmt!

Nun fängst du schon wieder mit Timer und Subroutinen an...... :hmmmm:
Außerdem nutzt du dein altes Programm als Grundlage und DAS ist der falsche weg!

Wie etwas funtioniert und worauf du achten musst, um eine solide Basis zu bekommen, können wir hier gern gemeinsam ermitteln.
Aber ich baue nicht an einem Haus mit, dass absolut kein Fundament hat!

Kannst du mich da verstehen?

Gruß,
Cassio
 
auch wenn es nicht alles aus deiner Feder kam.

bräuchte dann keine Hilfe

Außerdem nutzt du dein altes Programm als Grundlage und DAS ist der falsche weg!
Mir fehlt die Zeit alles komplett neu einzutippen die ich schon weiss...

Unsere Professionelle Programierer benutzen auch schon fertige "Module" an passen es an und tippen nicht jedesmal ein


Code:
Config Pind.2 = Input
   Portd.2 = 0
   Taster0 Alias Pind.2

Wenn ich unsere Software für einen Kunden konfigurieren muss, schreibe ich die Konfiguration doch nicht komplett neu !!!!!!!! Die Konfiguration sagt auch was das Programm machen soll...


Habe den Vorschlag gemacht, würden evtl. andere auch mitmachen, daß man einen Kurs hier startet, aber da lag ich mit meiner Einschätzungen falsch..
 
Wenn ich unsere Software für einen Kunden konfigurieren muss, schreibe ich die Konfiguration doch nicht komplett neu !!!!!!!! Die Konfiguration sagt auch was das Programm machen soll...

Hallo !

Das mit dem Zurückgreifen auf fertige Module verstehe ich schon und ist auch völlig OK!
Dafür müssen die "Module" dann auch aber wirklich fehlerfrei und "modular" programmiert sein.

Letztlich macht man ja in BASCOM nichts anderes. ;)
Wenn ich z.B. ein LCD oder GLCD ansteuern möchte, dann bediene ich mich ja auch nur fertiger Module..... den LIB`s. :)
Trotzdem würde ich nicht behaupten, dass ich eine LIB schreiben könnte.

Ähnlich ist es bei einer SPS......
Jemand der seit Jahren perfekt in SPS-Programmierung ist, muss noch lange nicht das Basissystem der SPS oder einen Mikrocontroller programmieren können!

Es sind also zwei völlig verschiedene Paar Schuhe!

Bei dem Einen hast du schon ein fertiges System, dass du "nur noch" anpassen musst und bei dem Anderen musst du erst mal ein System schaffen.

Ich hoffe, es war soweit verständlich. :)

Wünsche einen schönen Abend,
Cassio
 
Frage

wenn jemand Lust hat, kann eine Frage beantworten, wenn Ihr schreiben wollt, daß ich Grundlagen lesen sollte, dann bitte keine Antworten.

Wie kann ich von der Logik her folgendes realisieren ?

Wenn einer Taste gedrück wird, sollte die Variable dafür 1 sein, beim erneuten drücken 0
 
Noch eine Verständnisfrage

Habe nach 3 Stunden keine Antwort in Tutorial gefunden..

Warum Stoppt der Timer nicht ?

Timer wird ganz normal gestartet:
Code:
Config Timer1 = Timer , Prescale = 256
   On Timer1 Timer_isr
   Enable Timer1
   Timer1 = 3036
   Enable Interrupts

läfut auch wenn ich Disable Timer1 mache...:confused:

Sub:
Code:
Timer_isr:
Stop Timer1
Incr Sekunde
Timer1 = 3036

Return

nach mein Verständnis kann man den Timer1 stoppen mit dem Befehl Stop Timer1...

aber die Sekunden werden trotzdem erhöht...Wo ist der Gedankenfehler ?
 
Hallo Sulawesi,

ich beobachte dich schon eine geraume Zeit. Also, so kommst du nicht wirklich weiter. (und ein Forum hast du scheinbar ja schon hinter dir;) )
Nimm es mir nicht übel, aber mir scheint, jeder entscheidende Schritt in deinem :pleasantry: Projekt :pleasantry: ist irgendwie das Werk eines Dritten.

Darum ein wirklich, wirklich gut gemeinter Rat von mir:
Fang mit Leds an. Ein Beispiel:

Bastle' dir eine 8ter Led Kette.

1. Aufgabe Leuchteffekt al'a Knight Rider
a) einmal mit forNext
b) Geschwindigkeit mit Tasten verstellbar
c) später mal mit Timer anstatt forNext
d) usw.

MERKE: Aha-effekte sind manchmal wichtiger.

Gruß GotCha
 
Hi
Nun, so langsam muß ich mal etwas dazu beisteuern...
Ein Timer kann nicht rückwärtszählen, klar. Aber das soll er auch nicht, denn der Interrupt soll rückwärtszählung durchführen. Ist nicht einfach, aber wenn eine Minute heruntergezählt wird, und ich habe 0 Minute, dann geschieht folgendes :
Minute=Minute - 1 ergibt 255 folglich ist der Wert größer 59. Das muß ausgewertet werden. Ist das der Fallwird Stunde um 1 verringert und Minute auf 59 gesetzt.
Selbiges gilt für Sekunde... Sekunde 255 dann Minute -1, nachsehen, ob Minute 255 - dann Stunde -1, Minute auf 59 und Sekunde auf 59...
Weiter. Programmteile, die ich schon fertig habe, brauche ich nicht nochmal machen. Richtig. Fertig ist hier das Zauberwort... und verstanden.

Habe den Vorschlag gemacht, würden evtl. andere auch mitmachen, daß man einen Kurs hier startet, aber da lag ich mit meiner Einschätzungen falsch..
He, und ich hab ein schlechtes Gewissen, weil ich etwas angekündigt habe und deinen Thread misbrauchte...
Außerdem, was Cassio betrieben hat, kannst du getrost als "Lehrgang" betrachten. Er hat dir wirklich viele Hilfe gegeben, das solltest du besdenken, bevor du solche Sprüche klopfst:
wenn jemand Lust hat, kann eine Frage beantworten, wenn Ihr schreiben wollt, daß ich Grundlagen lesen sollte, dann bitte keine Antworten.
Um den Tastendruck für ein Flipflop zu benutzen, brauchst du eine Flankenauswertung.
Das heißt:
altes Bit (beim letzten mal eingelesen)
Exclusiv Oder neues Bit ( jetzt eingelesen)
ergeben nur eine 1, wenn ein Wechsel erfolgt.
Nun Altes Bit exclusiv Oder Ergebnis Wechsel ergibt eine 1 wenn Wechsel von 0 nach 1 erfolgt ist.
Dieses Bit Exclusiv ruft bei einer 1 ein Unterprogramm auf wo der Ausgang mit konstant 1 verknüpft ist: dein Flipflop

Hier mal Auszug aus meiner kleinen Lektüre...
Code:
; **************************************
; *  Es wird geprüft, ob eine Änderung eines          *
; *  Einganges aufgetreten ist und das Ergebnis     *
; *  in Die Variable IO_Change_Bit eingetragen .     *
; *  Im Programm wird dieses Bit nach der             *
; * Bearbeitung gelöscht                                    *
; *  ************************************
Chk_IO_Change:
	LDS 	Temp, Neu_Input		; Register Temp mit neuem Wert laden
	LDS	Merker, old_Input		; das letzte gelesene Byte holen
	EOR	Merker, Temp		; Temp ist nicht verändert, 
	BREQ End_Chk_Change		; Merker ist 0 , wenn keine Änderung
	STS	IO_Change_Bit, Merker	; Bits ablegen, die sich geändert haben
	RCall	Chk _ToLow		;  Prüfung Wechsel von 1 nach 0
	RCall	Chk _to_High		; Prüfung Wechsel von 0 nach 1
	STS	Old_Input, Temp		; Temp wird  nicht verändert
End_Chk_Change: RET
 
So sieht's in Assembler aus... und nun RCall	Chk _to_High
; *******************************************************
; *  Prüfung, ob die Änderung von 0 nach 1  erfolgt ist und das Ergebnis    *
; *  in die Variable Change_To_ High eingetragen.  Dieses  Bit  wird           *
; *  nach der Bearbeitung für nur eine einmalige  Bearbeitung  gelöscht.     *
; *  *****************************************************
Chk_To High:
	Push	Temp				; Registerinhalte werden noch gebraucht
	Push	Merker
	LDS	Temp, neu_Input		; neue 1 und die Änderung ergeben eine 1
 	And	Merker, Temp 	
	LDS	Temp, Change_To_High	; nur Änderungen eintragen, andere Bits
	Or	Merker, Temp		; müssen ihren Wert erhalten
	STS	Change_To_High, Merker
	POP	Merker
	POP	temp
RET	

Die Flankenauswertung bringt noch weitere Vorteile. Möchte ich den Ausgang ein- und austasten mit dem selben Eingang, brauche ich bei jedem positiven oder negativen Flankenwechsel nur eine Exclusiv-Oder Verknüpfung mit dem Ausgangsbit und einer konstanten „1“.

Flip_Flop:
	LDS	Temp,  AusgabeByte	; Variablenablage Ausgabebits
	LDI	Merker, 0b00000001	; nur Bit 0 wechseln
	EOR	Merker, Temp		; Wechsel von 1 – 0 – 1 – 0 – 1 usw.
						; bei jeder positiven  Flanke
	STS	AusgabeByte, Merker	; für die Ausgaberoutine ablegen
	LDS	Temp,  Change_To_High	; Flankenbit löschen
	ANDI	Temp,0b11111110		; nur letztes bit auf 0 ändern
	STS	Change_To_High.Temp	; und wieder ablegen	
RET;
Ich weiß, Assembler ist schwer.....
Und nochmal zur Erinnerung, bettle nicht um Hilfe, in dem du die Hinweise zum Erlernen damit abtust, das das keine Hilfen sind und du selber weißt, wo man Hilfe bekommt. Einen Lehrgang hier durchzuführen ist, allein wenn nur deine Probleme betrachtet werden, fast geistges Harakiri...J etzt stell dir mal vor, 10 solche Leser.............
Gruß oldmax
 
nach mein Verständnis kann man den Timer1 stoppen mit dem Befehl Stop Timer1...

aber die Sekunden werden trotzdem erhöht...Wo ist der Gedankenfehler ?


Hallo sulawesi!

Ich denke, dein Verständnis zum Timer1 passt schon.

Die Timer können eigentlich mit :
Stop TimerX
Start TimerX
gestoppt oder gestartet werden.
Das sollte also passen.

Ich weiß jetzt aber nicht, ob ein Timer automatisch in BASCOM gestartet wird, sobald man ihn mit einem Wert vorbelegt.... also du ihm deine 3036 zuweist:
Vielleicht wird durch:
Timer1 = 3036
der Timer auch gleich wieder automatisch gestartet? :hmmmm:

Musst es einfach mal ausprobieren....
Ändere die Sub so, dass er den Wert 3036 nicht nach dem Stop-Befehl bekommt sondern erst dann, wenn du den Timer wieder starten möchtest.

Gruß,
Cassio
 
PS: Das mit dem Rückwärtszählen habe schon gelöst..kein Problem

Code:
Timer_isr:
Incr Sekunde
Timer1 = 3036
Stop Timer1
Return
Kein Stop

Code:
Timer_isr:
Stop Timer1
Incr Sekunde
Timer1 = 3036
Return
Kein Stop

Selbst mit 0 läuft weiter
Code:
Timer_isr:
Stop Timer1
Incr Sekunde
Timer1 = 0
Return
 
Hallo !

Nun, eigentlich sollte der Timer mit
Code:
Timer_isr: 
Incr Sekunde 
Timer1 = 3036 
Stop Timer1 
Return
auch stehen bleiben.

Vielleicht liegt es aber auch nicht an der Sub sondern an einer anderen Stelle im Programm....

Die Anweisung "Stop TimerX" funktioniert jedenfalls. Habe ich selber schon zig mal verwendet.


Gruß,
Cassio
 
Status
Für weitere Antworten geschlossen.

Ü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)